linux sdio总线驱动下载,Linux SDIO总线驱动

CMD53命令:

CMD52每次只能读写一个字节,因为有了CMD53对读写进行了扩展,CMD53允许每次读写多个字节或者多个块(BLOCK)。CMD53的命令格式如下:

第一位是1,为开始位,然后是一位方向位,总是1,代表方向为HOST向DEVICE设备传送,其后6位为命令号,这里是110101b,用十进制表示为53,CMD53的名字也由此而来。

然后是1位的读写标志。接着是3位功能号,这个同CMD52都是相同的。BlockMode如果1代表是块传输模式,否则为字节传输模式。

OP Code为操作位,如果是0,代表数据往固定的位置读写,如果1代表是地质增量读写。例如,对地址0固定读写16个字节,相当于16次读写的地址0,而对地址0增量读写16个字节,相当于读写0~15地址的数据。

然后是17位的地址寄存器,可以寻址到128K字节的地址,然后是9位的读写的计数,对于字节读取,读写大小就是这个计数,而对于块读写,读写的大小是计数乘以块的大小。

随后的7位为CRC校验码。最后一位为1。

当读写操作是块操作的时候,块的大小是可以通过设置FBR中的相关寄存器来设置。

同CMD52命令不同的是,CMD53没有返回的命令的,这里判断是否DEVICE设备读写完毕是需要驱动里面自己判断的,一般有2个方法,1.设置相应的读写完毕中断。如果DEVICE设备读写完毕,则对HOST设备发送中断。2.HOST设备主动查询DEVICE设备是否读写完毕,可以通过CMD命令是否有返回来判断是否DEVICE是否读写完毕。

驱动:

以SDIO为例其会采用mmc_attach_sdio来实现驱动和设备的匹配,其本质还是根据sdio_bus的匹配规则来实现匹配。在mmc_attach_sdio中首先是mmc匹配一个bus,即采用何种bus来进行mmc bus来处理host。在这里需要理解一点就是在SDIO中,对于SD卡存储器mmc为实体设备,而对于非SD卡存储器,如SDIO接口的设备,则mmc则表征为bus,这个比较重要。除了mmc bus外还存在SDIO_BUS。

int mmc_attach_sdio(struct mmc_host *host,u32 ocr)

{

interr;

inti, funcs;

structmmc_card *card;

mmc_attach_bus(host,&mmc_sdio_ops); --host匹配一条mmc bus

card= mmc_alloc_card(host, NULL); --申请一个card实体,类似于总线设备。

card->type= MMC_TYPE_SDIO;

card->sdio_funcs= funcs;

host->card= card;

for(i = 0;i < funcs;i++) {

sdio_init_func(host->card,i + 1);

}

mmc_release_host(host);

mmc_add_card(host->card);

for(i = 0;i < funcs;i++) {

sdio_add_func(host->card->sdio_func[i]);

}

return0;

}

比较难以理解的是func,这个东东其实是一个实体设备的封装,可以认为其是一个设备。

struct sdio_func *sdio_alloc_func(structmmc_card *card)

{

structsdio_func *func;

func= kzalloc(sizeof(struct sdio_func), GFP_KERNEL);

func->card= card;

device_initialize(&func->dev);

func->dev.parent= &card->dev; --很明显card设备为sdio设备的父设备。

func->dev.bus= &sdio_bus_type;

func->dev.release= sdio_release_func;

returnfunc;

}

上面的code一目了然,其就是具体设备实体的封装,其bus类型为sdio_bus. sdio_init_func仅仅是初始化一个设备,而并没有register。在sdio_add_func实现设备的register,同理就是card实体,在mmc_add_card之前并没有注册,在mmc_add_card函数中才实现设备的注册。

到此设备注册也就完成了,其实sdio总线在形式上类似于usb bus,为什么呢?编写过usb驱动的童鞋们应该知道,编写usb驱动仅仅是编写驱动的加载,并没有具体加载设备实体,导致很多童鞋的困惑,为什么没有设备的加载,其实在usb设备插入时,会动态的创建一个usb设备实体,在usb设备实体创建完成后,根据不同设备id调用相匹配的驱动。而SDIO设备设备也是一样的。上面的code比较混乱,总是让人看不出具体的设备的加载。其实在上面的code中,其中包括了mmc host的驱动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值