rtl8812驱动分析(一)
来源:互联网 发布:昭大网络教育 编辑:程序博客网 时间:2024/06/06 02:23
wifi驱动的入口->os_dep/linux/usb_intf.c
insmod 8188.ko和rmmod 8188.ko时分别调用的是:
module_init(rtw_drv_entry);
module_exit(rtw_drv_halt);
所以,找到这两个函数,就分别找到了初始化和退出函数
初始化:
static int __init rtw_drv_entry(void){#ifdef CONFIG_PLATFORM_RTK_DMP u32 tmp; tmp=readl((volatile unsigned int*)0xb801a608); tmp &= 0xffffff00; tmp |= 0x55; writel(tmp,(volatile unsigned int*)0xb801a608);//write dummy register for 1055#endif#ifdef CONFIG_PLATFORM_ARM_SUNxI#ifndef CONFIG_RTL8723A int ret = 0; /* ----------get usb_wifi_usbc_num------------- */ ret = script_parser_fetch("usb_wifi_para", "usb_wifi_usbc_num", (int *)&usb_wifi_host, 64); if(ret != 0){ printk("ERR: script_parser_fetch usb_wifi_usbc_num failed\n"); ret = -ENOMEM; return ret; } printk("sw_usb_enable_hcd: usbc_num = %d\n", usb_wifi_host); sw_usb_enable_hcd(usb_wifi_host);#endif //CONFIG_RTL8723A#endif //CONFIG_PLATFORM_ARM_SUNxI#ifdef CONFIG_PLATFORM_ARM_SUN6I script_item_value_type_e type; type = script_get_item("wifi_para", "wifi_usbc_id", &item); if(SCIRPT_ITEM_VALUE_TYPE_INT != type){ printk("ERR: script_get_item wifi_usbc_id failed\n"); return -ENOMEM; } printk("sw_usb_enable_hcd: usbc_num = %d\n", item.val); wifi_pm_power(1); mdelay(10); sw_usb_enable_hcd(item.val);#endif //CONFIG_PLATFORM_ARM_SUN6I RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_entry\n")); DBG_871X(DRV_NAME " driver version=%s\n", DRIVERVERSION); DBG_871X("build time: %s %s\n", __DATE__, __TIME__);#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) //console_suspend_enabled=0;#endif rtw_suspend_lock_init(); usb_drv->drv_registered = _TRUE; return usb_register(&usb_drv->usbdrv);}
初始化函数主要做的事情:
- 打开wifi模块的电源,会根据不同的平台不同的模块进行处理;
- 初始化挂起锁,这个后边再分析,猜是防止多线程同时挂起模块时会引起模块问题;
- 驱动注册标志位置1;
- 注册usb驱动,因为我们的模块接口是USB接口的,所以对系统来说其实就是个USB设备,自然要注册usb驱动。
接着,我们来重点看一下这个注册的usb驱动:
#ifdef CONFIG_RTL8192Cstatic struct usb_device_id rtl8192c_usb_id_tbl[] ={ RTL8192C_USB_IDS {} /* Terminating entry */};struct rtw_usb_drv rtl8192c_usb_drv = { .usbdrv.name = (char*)"rtl8192cu", .usbdrv.probe = rtw_drv_init, .usbdrv.disconnect = rtw_dev_remove, .usbdrv.id_table = rtl8192c_usb_id_tbl, .usbdrv.suspend = rtw_suspend, .usbdrv.resume = rtw_resume, #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22)) .usbdrv.reset_resume = rtw_resume, #endif #ifdef CONFIG_AUTOSUSPEND .usbdrv.supports_autosuspend = 1, #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown, #else .usbdrv.driver.shutdown = rtw_dev_shutdown, #endif};static struct rtw_usb_drv *usb_drv = &rtl8192c_usb_drv;#endif /* CONFIG_RTL8192C */
我们的模块是8812CUS,但是不知道为何是8192c的配置选项?留着疑问,后边解决。
注册的usb驱动中主要提供的接口如下:
- probe探测函数
- disconnet函数
- idtable列表,表示支持的设备的PIDVID信息
- 挂起和唤醒函数
在idtables中我们可以看到 RTL8192C_USB_IDS的定义,找到它,我们发现,我们的8812CUS模块也在其中(通过查看PID和VID发现我们的模块型号为PID8176,即列表中的第二行):
#define RTL8192C_USB_IDS \ /*=== Realtek demoboard ===*/ \ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8191)},/* Default ID */ \ /****** 8188CUS ********/ \ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8176)},/* 8188cu 1*1 dongole */ \ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8170)},/* 8188CE-VAU USB minCard */ \ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817E)},/* 8188CE-VAU USB minCard */ \ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817A)},/* 8188cu Slim Solo */ \
这个驱动insmod后,注册到USB驱动链上,当usb设备接入,由usb子系统枚举后,获取设备的描述符,最后通过描述符中的PID和VID信息为其匹配驱动,通过遍历usb驱动链上的id列表的方式找到支持该设备的驱动,最后在这个列表中找到匹配,并将设备和这个驱动绑定。
后续继续分析wifi驱动的probe的过程,以及一些内核线程的创建过程。
0 0
- rtl8812驱动分析(一)
- rtl8812驱动分析(二)
- USB驱动分析(一)
- USB驱动分析(一)
- QXL驱动分析(一)
- QXL驱动分析(一)
- OTG驱动分析(一)
- USB驱动分析(一)
- QXL驱动分析(一)
- LCD驱动分析(一)
- NAND驱动分析--(一)
- alsa驱动源码分析(一)
- Linux I2C驱动完全分析(一)
- Linux I2C驱动源码分析(一)
- dm9000a驱动源码分析(一)
- Linux I2C驱动源码分析(一)
- Linux USB驱动框架分析(一)
- android binder驱动源码分析(一)
- 胜者树和败者树的图解
- JS闭包详解
- ActiveMQ学习笔记(1)——JMS的概念
- JS模块化编程
- 架构师速成6-初中
- rtl8812驱动分析(一)
- java泛型中extends 和 super的区别
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第七课: Cocos2D-X引擎框架2
- Java基础 管道流 RandomAccessFile DataStream ByteArrayStream 字符编码
- 安卓学习笔记之activity生命周期
- c语言-Basic
- kettle学习笔记(一)
- Java并发编程-29-非阻塞式线程安全列表-ConcurrentLinkedDeque
- Android开发_获取手机屏幕的尺寸