嵌入式学习笔记---uboot(10)

总结于朱有鹏老师的嵌入式课程,感谢朱老师

文章目录

    • uboot与linux驱动
    • mmc_initialize
      • cpu_mmc_init
        • setup_hsmmc_clock
        • setup_hsmmc_cfg_gpio
        • smdk_s3c_hsmmc_init
          • s3c_hsmmc_initialize
      • find_mmc_device
      • mmc_init

uboot与linux驱动

裸机程序中是直接操控硬件的,操作系统中必须通过驱动来操控硬件。
操作系统(指的是linux)下MMU肯定是开启的,也就是说linux驱动中肯定都使用的是虚拟地址。

uboot早期也是纯物理地址工作的,但是现在的uboot开启了MMU做了虚拟地址映射,这个东西驱动也必须考虑。查uboot中的虚拟地址映射表,发现除了0x30000000-0x3FFFFFFF映射到了0xC0000000-0xCFFFFFFF之外,其余的虚拟地址空间全是原样映射的。而我们驱动中主要是操控硬件寄存器,而S5PV210的SFR都在0xExxxxxx地址空间,因此驱动中不必考虑虚拟地址。

uboot中的硬件驱动比linux简单。linux驱动本身有更复杂的框架,需要实现更多的附带功能,而uboot本质上只是个裸机程序,uboot移植linux驱动时只是借用了linux驱动的一部分而已。

mmc_initialize

位于:uboot/drivers/mmc/mmc.c。
作用:SoC里的MMC控制器初始化(MMC系统时钟的初始化、SFR初始化)、SoC里MMC相关的GPIO的初始化、SD卡/iNand芯片的初始化。
mmc_devices链表全局变量,用来记录系统中所有已经注册的SD/iNand设备。

cpu_mmc_init

位于:uboot/cpu/s5pc11x/cpu.c

setup_hsmmc_clock

作用:初始化SoC中MMC控制器中的时钟部分

setup_hsmmc_cfg_gpio

作用:配置SoC中MMC控制器相关的GPIO

smdk_s3c_hsmmc_init

位于:uboot/drivers/mmc/s3c_hsmmc.c
内部通过宏定义USE_MMCx来决定是否调用s3c_hsmmc_initialize来进行具体的初始化操作。

s3c_hsmmc_initialize

位于:uboot/drivers/mmc/s3c_hsmmc.c
定义并且实例化一个struct mmc类型的对象,填充它的各种成员,最后调用mmc_register函数来向驱动框架注册这个mmc设备驱动。有几个SD借口就有几个该结构体实例。
mmc_register功能是进行mmc设备的注册,注册方法其实就是将当前这个struct mmc使用链表连接到mmc_devices这个全局变量中去。

find_mmc_device

位于:uboot/drivers/mmc/mmc.c
通过mmc设备编号来在系统中查找对应的mmc设备。工作原理就是通过遍历mmc_devices链表,去依次寻找系统中注册的mmc设备,然后对比其设备编号和我们当前要查找的设备编号,如果相同则就找到了要找的设备。找到了后调用mmc_init函数来初始化它。

mmc_init

位于:drivers/mmc/mmc.c
进行mmc卡的初始化,mmc_init函数内部就是依次通过向mmc卡发送命令码(CMD0、CMD2那些)来初始化SD卡/iNand内部的控制器,以达到初始化SD卡的目的。

你可能感兴趣的:(嵌入式)