标题:
LINUX驱动学习——内核USB驱动编写八USB的OTG驱动2(转载)(5)
[打印本页]
作者:
yuyang911220
时间:
2014-9-27 21:45
标题:
LINUX驱动学习——内核USB驱动编写八USB的OTG驱动2(转载)(5)
nt usb_otg_start(struct platform_device *pdev)
{
struct fsl_otg *p_otg; /*获得otg_transceiver结构*/
struct otg_transceiver *otg_trans = otg_get_transceiver();
struct otg_fsm *fsm;
volatile unsigned long *p;
int status;
struct resource *res;
u32 temp;
/*获得设备的私有数据*/
struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
/*使用container_of宏定义可以通过结构中一个变量的指针获得该结构首地址*/
p_otg = container_of(otg_trans, struct fsl_otg, otg);
fsm = &p_otg->fsm;
/* Initialize the state machine structure with default values */
SET_OTG_STATE(otg_trans, OTG_STATE_UNDEFINED);
fsm->transceiver = &p_otg->otg;
/* We don't require predefined MEM/IRQ resource index */
/*获得设备的资源,是在设备注册时结构体里面的内容*/
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENXIO;
/* We don't request_mem_region here to enable resource sharing
* with host/device */
/*通过资源中获得的物理地址映射一个可以被驱动访问的虚拟地址指针*/
usb_dr_regs = ioremap(res->start, sizeof(struct usb_dr_mmap));
/*将该指针保存到p_otg->dr_mem_map中*/
p_otg->dr_mem_map = (struct usb_dr_mmap *)usb_dr_regs;
pdata->regs = (void *)usb_dr_regs;
/* request irq */
/*获得设备注册时候的中断并注册,在OTG ID发生变化时触发中断,然后调用注册的中断例程函数,函数后面分析*/
p_otg->irq = platform_get_irq(pdev, 0);
status = request_irq(p_otg->irq, fsl_otg_isr,
IRQF_SHARED, driver_name, p_otg);
if (status) {
dev_dbg(p_otg->otg.dev, "can't get IRQ %d, error %d\n",
p_otg->irq, status);
iounmap(p_otg->dr_mem_map);
kfree(p_otg);
return status;
}
if (pdata->platform_init && pdata->platform_init(pdev) != 0)
return -EINVAL;
/* Export DR controller resources */
/**************************************************/
int otg_set_resources(struct resource *resources)
{
otg_resources = resources;
return 0;
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0