大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Embeded linux中的MMC驱动问题。
一、注册平台设备
platform _ device _ register(usr _ MCI _ device);
二、填写平台设备结构体
静态结构平台设备usr _ mci _ device={。名称='xxx '。id=0。dev={。release=usr _ mci _ platdev _ release。dma_mask=usr_mmc_dmamask。相干_dma_mask=DMA_BIT_MASK(32),
},num _ resources=ARRAY _ SIZE(usr _ MCI _ resources)。资源=usr_mci_resources,
};
三、填写资源结构体(物理地址查芯片手册)
静态结构资源usr _ MCI _ resources[]={ 0
[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);
五、填写平台驱动结构体
staTIc struct platform _ driver usr _ MCI _ driver={ 0。probe=usr_mci_probe。移除=usr_mci_remove。挂起=usr _ mci _挂起,恢复=usr_mci_resume。驱动程序={ 0。name=DRIVER_NAME,
},
};
六、重写调查函数
staTIc int _ _ devinit usr _ MCI _ probe(struct platform _ device * pdev)
七、创建一个自己的设备结构体
struct usr_host {
struct mmc _ host * mmc
自旋锁_t锁;
结构mmc _ request * mrq
struct mmc _ command * cmd
结构mmc _数据*数据;
void _ _ iomem * base
无符号国际卡状态
结构体散点图* dma _ sg
无符号int dma _ sg _ num
无符号int dma _ alloc _ size
无符号int dma _ dir
dma _ addr _ t dma _ paddr
无符号int * dma _ vaddr
结构TImer _ list timer
无符号整数中断请求
无符号整数irq _ status
无符号(同Internationalorganizations)国际组织是调谐(_ n)
wait _ queue _ head _ t intr _ wait
无符号长挂起事件;
无符号整数id;
};
结构usr _ host * host
八、分配一个包含了mmc _主机的自定义结构体(核心需要)
structmmc _ host * mmc
MMC=MMC _ alloc _ host(sizeof(struct usr _ host),pdev-dev);
九、初始化mmc _主机结构体
mmc-ops
mmc-f_min
mmc-f_max
MMC-cap
mmc-max_blk_count
分叶核中性白细胞
mmc-max_seg_size
mmc-max_req_size
mmc-ocr_avail
mmc-ocr
十、初始化usr _主机
主机=MMC-私有;
host-DMA _ vaddr=DMA _ alloc _ coherent(pdev-dev,PAGE_SIZE,host-dma_paddr,GFP _ KERNEL);
主机-MMC=MMC;
主机身份证明(identification)
主机基地
十一、初始化SDIO的时钟、驱动能力
十二、SDIO复位
十三、SDIO重上电
十四、设置时钟相位
十五、设置阈值
十六、设置中断状态
十七、设置中断屏蔽
十八、设置直接存储器存取搬移数据
十九、设置全局中断使能
二十、设置先进先出。比较后进先出法。比较FIFO突发长度与先进先出。比较后进先出法。比较FIFO大小
二十一、卡检测
二十二、初始化定时器,定时处理函数为卡检测
二十三、获取资源结构体的软中断号
二十四、初始化等待队列
init _ wait queue _ head(host-intr _ wait);
二十五、请求_irq注册中断
二十六、写中断函数(唤醒等待队列)
静态irqreturn_t usr_irq(int irq,void *dev_id)
{
唤醒(host-intr _ wait);
}