您的位置:首页 > 运维架构 > Linux

【TINY4412】LINUX移植笔记:(6)eMMC驱动

2018-01-14 21:19 483 查看

【TINY4412】LINUX移植笔记:(6)eMMC驱动

宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64

目标板[底板]: Tiny4412SDK - 1506

目标板[核心板]: Tiny4412 - 1412

LINUX内核: 4.12.0

交叉编译器: gcc-arm-none-eabi-5_4-2016q3

日期: 2017-7-13 21:09:23

作者: SY

简介

SD
卡和
eMMC
都属于存储设备。在
Nand Flash
的硬件上增加一个控制器与主机通信,减少了与主机大量的连线

SD
卡有4条数据总线,
eMMC
有8条数据总线,理论上
eMMC
具有更快的数据传输速度

参考手册
Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf


c

23 Mobile Storage Host

23.5 I/O Description


可知,使用
Xmmc0DATA[0]...Xmmc0DATA[3]
Xmmc1DATA[0]...Xmmc1DATA[3]
接口

物理基地址:
0x12550000


eMMC
分区

分区分区类型描述
Boot Area Partition 1Boot Area Partitions此分区主要是为了支持从eMMC启动系统而设计的。
Boot Area Partition 2Boot Area Partitions
RPMB PartitionRPMB Partition它通过HMAC SHA-256 和Write Counter来保证保存在RPMB内部的数据不被非法篡改。在实际应用中,RPMB分区通常用来保存安全相关的数据,例如指纹数据、安全支付相关的密钥等。
General Purpose Partition 1General Purpose Partitions此区域则主要用于存储系统或者用户数据。
General Purpose Partition 2General Purpose Partitions
General Purpose Partition 3General Purpose Partitions
General Purpose Partition 4General Purpose Partitions
User Data AreaUser Data Area此区域则主要用于存储系统和用户数据。

移植

找到
eMMC
驱动目录:
drivers\mmc\host\dw_mmc-exynos.c
,查看支持的设备列表:

static const struct of_device_id dw_mci_exynos_match[] = {
{ .compatible = "samsung,exynos4412-dw-mshc",
.data = &exynos_drv_data, },
{ .compatible = "samsung,exynos5250-dw-mshc",
.data = &exynos_drv_data, },
{ .compatible = "samsung,exynos5420-dw-mshc",
.data = &exynos_drv_data, },
{ .compatible = "samsung,exynos5420-dw-mshc-smu",
.data = &exynos_drv_data, },
{ .compatible = "samsung,exynos7-dw-mshc",
.data = &exynos_drv_data, },
{ .compatible = "samsung,exynos7-dw-mshc-smu",
.data = &exynos_drv_data, },
{},
};


查看
exynos4412
dtsi
设备树

aliases {
pinctrl0 = &pinctrl_0;
pinctrl1 = &pinctrl_1;
pinctrl2 = &pinctrl_2;
pinctrl3 = &pinctrl_3;
fimc-lite0 = &fimc_lite_0;
fimc-lite1 = &fimc_lite_1;
mshc0 = &mshc_0;
};

mshc_0: mmc@12550000 {
compatible = "samsung,exynos4412-dw-mshc";
reg = <0x12550000 0x1000>;
interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;

#address-cells = <1>;

#size-cells = <0>;

fifo-depth = <0x80>;
clocks = <&clock CLK_SDMMC4>, <&clock CLK_SCLK_MMC4>;
clock-names = "biu", "ciu";
status = "disabled";
};


这里默认已经有一份
eMMC
的设备树配置,我们需要在此基础上修改

参考其他
dts
文件
.\arch\arm\boot\dts\exynos4412-origen.dts


&mshc_0 {
pinctrl-0 = <&sd4_clk &sd4_cmd &sd4_bus4 &sd4_bus8>;
pinctrl-names = "default";
status = "okay";

num-slots = <1>;
broken-cd;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
samsung,dw-mshc-sdr-timing = <2 3>;
samsung,dw-mshc-ddr-timing = <1 2>;
bus-width = <8>;
cap-mmc-highspeed;
};


修改设备树
.\arch\arm\boot\dts\exynos4412-tiny4412.dts


&mshc_0 {
pinctrl-0 = <&sd4_clk &sd4_cmd &sd4_bus4 &sd4_bus8>;
pinctrl-names = "default";
status = "okay";

num-slots = <1>;
broken-cd;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
samsung,dw-mshc-sdr-timing = <2 3>;
samsung,dw-mshc-ddr-timing = <1 2>;
bus-width = <8>;
cap-mmc-highspeed;
};


GIC_SPI


