【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 1 | Boot Area Partitions | 此分区主要是为了支持从eMMC启动系统而设计的。 |
Boot Area Partition 2 | Boot Area Partitions | |
RPMB Partition | RPMB Partition | 它通过HMAC SHA-256 和Write Counter来保证保存在RPMB内部的数据不被非法篡改。在实际应用中,RPMB分区通常用来保存安全相关的数据,例如指纹数据、安全支付相关的密钥等。 |
General Purpose Partition 1 | General Purpose Partitions | 此区域则主要用于存储系统或者用户数据。 |
General Purpose Partition 2 | General Purpose Partitions | |
General Purpose Partition 3 | General Purpose Partitions | |
General Purpose Partition 4 | General Purpose Partitions | |
User Data Area | User 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
SPI Port No Interrupt Source 77 SDMMC 76 HSMMC3 75 HSMMC2 74 HSMMC1 73 HSMMC0 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