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.c
与s3c_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.c
与s3c_hsmmc.c
的功能完全不同。mmc.c
是完全可移植的,但是s3c_hsmmc.c
就不可移植。
以上是关于u-boot硬件驱动——以SD卡为例的主要内容,如果未能解决你的问题,请参考以下文章
RK356x U-Boot研究所(驱动篇)4.1 驱动模型DM浅析(以UCLASS_DEMO为例)
你知道刷社保卡看病买药也能扫二维码支付吗?(以成都市社保卡为例)
基于tiny4412的Linux内核移植 -- SD卡驱动移植