潍坊网站建设排行,wordpress字体大小代码,个人博客网页完整代码,写的网站怎么做接口一、uboot 与 linux 驱动
1、uboot 本身是裸机程序
(1) 裸机本来是没有驱动的概念的#xff08;狭义的驱动的概念就是#xff0c;操作系统中用来具体操控硬件的那部分代码叫驱动#xff09;
(2) 裸机程序中是直接操控硬件的#xff0c;操作系统中必须通过驱动来操控硬件…一、uboot 与 linux 驱动
1、uboot 本身是裸机程序
(1) 裸机本来是没有驱动的概念的狭义的驱动的概念就是操作系统中用来具体操控硬件的那部分代码叫驱动
(2) 裸机程序中是直接操控硬件的操作系统中必须通过驱动来操控硬件。这两个有什么区别本质区别就是分层。 2、uboot 的虚拟地址对硬件操作的影响
(1) 操作系统指的是 linux下 MMU 肯定是开启的也就是说linux 驱动中肯定都使用的是虚拟地址。而纯裸机程序中根本不会开 MMU全部使用的是物理地址。这是裸机下和驱动中操控硬件的一个重要区别。
(2) uboot 早期也是纯物理地址工作的但是现在的 uboot 开启了 MMU 做了虚拟地址映射这个东西驱动也必须考虑。查 uboot 中的虚拟地址映射表发现除了 0x30000000-0x3FFFFFFF 映射到了 0xC0000000-0xCFFFFFFF 之外其余的虚拟地址空间全是原样映射的。
而我们驱动中主要是操控硬件寄存器而 S5PV210 的 SFR 都在 0xExxxxxx 地址空间属于原地址映射因此驱动中不必考虑虚拟地址。 3、uboot 借用移植了 linux 驱动
(1) linux 驱动本身做了模块化设计。linux 驱动本身和 linux 内核不是强耦合的这是 linux 驱动可以被 uboot 借用移植的关键。
(2) uboot 移植了 linux 驱动源代码。uboot 是从源代码级别去移植 linux 驱动的这就是 linux 系统的开源性。
(3) uboot 中的硬件驱动比 linux 简单。linux 驱动本身有更复杂的框架需要实现更多的附带功能而 uboot 本质上只是个裸机程序uboot 移植 linux 驱动时只是借用了 linux 驱动的一部分而已。 二、iNand/SD 驱动解析1
1、从 start_armboot 开始
(1) 驱动整体比较庞大涉及很多个文件夹下的很多文件函数更多贸然插入根本不知道看哪里。学习时必须有顺序。 2、mmc_initialize
(1) 函数位于uboot/drivers/mmc/mmc.c。 (2) 从名字可以看出这个函数的作用就是初始化开发板上 MMC 系统。MMC 系统的初始化应该包含这么几部分
SoC 里的 MMC 控制器初始化MMC 系统时钟的初始化、SFR 初始化SoC 里 MMC 相关的 GPIO 的初始化SD 卡/iNand 芯片的初始化。 (3) mmc_devices 链表是全局变量用来记录系统中所有已经注册的 SD/iNand 设备。所以向系统中插入一个 SD卡/iNand 设备则系统驱动就会向 mmc_devices 链表中插入一个数据结构来表示这个注册到系统中的设备。 3、cpu_mmc_init (1) 函数位于uboot/cpu/s5pc11x/cpu.c中。实质是通过调用 3 个函数来完成的。 (2) setup_hsmmc_clock在 uboot/cpu/s5pc11x/setup_hsmmc.c 中。看名字函数是用来初始化 SoC 中 MMC 控制器中的时钟部分的。 (2) setup_hsmmc_cfg_gpio在 uboot/cpu/s5pc11x/setup_hsmmc.c 中。看名字函数是用来配置 SoC 中 MMC 控制器相关的 GPIO 的。 三、iNand/SD 驱动解析2
1、smdk_s3c_hsmmc_init
(1) 函数位于uboot/drivers/mmc/s3c_hsmmc.c 中。 (2) 函数内部通过宏定义 USE_MMCx 来决定是否调用 s3c_hsmmc_initialize 来进行具体的初始化操作。 2、s3c_hsmmc_initialize
(1) 函数位于uboot/drivers/mmc/s3c_hsmmc.c中。 (2) 定义并且实例化一个 struct mmc 类型的对象定义了一个指针并且给指针指向有意义的内存或者说给指针分配内存然后填充它的各种成员最后调用mmc_register 函数来向驱动框架注册这个 mmc 设备驱动。 (3) mmc_register 功能是进行 mmc 设备的注册注册方法其实就是将当前这个 struct mmc 使用链表连接到 mmc_devices 这个全局变量中去。 (4) 我们在 X210 中定义了 USE_MMC0 和 USE_MMC2因此在我们的 uboot 初始化时会调用2次 s3c_hsmmc_initialize 函数传递参数分别是 0 和 2因此完成之后系统中会注册上 2 个 mmc 设备表示当前系统中有 2 个 mmc 通道在工作。 (5) 至此 cpu_mmc_init 函数分析完成。 3、find_mmc_device (1) 这个函数位于uboot/drivers/mmc/mmc.c中。 (2) 这个函数其实就是通过 mmc 设备编号来在系统中查找对应的 mmc 设备struct mmc 的对象根据上面分析系统中有 2 个编号分别是 0 和 1。 (3) 函数工作原理就是通过遍历 mmc_devices 链表去依次寻找系统中注册的 mmc 设备然后对比其设备编号和我们当前要查找的设备编号如果相同就找到了要找的设备。找到了后调用 mmc_init 函数来初始化它。 4、mmc_init
(1) 函数位于drivers/mmc/mmc.c 中。 (2) 分析猜测这个函数应该要进行 mmc 卡的初始化了前面已经进行了 SoC 端控制器的初始化。
(3) 函数的调用关系为
mmc_initmmc_go_idlemmc_send_cmdmmc_send_if_condmmc_send_cmd······具体分析可以看出mmc_init 函数内部就是依次通过向 mmc 卡发送命令码CMD0、CMD2 那些来初始化 SD卡/iNand 内部的控制器以达到初始化 SD 卡的目的。 3、总结
(1) 至此整个 MMC 系统初始化结束。
(2) 整个 MMC 系统初始化分为 2 大部分SoC 这一端的 MMC 控制器的初始化SD 卡的卡本身的初始化。前一步主要是在 cpu_mmc_init 函数中完成后一部分主要是在mmc_init 函数中完成。
(3) 整个初始化完成后去使用 SD卡/iNand 时操作方法和 mmc_init 函数中初始化 SD卡的操作一样的方式。读写 SD 卡时也是通过总线向 SD 卡发送命令、读取/写入数据来完成的。
(4) 顺着操作追下去到了 mmc_send_cmd 函数处就断了真正的向 SD 卡发送命令的硬件操作的函数找不到。这就是学习驱动的麻烦之处。 (5) struct mmc 结构体是关键。两部分初始化之间用 mmc 结构体来链接的初始化完了后对 mmc 卡的常规读写操作也是通过 mmc 结构体来链接的。 四、iNand/SD 驱动解析3
1、struct mmc
(1) **驱动的设计中有一个关键数据结构。**譬如 MMC 驱动的结构体就是 struct mmc。这些结构体中包含一些变量和一些函数指针变量用来记录驱动相关的一些属性函数指针用来记录驱动相关的操作方法。这些变量和函数指针加起来就构成了驱动。驱动就被抽象为这个结构体。
(2) 一个驱动工作时主要就分几部分驱动构建构建一个 struct mmc 然后填充它、驱动运行时调用这些函数指针指向的函数和变量。 2、分离思想
(1) 分离思想就是说在驱动中将操作方法和数据分开。
(2) 操作方法就是函数数据就是变量。 所谓操作方法和数据分离的意思就是在不同的地方来存储和管理驱动的操作方法和变量这样的优势就是驱动便于移植。 3、分层思想
(1) 分层思想是指一个整个的驱动分为好多个层次。简单理解就是驱动分为很多个源文件放在很多个文件夹中。譬如这里讲的 mmc 的驱动涉及到 drivers/mmc 下面的 2 个文件和 cpu/s5pc11x 下的好几个文件。
(2) 以 mmc 驱动为例来分析各个文件的作用 uboot/drivers/mmc/mmc.c本文件的主要内容是和 MMC 卡操作有关的方法譬如 MMC 卡设置空闲状态的、卡读写数据等。但是本文件中并没有具体的硬件操作函数操作最终指向的是 struct mmc 结构体中的函数指针这些函数指针是在驱动构建的时候和真正硬件操作的函数挂接的真正的硬件操作的函数在别的文件中。 uboot/drivers/mmc/s3c_hsmmc.c: 本文件中是 SoC 内部 MMC 控制器的硬件操作的方法譬如向 SD 卡发送命令的函数s3c_hsmmc_send_command譬如和 SD 卡读写数据的函数 s3c_hsmmc_set_ios 这些函数就是具体操作硬件的函数也就是 mmc.c 中需要的那些硬件操作函数。 这些函数在 mmc 驱动初始化构建时s3c_hsmmc_initialize 函数中和 struct mmc 挂接起来备用。 分析mmc.c 和 s3c_hsmmc.c 构成了一个分层mmc.c 中调用了 s3c_hsmmc.c 中的函数所以 mmc.c 在上层s3c_hsmmc.c 在下层。这两个分层后我们发现mmc.c 中不涉及具体硬件的操作s3c_hsmmc.c 中不涉及驱动工作时的时序操作。因此移植的时候就有好处譬如我们要把这一套 mmc 驱动移植到别的 SoC 上 mmc.c 就不用动 s3c_hsmmc.c 动就可以了譬如 SoC 没变但是 SD 卡升级了这时候只需要更换 mmc.c 不需要更换 s3c_hsmmc.c 即可。 (3) cpu/s5pc11x/ 下面还有一个 setup_hsmmc.c也和 MMC 驱动有关。但是这些代码为什么不能放到 drivers 目录下去而要放到 cpu 目录下去因为这里面的 2 个函数setup_hsmmc_clock 和 setup_hsmmc_cfg_gpio都是和 SoC 有关的初始化函数这两个函数不能放到 drivers 目录下去。
实际上如果非把这两个函数放在 uboot/drivers/mmc/s3c_hsmmc.c 文件中也凑活能说过去。 源自朱有鹏老师.