MTK USB full controller 控制器 驱动 加载 及 设备插入识别流程
### MTK USB Full Controller 驱动加载及设备插入识别流程 #### 一、MTK USB Full Controller 驱动加载 MTK USB Full Speed Controller 驱动是MTK平台用于支持USB功能的关键组件之一。它负责初始化硬件、设置各种参数以及处理USB设备的连接与断开等操作。下面我们将详细介绍MTK USB Full Controller 驱动的加载过程。 ##### 1. 驱动位置 MTK USB全速控制器驱动主要位于以下路径: ``` kernel-3.18/drivers/misc/mediatek/usb11/ ``` 该目录包含了驱动程序的主要实现文件,其中最重要的文件之一是`musbfsh_host.c`,这是MTK USB Full Speed Controller 驱动的核心文件。 ##### 2. hc_driver 结构体定义 在`musbfsh_host.c`中,定义了一个名为`musbfsh_hc_driver`的结构体变量。该结构体是USB Host Controller Driver 的一部分,包含了驱动程序的各种回调函数指针。具体结构如下: ```c struct hc_driver musbfsh_hc_driver = { .description = "musbfsh-hcd", .product_desc = "MUSBFSH HCD host driver", .hcd_priv_size = sizeof(struct musbfsh), .flags = HCD_USB2 | HCD_MEMORY, .start = musbfsh_h_start, .stop = musbfsh_h_stop, .get_frame_number = musbfsh_h_get_frame_number, .urb_enqueue = musbfsh_urb_enqueue, .urb_dequeue = musbfsh_urb_dequeue, .endpoint_disable = musbfsh_h_disable, .hub_status_data = musbfsh_hub_status_data, .hub_control = musbfsh_hub_control, .bus_suspend = musbfsh_bus_suspend, .bus_resume = musbfsh_bus_resume, }; ``` 此结构体定义了多种操作函数,例如`start`用于启动控制器,`stop`用于停止控制器,`urb_enqueue`和`urb_dequeue`分别用于URB(USB Request Block)的入队和出队操作。 ##### 3. 加载过程 MTK USB Full Controller 的加载过程主要通过以下步骤完成: 1. **加载入口**:在`mt8163/musbfsh_core.c`文件中的`musbfsh_init()`函数中开始驱动加载过程。 ```c static int __init musbfsh_init(void) { if (usb_disabled()) /* based on the config variable. */ return 0; usb11_init(); return platform_driver_register(&musbfsh_driver); } late_initcall_sync(musbfsh_init); ``` 2. **注册平台驱动**:通过`platform_driver_register()`函数注册平台驱动,并调用`usb11_init()`函数进一步初始化。 3. **usb11_init()函数**:此函数位于`mt8163/musbfsh_mt65xx.c`中,它会调用`platform_driver_register()`来注册`mt_usb11_driver`。 ```c --》platform_driver_register(&mt_usb11_driver); static struct platform_driver mt_usb11_driver = { .remove = __exit_p(mt_usb_remove), .probe = mt_usb11_probe, .driver = { .name = "mt_usb11", #ifdef CONFIG_OF .of_match_table = apusb_of_ids, #endif }, }; ``` 4. **probe 函数调用**:当平台设备被检测到时,`mt_usb11_probe()`函数会被调用。在这个函数中,通过`platform_device_alloc()`创建一个平台设备实例,并调用`musbfsh_probe()`函数。 ```c musbfsh = platform_device_alloc("musbfsh-hdrc", musbfshid); ``` 5. **musbfsh_probe()函数**:在此函数中执行USB控制器的初始化工作,包括设置GPIO等。 ```c static int __init musbfsh_probe(struct platform_device *pdev) { // 这个probe就是USB全速控制的加载前的probe函数,我们的好多GPIO控制都在这里 musb_init_controller(dev, irq, base, (void __iomem *)pbase); } ``` 6. **musb_init_controller()函数**:该函数主要进行控制器的初始化,包括分配hcd(Host Controller Driver)实例以及添加hcd到系统中。 ```c musbfsh = allocate_instance(dev, plat->config, ctrl); // 申请hcd hcd = musbfsh_to_hcd(musbfsh); status = usb_add_hcd(musbfsh_to_hcd(musbfsh), -1, 0); // 加载hcd ``` 7. **allocate_instance()函数**:在该函数中分配hcd实例。 ```c hcd = usb_create_hcd(&musbfsh_hc_driver, dev, "musbfsh-hcd"); ``` 至此,MTK USB Full Controller 驱动的加载过程已经完成。 #### 二、设备插入识别流程 一旦驱动加载成功,接下来就需要处理USB设备的插入和识别流程。以下是具体的流程: 1. **中断检测**:当USB设备插入时,控制器会产生一个中断信号。 2. **中断处理**:中断处理函数被触发后,会检查插入的是何种类型的USB设备(如键盘、鼠标或存储设备等)。 3. **设备描述符读取**:控制器将从新插入的设备读取设备描述符,以获取设备的基本信息。 4. **配置描述符读取**:根据设备描述符的信息,读取配置描述符以确定设备的功能配置。 5. **接口描述符读取**:接着读取接口描述符,以了解设备的具体接口信息。 6. **端点描述符读取**:最后读取端点描述符,以获取数据传输相关的端点信息。 7. **设备配置**:根据以上获取的描述符信息,系统将配置USB设备,使其能够正常工作。 8. **设备枚举完成**:设备枚举完成后,系统将把USB设备添加到设备列表中,可供应用程序访问。 通过以上步骤,MTK USB Full Controller 成功完成了设备插入的识别流程。 MTK USB Full Controller 驱动的加载及设备插入识别流程涉及多个关键步骤,从驱动的初始化到设备的识别,每一步都至关重要。深入理解这些流程有助于更好地开发和维护基于MTK平台的USB相关应用。
剩余12页未读,继续阅读
- 粉丝: 0
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助