[Drivers/net/wireless/libertas/if_sdio.c]
/* sdio function device driver*/
struct sdio_driver {
char *name; //设备名
const struct sdio_device_id *id_table; //设备驱动ID
int (*probe)(struct sdio_func *, const struct sdio_device_id *);//匹配函数
void (*remove)(struct sdio_func *);
struct device_driver drv;
};
数据的接收,通过中断的方式来解决
网络设备接收数据的主要方法是由中断引发设备的中断处理函数,中断处理函数推断中断的类型,假设为接收中断。则读取接收到的数据。分配sk_buff数据结构和数据缓冲区。并将接收的数据拷贝到数据缓存区。并调用netif_rx()函数将sk_buff传递给上层协议。
搜索if_sdio_interrupt,可知道它是在if_sdio.c文件里if_sdio_probe()函数中sdio_claim_irq(func, if_sdio_interrupt) ,func->irq_handler = if_sdio_interrupt。当s3cmci_irq中断处理函数的S3C2410_SDIIMSK_sdioIRQ 中断被触发时将调用if_sdio_interrupt()函数,进行接收数据。
static void if_sdio_interrupt(struct sdio_func *func)
数据发送维护了网络传输的数据,是比较重要的调试接口,可以由此获得全部的输出数据信息。
//IP层通过dev_queue_xmit()将数据交给网络设备协议接口层,网络接口层通过netdevice中的注冊函数的数据发送函数int dev_queue_xmit(struct sk_buff *skb)
移除函数当sdio卡拔除时。驱动会调用该函数。完毕对应操作。
拔除后,首先是管脚电平发生变化,从而触发管脚中断,程序由此得到消息,执行了释放函数
如释放占有的资源。禁止func功能函数。释放host。
if_sdio_remove(struct sdio_func *func)
---->lbs_stop_card(card->priv);
lbs_remove_card(card->priv);
---->kthread_stop(priv->main_thread); //终止内核线程
lbs_free_adapter(priv);
lbs_cfg_free(priv);
free_netdev(dev);
flush_workqueue(card->workqueue); //刷新工作队列
destroy_workqueue(card->workqueue);
sdio_claim_host(func);
sdio_release_irq(func);
sdio_disable_func(func);
sdio_release_host(func);
本文介绍了基于SDIO接口协议的WiFi模块,简单阐述了SDIO总线通信原理,列举了设备驱动的注册、匹配中使用到的重点接口函数的作用,包含数据接收,发送,以及资源的释放。让用户在一些设备上使用SDIO接口协议开发时,更清晰方便的了解其工作原理和重点接口函数的使用,帮助用户提升开发效率。
更多热点文章阅读
提示:本文由电子发烧友社区发布,转载请注明以上来源。如需社区合作及入群交流,请添加微信EEFans0806,或者发邮箱liuyong@huaqiu.com。
原文标题:基于SDIO协议的WiFi模块实现指南
文章出处:【微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。
全部0条评论
快来发表一下你的评论吧 !