u-boot硬件驱动——以SD卡为例

Posted 0nism

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了u-boot硬件驱动——以SD卡为例相关的知识,希望对你有一定的参考价值。

u-boot硬件驱动——以SD卡为例

u-boot硬件驱动

一、硬件驱动

??目前,我把硬件驱动理解成介于操作系统和硬件之间的层级。主要作用是屏蔽硬件层,并且方便操作系统管理硬件。
??以SD卡为例:
??与SD初始化相关的文件uboot中有三个。分别为./drivers/mmc/mmc.c,./drivers/mmc/s3c_hsmmc.c./cpu/s5pc11x/setup_hsmmc.c
??其中mmc.cs3c_hsmmc.c共同构成了驱动层。

二、函数分析
应做事项

??在start_armboot函数中,对mmc进行了初始化。
??mmc的初始化分为三部分:

技术图片
重要结构体分析
mmc

??该结构体其实类似于class。将data与method分开处理。method采用的方法是函数指针。

struct mmc {
	struct list_head link;
	char name[32];
	void *priv;
	uint voltages;
	uint version;
	uint f_min;
	uint f_max;
	int high_capacity;
	uint bus_width;
	uint clock;
	uint card_caps;
	uint host_caps;
	uint ocr;
	uint scr[2];
	uint csd[4];
	uint cid[4];
	ushort rca;
	uint tran_speed;
	uint read_bl_len;
	uint write_bl_len;
	u32 capacity;
	struct mmc_ext_csd	ext_csd;	/* mmc v4 extended card specific */
	block_dev_desc_t block_dev;
	int (*send_cmd)(struct mmc *mmc,
			struct mmc_cmd *cmd, struct mmc_data *data);
	void (*set_ios)(struct mmc *mmc);
	int (*init)(struct mmc *mmc);
};
mmc_devices

??这是一个全局变量,是一个指针,指向mmc设备的链表。

cpu_mmc_init

??该函数位于./cpu/s5pc11x/cpu.c中,属于CPU初始化。主要做三件事,初始化SoC时钟,设置gpio,向mmc_devices中注册SD卡。

find_device

??从mmc中寻找设备,然后得到该设备的信息。

mmc_init

??主要执行以下步骤:

技术图片

??上述函数全部在./drivers/mmc/mmc.c
??这些函数利用的是mmc_send_cmd函数。该函数利用了存储在MMC设备结构体的函数指针,send_cmd。这些操作的底层函数全部在./drivers/mmc/s3c_hsmmc.c中定义。
??由此可见驱动中的分层。mmc.cs3c_hsmmc.c的功能完全不同。mmc.c是完全可移植的,但是s3c_hsmmc.c就不可移植。







以上是关于u-boot硬件驱动——以SD卡为例的主要内容,如果未能解决你的问题,请参考以下文章

RK356x U-Boot研究所(驱动篇)4.1 驱动模型DM浅析(以UCLASS_DEMO为例)

如何在esxi环境安装硬件VIB驱动

你知道刷社保卡看病买药也能扫二维码支付吗?(以成都市社保卡为例)

基于tiny4412的Linux内核移植 -- SD卡驱动移植

u-boot可不以去除对nand device的检测,只从sdcard启动?

u-boot-2014-07 代码流程分析