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

【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, },
    {},
    };
  • 查看exynos4412dtsi设备树

    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 NoInterrupt Source
    77SDMMC
    76HSMMC3
    75HSMMC2
    74HSMMC1
    73HSMMC0

    eMMC使用77号中断源

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值