#define GIC_SPI 0   //共享中断

#define GIC_PPI 1   //每个处理器拥有独立中断


IRQ_TYPE_XX


#define IRQ_TYPE_NONE           0   //不触发

#define IRQ_TYPE_EDGE_RISING    1   //上升沿触发

#define IRQ_TYPE_EDGE_FALLING   2   //下降沿触发

#define IRQ_TYPE_EDGE_BOTH      (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)

#define IRQ_TYPE_LEVEL_HIGH     4   //高电平触发

#define IRQ_TYPE_LEVEL_LOW      8   //低电平触发


中断源

9 Interrupt Controller
9.2 Interrupt Source
9.2.2 GIC Interrupt Table


4000
SPI Port NoInterrupt Source
77SDMMC
76HSMMC3
75HSMMC2
74HSMMC1
73HSMMC0
eMMC
使用
77
号中断源

menuconfig

Device Drivers  --->
<*> MMC/SD/SDIO card support  --->
<*>   MMC block device driver (NEW)
<*>   Synopsys DesignWare Memory Card Interface
<*>     Exynos specific extensions for Synopsys DW Memory Card Interface


测试

烧录程序

...
[    3.185078] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 52000000Hz, actual 50000000HZ div = 0)
[    3.191021] of_get_named_gpiod_flags: parsed 'gpios' property of node '/gpio_keys/key1[0]' - status (0)
[    3.191043] gpio-238 (key1): gpiod_set_debounce: missing set() or set_config() operations
[    3.191134] of_get_named_gpiod_flags: parsed 'gpios' property of node '/gpio_keys/key2[0]' - status (0)
[    3.191145] gpio-239 (key2): gpiod_set_debounce: missing set() or set_config() operations
[    3.191193] of_get_named_gpiod_flags: parsed 'gpios' property of node '/gpio_keys/key3[0]' - status (0)
[    3.191203] gpio-240 (key3): gpiod_set_debounce: missing set() or set_config() operations
[    3.191245] of_get_named_gpiod_flags: parsed 'gpios' property of node '/gpio_keys/key4[0]' - status (0)
[    3.191254] gpio-241 (key4): gpiod_set_debounce: missing set() or set_config() operations
[    3.191458] input: gpio_keys as /devices/platform/gpio_keys/input/input3
[    3.203805] s3c-rtc 10070000.rtc: setting system clock to 2000-01-01 01:37:07 UTC (946690627)
[    3.280062] mmc0: new DDR MMC card at address 0001
[    3.285333] mmcblk0: mmc0:0001 4YMD3R 3.63 GiB
[    3.289236] mmcblk0boot0: mmc0:0001 4YMD3R partition 1 4.00 MiB
[    3.295151] mmcblk0boot1: mmc0:0001 4YMD3R partition 2 4.00 MiB
[    3.301136] mmcblk0rpmb: mmc0:0001 4YMD3R partition 3 512 KiB
[    3.307227]  mmcblk0: p1 p2 p3 p4

Processing /etc/profile... Done


查看磁盘信息

[root@TINY4412:~]# fdisk -l
Disk /dev/mmcblk0: 3712 MB, 3892314112 bytes, 7602176 sectors
118784 cylinders, 4 heads, 16 sectors/track
Units: cylinders of 64 * 512 = 32768 bytes

Device       Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type
/dev/mmcblk0p1    0,1,1       1023,3,16           16     195391     195376 95.3M  b Win95 FAT32
/dev/mmcblk0p2    1023,3,16   1023,3,16       195392    2148607    1953216  953M 83 Linux
/dev/mmcblk0p3    1023,3,16   1023,3,16      2148608    4101823    1953216  953M 83 Linux
/dev/mmcblk0p4    1023,3,16   1023,3,16      4101824    7602175    3500352 1709M 83 Linux
Disk /dev/mmcblk0boot1: 4 MB, 4194304 bytes, 8192 sectors
128 cylinders, 4 heads, 16 sectors/track
Units: cylinders of 64 * 512 = 32768 bytes

Disk /dev/mmcblk0boot1 doesn't contain a valid partition table
Disk /dev/mmcblk0boot0: 4 MB, 4194304 bytes, 8192 sectors
128 cylinders, 4 heads, 16 sectors/track
Units: cylinders of 64 * 512 = 32768 bytes

Disk /dev/mmcblk0boot0 doesn't contain a valid partition table




​查看设备

[root@TINY4412:~]# ls /dev/mmcblk0
mmcblk0       mmcblk0boot1  mmcblk0p2     mmcblk0p4
mmcblk0boot0  mmcblk0p1     mmcblk0p3     mmcblk0rpmb




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: