sd卡驱动在linux 2.6.24上的实现简易心得
2009-07-15 10:17
155 查看
整理sd卡驱动在linux 2.6.24上的实现简易心得
1.mmc_rescan 当GPIO8发生sd卡插入动作后,进入pxamci_detect_irq()中断,进而触发mmc_rescan检卡work queue工作队列
2.对于sdio设备 host->bus_ops = mmc_sdio_ops;
对于sd设备 host->bus_ops = mmc_sd_ops;
对于mmc设备 host->bus_ops = mmc_ops;
如果检测到插入sd口的设备不是上述3种设备,那么这次mmc_rescan将不能建立任何设备,关闭sd口电源,之后退出.
如果检测到的是sdio设备,那么card将被放到mmc_bus_type总线,同时sdio_funcs会被放到sdio_bus_type总线上,去匹配sido_func驱动
如果检测到的是sd设备,那么card将被放到mmc_bus_type总线,去匹配mmc_bus_type总线上的mmc驱动
如果检测到的是mmc设备,那么card也和sd设备一样将被放到mmc_bus_type总线上.
只有host不会挂载到总线上,插入的sd设备是一定会被登记到mmc_bus_type总线上,如果是sdio设备,那么同时sdio设备的sdio_funcs会被放到sdio_bus_type总线上,去匹配sido_func驱动
3.当host发送完数据之后,命令完成之后,以及sdio_int中断上来之后,cpu会触发pxamci_irq,去集中处理
4.对于主host控制器的同一读写函数为
mmc_host->ops = pxamci_ops
static const struct mmc_host_ops pxamci_ops = {
.request = pxamci_request,
.get_ro = pxamci_get_ro,
.set_ios = pxamci_set_ios,
.enable_sdio_irq= pxamci_enable_sdio_irq,
};
ps:
因
为mmc主控制器只有一个,被众多驱动和设备共享,同时对于同一设备,因为数据发送是异步进行的,所以当前如果需要发送数据,那么之前的数据可能因为还没
有发送完成,而仍然占用着mmc主控制器的物理寄存器,所以为了保证对物理设备的唯一共享,不扰乱物理通道上的数据序列,驱动中使用
mmc_claim_host(host);来得知,当前mmc控制器是否被占用,当前mmc控制器如果被占用,那么host->claimed
=
1;否则为0,如果为1,那么会在for(;;)循环中调用schedule切换出自己,当占用mmc控制器的操作完成之后,执行
mmc_release_host()的时候,会激活登记到等待队列&host->wq中的其他程序获得mmc主控制器的物理使用权
[gliethttp_20080630].
ps1:
不过在pxamci_irq实际中断处理过程中,也就是cmd,data等传输完毕
之后,都是会调用pxamci_finish_request()来wake_up唤醒阻塞等待的mmc_wait_done()回调函数,这也是命令执
行函数mmc_wait_for_cmd()使用的阻塞等待当前命令结束的方法,之所以这样,是因为有些操作需要驱动去直接操作mmc控制器的寄存器,如
果不这样作,就有可能和正在传输中的data中断发生数据和cmd等的命令冲突,这样就使得mmc主控制器上的数据发生混乱,这是绝对不允许的,所以就只
能使用这种阻塞方式,来一个一个的完成操作,肯定是不能并行的搞[gliethttp_20080630].
1.mmc_rescan 当GPIO8发生sd卡插入动作后,进入pxamci_detect_irq()中断,进而触发mmc_rescan检卡work queue工作队列
2.对于sdio设备 host->bus_ops = mmc_sdio_ops;
对于sd设备 host->bus_ops = mmc_sd_ops;
对于mmc设备 host->bus_ops = mmc_ops;
如果检测到插入sd口的设备不是上述3种设备,那么这次mmc_rescan将不能建立任何设备,关闭sd口电源,之后退出.
如果检测到的是sdio设备,那么card将被放到mmc_bus_type总线,同时sdio_funcs会被放到sdio_bus_type总线上,去匹配sido_func驱动
如果检测到的是sd设备,那么card将被放到mmc_bus_type总线,去匹配mmc_bus_type总线上的mmc驱动
如果检测到的是mmc设备,那么card也和sd设备一样将被放到mmc_bus_type总线上.
只有host不会挂载到总线上,插入的sd设备是一定会被登记到mmc_bus_type总线上,如果是sdio设备,那么同时sdio设备的sdio_funcs会被放到sdio_bus_type总线上,去匹配sido_func驱动
3.当host发送完数据之后,命令完成之后,以及sdio_int中断上来之后,cpu会触发pxamci_irq,去集中处理
4.对于主host控制器的同一读写函数为
mmc_host->ops = pxamci_ops
static const struct mmc_host_ops pxamci_ops = {
.request = pxamci_request,
.get_ro = pxamci_get_ro,
.set_ios = pxamci_set_ios,
.enable_sdio_irq= pxamci_enable_sdio_irq,
};
ps:
因
为mmc主控制器只有一个,被众多驱动和设备共享,同时对于同一设备,因为数据发送是异步进行的,所以当前如果需要发送数据,那么之前的数据可能因为还没
有发送完成,而仍然占用着mmc主控制器的物理寄存器,所以为了保证对物理设备的唯一共享,不扰乱物理通道上的数据序列,驱动中使用
mmc_claim_host(host);来得知,当前mmc控制器是否被占用,当前mmc控制器如果被占用,那么host->claimed
=
1;否则为0,如果为1,那么会在for(;;)循环中调用schedule切换出自己,当占用mmc控制器的操作完成之后,执行
mmc_release_host()的时候,会激活登记到等待队列&host->wq中的其他程序获得mmc主控制器的物理使用权
[gliethttp_20080630].
ps1:
不过在pxamci_irq实际中断处理过程中,也就是cmd,data等传输完毕
之后,都是会调用pxamci_finish_request()来wake_up唤醒阻塞等待的mmc_wait_done()回调函数,这也是命令执
行函数mmc_wait_for_cmd()使用的阻塞等待当前命令结束的方法,之所以这样,是因为有些操作需要驱动去直接操作mmc控制器的寄存器,如
果不这样作,就有可能和正在传输中的data中断发生数据和cmd等的命令冲突,这样就使得mmc主控制器上的数据发生混乱,这是绝对不允许的,所以就只
能使用这种阻塞方式,来一个一个的完成操作,肯定是不能并行的搞[gliethttp_20080630].
相关文章推荐
- sd卡驱动在linux 2.6.24上的实现简易心得 及 好的url地址
- sd卡驱动在linux 2.6.24上的实现
- ARM Linux S3C2440之ADC驱动实现
- Linux安装无线网卡驱动,实现Linux无线上网
- Linux安装无线网卡驱动,实现Linux无线上网 推荐
- Linux驱动学习5(详细分析字符设备驱动信号量实现互斥)
- linux 高级字符设备驱动 ioctl操作介绍 例程分析实现
- zynq的自定义IP的驱动(带中断)怎么写?(petalinux实现方式)
- 在Linux下实现简易进度条
- linux2.6驱动编程第一例:hello,world的实现步骤
- Linux2.6.32驱动笔记(4)ioctl方法解析及mini2440-led驱动实现
- linux环境下使用vim实现简易进度条代码
- FS4412开发板使用Linux IIO驱动框架实现ADC驱动
- 2、Linux下实现按键驱动的几种方式
- 目录重定向的源代码工程( linux平台利用VFS实现目录重定向驱动)虚拟磁盘MINIPORT驱动代码(雨中风华)
- 详解linux 驱动编写(sd卡驱动)
- linux设备驱动归纳总结(三):5.阻塞型IO实现
- Linux下I2C设备驱动开发和实现
- 基于S3C2410的SD卡linux驱动工作原理(二)
- Linux下I2C设备驱动开发和实现