Embededlinux中的MMC驱动

 一、注册平台设备

platform_device_regis     te   r(&usr_mci_device);

二、填写平台设备结构体

sta     ti   c struct platform_device usr_mci_device= {

.name          = "xxx",

.id             = 0,

.dev = {

.release     = usr_mci_platdev_release,

.     dma   _mask  = &usr_mmc_dmamask,

.coherent_dma_mask = DMA_BIT_MASK(32),

},

.num_resources    = ARRAY_SIZE(usr_mci_resources),

.resource          = usr_mci_resources,

};

三、填写资源结构体(物理地址查芯片手册)

sta  TI c struct resource usr_mci_resources[] = {

[0] = {

.start          = CONFIG_USR_IOBASE,

.end            = CONFIG_USR_IOBASE + USR_MCI_IO_SIZE - 1,

.flags          = IORESOURCE_MEM,

},

[1] = {

.start          = CONFIG_USR_INTR,

.end            = CONFIG_USR_INTR,

.flags          = IORESOURCE_IRQ,

},

};

四、注册平台驱动

platform_driver_register(&usr_mci_driver);

五、填写平台驱动结构体

sta  TI c struct platform_driver usr_mci_driver= {
.probe = usr_mci_probe,
.remove = usr_mci_remove,
.suspend = usr_mci_suspend,
.resume = usr_mci_resume,
.driver = {
.name = DRIVER_NAME,
},
};

六、重写probe函数

sta  TI c int __devinit usr_mci_probe(struct platform_device *pdev)

七、创建一个自己的设备结构体

struct usr_host {
struct mmc_host *mmc;
s     pi   nlock_t lock;
struct mmc_request *mrq;
struct mmc_command *cmd;
struct mmc_data *data;
void __iomem *base;
unsigned int card_status;
struct scatterlist *dma_sg;
unsigned int dma_sg_num;
unsigned int dma_alloc_size;
unsigned int dma_dir;
dma_addr_t dma_     pad   dr;
unsigned int *dma_vaddr;
struct  TI mer_list timer;
unsigned int irq;
unsigned int irq_status;
unsigned int is_tuning;
w     ai   t_queue_head_t intr_wait;
unsigned long pending_events;
unsigned int id;

};

struct usr_host *host;

八、分配一个包含了mmc_host的自定义结构体(core需要)

struct mmc_host *mmc;

mmc = mmc_alloc_host(sizeof(struct usr_host), &pdev->dev);

九、初始化mmc_host结构体

mmc->ops

mmc->f_     mi   n

mmc->f_max

mmc->caps

mmc->max_blk_count

mmc->max_segs

mmc->max_seg_size

mmc->max_req_size

mmc->ocr_avail

mmc->ocr

十、初始化usr_host

host=mmc->private;

host->dma_vaddr = dma_alloc_coherent(&pdev->dev, PAGE_SIZE,&host->dma_paddr, GFP_KERNEL);

host->mmc = mmc;

host->id

host->base

十一、初始化     SDI   O的     时钟   、驱动能力

十二、SDIO复位

十三、SDIO重上电

十四、设置时钟相位

十五、设置阈值

十六、设置中断状态

十七、设置中断屏蔽

十八、设置DMA搬移数据

十九、设置全局中断使能

二十、设置FIFO突发长度与FIFO大小

二十一、卡检测

二十二、初始化     定时器   ,定时处理函数为卡检测

二十三、获取资源结构体的软中断号

二十四、初始化等待队列

init_waitqueue_head(&host->intr_wait);

二十五、request_irq注册中断

二十六、写中断函数(唤醒等待队列)

static irqreturn_t usr_irq(int irq, void *dev_id)

{

wake_up(&host->intr_wait);

}



Embededlinux中的MMC驱动_设计制作_可编程逻辑
43
193
0
88

相关资讯

  1. 1、每月电量电费怎么查?用国家电网app查询电费电量!2506
  2. 2、QQ邮箱app如何设置手势密码?QQ邮箱app设置手势密码的方法976
  3. 3、迅捷PDF编辑器怎么在PDF文档中插入TXT文本?4633
  4. 4、小米笔记本怎么重装系统?小米电脑重装系统步骤图4620
  5. 5、迅雷极速版如何开启静默下载?迅雷极速版静默下载开启方法2379
  6. 6、重装系统Win10后为何要安装驱动?重装系统Win10都需要下载什么驱动4230
  7. 7、抖音打脸特效怎么拍摄拍摄抖音打脸特效的具体教程177
  8. 8、Win10电脑不停安装垃圾软件怎么办?2343
  9. 9、藏书馆如何导出笔记?藏书馆导出笔记的方法2222
  10. 10、Win10上传速度慢怎么解决?Win10上传速度慢解决图文教程872
全部评论(0)
我也有话说
0
收藏
点赞
顶部