【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 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 | 4000SDMMC |
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
相关文章推荐
- 【TINY4412】LINUX移植笔记:(27)设备树LCD驱动
- 【TINY4412】LINUX移植笔记:(9)USB驱动
- 【TINY4412】LINUX移植笔记:(18)设备树BEEP驱动
- 【TINY4412】U-BOOT移植笔记:(10)EMMC驱动
- 【TINY4412】LINUX移植笔记:(20)设备树LCD背光驱动
- 【TINY4412】LINUX移植笔记:(22)设备树LCD按键驱动
- 【TINY4412】LINUX移植笔记:(23)设备树LCD触摸屏驱动
- 基于tiny4412的Linux内核移植 -- eMMC驱动移植(六)
- 【TINY4412】LINUX移植笔记:(24)设备树EEPROM驱动
- 【TINY4412】LINUX移植笔记:(13)SD卡驱动
- 【TINY4412】LINUX移植笔记:(25)设备树RTC驱动
- 【TINY4412】LINUX移植笔记:(26)设备树ADC驱动
- 【TINY4412】LINUX移植笔记:(16)eMMC启动Linux内核
- 【TINY4412】LINUX移植笔记:(8)PWM蜂鸣器
- Zynq-Linux移植学习笔记之11-qspi驱动配置
- tiny4412学习(三)之移植linux-4.x驱动(1)支持网卡驱动
- Zynq-Linux移植学习笔记之七-网络驱动
- Zynq-Linux移植学习笔记之七-网络驱动
- 【TINY4412】LINUX移植笔记:(10)USB OTG
- 【TINY4412】LINUX移植笔记:(19)设备树KEY驱动