关于usb网络net设备g_ether.ko数据的irq中断接收

4102阅读 1评论2010-05-23 gliethttp
分类:

关于usb网络net设备g_ether.ko数据的irq中断接收
static struct platform_driver udc_driver_2410 = {
    .driver        = {
        .name    = "s3c2410-usbgadget",
        .owner    = THIS_MODULE,
    },
    .probe        = s3c2410_udc_probe,
    .remove        = s3c2410_udc_remove,
    .suspend    = s3c2410_udc_suspend,
    .resume        = s3c2410_udc_resume,
};
==> s3c2410_udc_probe
==> the_controller = udc; // 设置全局量
==> request_irq(IRQ_USBD, s3c2410_udc_irq, // irq数据处理func[luther.gliethttp]
                 IRQF_DISABLED, gadget_name, udc);
s3c2410_udc_probe
==> s3c2410_udc_irq
==> s3c2410_udc_handle_ep0
==> s3c2410_udc_handle_ep0_idle
==> dev->driver->setup(&dev->gadget, crq); // 这里dev就是request_irq中的参数udc即the_controller,这里dev->driver就是composite_driver
static struct usb_gadget_driver composite_driver下的setup方法composite_setup
composite_setup
只有当pc机向嵌入式设备的usb发出USB_REQ_SET_CONFIGURATION控制消息,
执行设备配置描述符时才会调用设置配置函数[luther.gliethttp]
set_config
==> f->set_alt(f, tmp, 0);就是geth_set_alt
看看f->set_alt什么时候注册上的
eth_driver.eth_bind
usb_add_config(cdev, ð_config_driver);
eth_config_driver.bind = eth_do_config;
eth_do_config
geth->port.func.set_alt = geth_set_alt;
==> geth_set_alt
==> gether_connect(&geth->port)
    dev->port_usb = link; // 即link = &geth->port
    alloc_requests(dev, link, qlen(dev->gadget));
    // 如下为usb网卡的in和out数据收发端点各自申请n个req,添加到dev->tx_reqs和dev->rx_reqs上,这样
    // 就保证了dev->tx_reqs和dev->rx_reqs至少有1个req存在[luther.gliethttp]
    ++==> prealloc(&dev->tx_reqs, link->in_ep, n); // 为in_ep端点申请n个req,s3c2410_ep_ops.s3c2410_udc_alloc_request
    ++==> prealloc(&dev->rx_reqs, link->out_ep, n);// 为out_ep端点申请n个req
    etif_carrier_on(dev->net);
    if (netif_running(dev->net))
        eth_start(dev, GFP_ATOMIC);
static const struct net_device_ops eth_netdev_ops = {
    .ndo_open        = eth_open,
    .ndo_stop        = eth_stop,
    .ndo_start_xmit        = eth_start_xmit,
    .ndo_change_mtu        = ueth_change_mtu,
    .ndo_set_mac_address     = eth_mac_addr,
    .ndo_validate_addr    = eth_validate_addr,
};
gether_setup
==> net->netdev_ops = ð_netdev_ops; // 设置eth网卡的ops方法集
// 然后打开usb0网卡设备时
eth_open
==> eth_start或eth_work
==> rx_fill
==> rx_submit(dev, req, gfp_flags)
==> req->complete = rx_complete; // 等待usb数据到来[luther.gliethttp]

rx_complete
==> skb->protocol = eth_type_trans(skb, dev->net);
==> netif_rx(skb);
上一篇:ubuntu 9.10上如何使用gtalk
下一篇:浅析usb网络net设备g_ether.ko驱动模块注册登记流程

文章评论