spi模式sd卡的linux设备驱动移植

1、spi模式的sd卡linux设备驱动涉及两个驱动,一个spi总线的驱动,另一个是sd卡的驱动。sd卡设备挂载在spi总线上并不像设备挂载在i2c总线上,i2c总线提供设备挂载需要的接口函数attach,只需要设备主动去调用attach就可以挂载上去,而对于spi总线设备,它的挂载方式不是主动去挂载,而是采用和platform虚拟总线注册设备方式相似的方法。在相应的处理器架构的目录下的platform.c文件中添加一个设备信息,相当于device;在设备驱动中注册的时候去匹配挂载,即对照platform.c中设备名与驱动中的驱动名是否相同。

即在相应的platform.c中添加以下设备信息:

static struct spi_board_info ls_sb2f_spi_device[]={
{   
    .modalias   = "mmc_spi",
    .platform_data   = NULL,
    .bus_num    =0, 
    .chip_select =1, 
    .mode       =0, 
}

spi_register_board_info(ls_sb2f_spi_device, ARRAY_SIZE(ls_sb2f_spi_device));

注意:此处   .modalias的名字要与你的spi驱动名字保持相同。

2、spi总线驱动主要就是实现spi总线的传输协议,以及给设备提供传输数据需要调用的接口函数。

linux内核中,spi总线驱动实现的传输方式是将数据封装成message,每个message由多个transfer组成,由于spi总线可以实现全双工传输,因此对于所有transfer都是同时读写。内部同时提供tx_buf和rx_buf。(本人使用的spi控制器有一定的缺陷,在进行读操作时,spi控制器不能输出时钟,故需每次都先进行写操作在进行读操作才能正确地读回。具体在_spi_xfer中要对tx_buf和rx_buf进行多种判断来执行只写操作,读写操作和只读操作。)所以作为一个挂载在spi总线上的从设备,需要做的事情就是将自己要传输的数据封装成message,调用spi传输函数传输数据。

3、spi总线驱动就是spi控制器驱动,关键在于spi_master结构体。还有两个关键的结构体就是spi_device和spi_driver。spi_device表示spi从设备,就是在platform.c中注册的设备,spi_driver就是要和spi_device匹配的从设备驱动。

4、对于sd卡,驱动在driver/mmc目录下。这个是内核提供的对于mmc卡的标准驱动,包括sd卡。

mmc目录下有3个目录:

card层

主要是按照linux块设备驱动的框架实现一个卡的块设备驱动。这里的block.c中我们可以看到写一个块设备驱动程序时需要的block_device_operations结构体变量的定义,其中有open/release/request函数的实现。而queue.c则是对内核提供的请求队列的封装。

core层

core层封装了mmc/sd卡的命令,例如存储卡的识别、初始化和读写阶段的命令。core.c文件是由sd.c、mmc.c两个文件支撑的,core.c把mmc卡、sd卡的共性抽象出来,它们分别由sd.c和sd_ops、mmc.c和mmc_ops.c来完成。sd卡的mmc_rescan函数在core.c中实现。

host层

host层则是依赖于不同的平台的。比如s3c2410的卡控制器和atmel的卡控制器必定是不一样的。所以要针对不同的控制器来实现。(我在porting时主要将mmc_spi.c中的函数改在了我的平台下面。)

5、mmc驱动3层结构的调用方向为:

card-->core-->host

最上层card实现block块设备的主要操作,发出请求队列,然后调用core层,core层再调用host层的具体针对不同控制器的请求函数,host层的请求函数则是调用spi总线中的传输函数进行数据的传输。

6、mmc驱动的注册方向则是从下往上注册,最后card层注册block设备到内核。

7、驱动人员主要是修改host层的内容。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值