嵌入式之初步硬件驱动学习笔记

本文主要探讨了uboot与linux驱动的关系,uboot作为裸机程序如何操作硬件,以及uboot如何借用linux驱动。讲解了iNand/SD驱动的初始化过程,包括mmc_devices链表、mmc初始化函数的调用层次,以及关键结构struct mmc的详细内容。文章强调了驱动设计中的分离和分层思想,以及struct mmc在驱动中的核心作用。
摘要由CSDN通过智能技术生成

注:以下内容出自朱老师物联网大讲堂课件

1.uboot与linux驱动

1.1 uboot本身是裸机程序

(1)裸机本来是没有驱动的概念的(狭义的驱动的概念就是操作系统中用来具体操控硬件的那部分代码叫驱动)
(2)裸机程序中是直接操控硬件的,操作系统中必须通过驱动来操控硬件。这两个有什么区别?本质区别就是分层。

1.2 uboot的虚拟地址对硬件操作的影响

(1)操作系统(指的是linux)下MMU肯定是开启的,也就是说linux驱动中肯定都使用的是虚拟地址。而纯裸机程序中根本不会开MMU,全部使用的是物理地址。这是裸机下和驱动中操控硬件的一个重要区别。
(2)uboot早期也是纯物理地址工作的,但是现在的uboot开启了MMU做了虚拟地址映射,这个东西驱动也必须考虑。查uboot中的虚拟地址映射表,发现除了0x30000000-0x3FFFFFFF映射到了0xC0000000-0xCFFFFFFF之外,其余的虚拟地址空间全是原样映射的。而我们驱动中主要是操控硬件寄存器,而S5PV210的SFR都在0xExxxxxx地址空间,因此驱动中不必考虑虚拟地址。
虚拟地址映射可参考如下笔记1.4.15 虚拟地址映射(357~382)章节
嵌入式之uboot源码分析-启动第一阶段学习笔记

1.3 uboot借用(移植)了linux驱动

(1)linux驱动本身做了模块化设计。linux驱动本身和linux内核不是强耦合的,这是linux驱动可以被uboot借用(移植)的关键。
(2)uboot移植了linux驱动源代码。uboot是从源代码级别去移植linux驱动的,这就是linux系统的开源性。
(3)uboot中的硬件驱动比linux简单。linux驱动本身有更复杂的框架,需要实现更多的附带功能,而uboot本质上只是个裸机程序,uboot移植linux驱动时只是借用了linux驱动的一部分而已。

2. iNand/SD驱动解析

2.1 从start_armboot开始

(1)通过uboot启动的两个阶段的梳理,我们知道第一阶段结束后跳转到了start_armboot开始执行第二阶段,我们的 iNand/SD驱动就是在这一部分进行的。
(2)驱动整体比较庞大,涉及很多个文件夹下的很多文件,函数更多,贸然插入根本不知道看哪里。学习时必须有顺序。

2.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链表中插入一个数据结构表示这个设备。

如下为重要函数的层级结构

//第一层在uboot启动第二阶段调用,在board.c中
mmc_exist = mmc_initialize(gd->bd);
	//第二层函数实际的位置在drivers\mmc\mmc.c中
	int mmc_initialize(bd_t *bis)
	board_mmc_init(bis)   				//对函数进行重命名
	cpu_mmc_init(bis)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值