usbcore之usb_hub_init(1)

本文详细解析了Linux内核中USB HUB驱动的初始化过程,包括`usb_hub_init`函数的执行流程,`usb_register_driver`的内部机制,以及如何在sysfs中创建相关属性文件。通过对`hub_driver`结构体的设置,驱动被成功注册到USB总线,随后启动守护线程`khubd`。
hub驱动定义如下

static struct usb_driver hub_driver = {
	.name =		"hub",
	.probe =	hub_probe,
	.disconnect =	hub_disconnect,
	.suspend =	hub_suspend,
	.resume =	hub_resume,
	.reset_resume =	hub_reset_resume,
	.pre_reset =	hub_pre_reset,
	.post_reset =	hub_post_reset,
	.unlocked_ioctl = hub_ioctl,
	.id_table =	hub_id_table,
	.supports_autosuspend =	1,
};


int usb_hub_init(void)
{
	if (usb_register(&hub_driver) < 0) {
		printk(KERN_ERR "%s: can't register hub driver\n",
			usbcore_name);
		return -1;
	}

	khubd_task = kthread_run(hub_thread, NULL, "khubd");
	if (!IS_ERR(khubd_task))
		return 0;

	/* Fall through if kernel_thread failed */
	usb_deregister(&hub_driver);
	printk(KERN_ERR "%s: can't start khubd\n", usbcore_name);

	return -1;
}




static inline int usb_register(struct usb_driver *driver)
{
	return usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME);
}




int usb_register_driver(struct usb_driver *new_driver, struct module *owner,
			const char *mod_name)
{
	int retval = 0;

	if (usb_disabled())
		return -ENODEV;

	new_driver->drvwrap.for_devices = 0;
	new_driver->drvwrap.driver.name = (char *) new_driver->name;
	new_driver->drvwrap.driver.bus = &usb_bus_type;
	new_driver->drvwrap.driver.probe = usb_probe_interface;
	new_driver->drvwrap.driver.remove = usb_unbind_int
根据您的建议之后,我发现我的程序可以枚举成功低速设备了,但是全速设备无法枚举成功。 ///////////////////////////////////////////////////////////////// // 文件说明:本文件实现USBhub的类描述 // by jinyh 2025-2-11 //////////////////////////////////////////////////////////////// #include "hubclass.h" #include "hubctrl.h" #include "usb_host_core.h" #include "usb_host_stdreq.h" #include "usb_host_ctrltrans.h" #include "usb_host_cfgch.h" #include "usb_host_driver.h" #include "usb_host_user.h" DESCRIPTOR_HUB_DESC_T myHubDesc; //hub描述符,本工程中只有唯一的一个hub HUB_Machine_TypeDef myHUB_Machine; // Hub的操作结构体 extern __USB_ALIGN_BEGIN USBH_HOST usb_app_host; // 连接一个设备, extern __USB_ALIGN_BEGIN USBH_HOST usb_child_host[5]; // 如何是hub的话,则连接最多4个设备。 //function //void usb_hub_dev_process(usb_core_instance *pdev, USBH_HOST *phost); extern HOST_STATUS usb_host_enumprocess(usb_core_instance *pdev, USBH_HOST *phost); // 跟应用相关,照猫画虎写一写 2025-1-22 static HOST_STATUS usb_host_hub_init(usb_core_instance *pdev, void *phost); void usb_host_hub_deinit(usb_core_instance *pdev,void *phost); static HOST_STATUS usb_host_hub_classreq(usb_core_instance *pdev, void *phost); static HOST_STATUS usb_host_hub_process(usb_core_instance *pdev, void *phost); usb_host_class_callback_func USBH_hub_cb = { usb_host_hub_init, usb_host_hub_deinit, usb_host_hub_classreq, usb_host_hub_process }; static HOST_STATUS usb_host_hub_init(usb_core_instance *pdev, void *phost) { // hub 初始化,已经枚举结束 USBH_HOST *pphost = phost; myHUB_Machine.hub_reqState=HUB_GET_DESC_REQUEST; // 控制hub的req状态为HUB_GET_DESC_REQUEST myHUB_Machine.hub_process_state=HUB_GET_PORT_STATUS; // 默认是读取端口状态 HOST_STATUS status = HSTATUS_BUSY ; if (pphost->device_prop.devitfdesc[0].bInterfaceClass == USB_HUB_CLASS) { myHUB_Machine.dev_addr=pphost->device_prop.devaddr; myHUB_Machine.int_ep_addr = pphost->device_prop.devepdesc[0][0].bEndpointAddress; myHUB_Machine.poll_interval = pphost->device_prop.devepdesc[0]
04-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值