Chinaunix首页 | 论坛 | 博客
  • 博客访问: 149202
  • 博文数量: 54
  • 博客积分: 2517
  • 博客等级: 少校
  • 技术积分: 540
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-13 18:52
文章分类
文章存档

2011年(2)

2010年(11)

2009年(41)

我的朋友

分类: LINUX

2009-09-14 13:03:06

Davinci USB控制器采用 Inventra的DUAL ROLE CONTROLLER,选中CONFIG__USB__MUSB__HDRC,可以看到在dricers/usb/musb下:

 

musb_hdrc-objs := plat_uds.o

obj-$(CONFIG_USB_MUSB_HDRC)   += musb_hdrc.o

ifeq ($(CONFIG_ARCH_DAVINCI),y)

       musb_hdrc-objs     += davinci.o

endif

ifeq ($(CONFIG_USB_MUSB_HDRC_HCD),y)

       musb_hdrc-objs            += virthub.o musb_host.o

 

主要为plat_uds.c, musb_hdrc.cdavinci..c这三个文件。

分析这三个文件,首先plat_uds.c里

MUSB_INIT的调用

subsys_initcall(musb_init);

subsys_initcall的调用是在linux/init.h的定义的

#define subsys_initcall(fn)        __define_initcall("4",fn)

 

#define __define_initcall(level,fn) \

       static initcall_t __initcall_##fn __attribute_used__ \

       __attribute__((__section__(".initcall" level ".init"))) = fn

 

Vmlds.S定义段地址:

__initcall_start = .;

                     *(.initcall1.init)

                     *(.initcall2.init)

                     *(.initcall3.init)

                     *(.initcall4.init)

                     *(.initcall5.init)

                     *(.initcall6.init)

                     *(.initcall7.init)

              __initcall_end = .;

 

do_initcalls里调用了for (call = &__initcall_start; call < &__initcall_end; call++) {

遍历执行段里所有函数

 

 

 

 

 

 

Musb_init 其实没做什么 主要是driver_register(&musb_driver)这一步注册一个device driver的驱动把 MUSB挂到platform_bus_type BUS

至于driver_register调用的是bus_add_driver这不又回到老路了 linux 的驱动模型就是这样的。

驱动调用设备的musb_probe 接着调用musb_init_controller

musb_init_controller是整个USB控制器的主要函数了,controller的初始化配置全在这了。

说道USB CONTROLLER的初始化不得不提到musb_platform_init,在看看此函数在davinci.c里定义:

musb->isr = davinci_interrupt

davinci USB 控制器产生中断时会复位USBBUS电源

 

阅读(1946) | 评论(0) | 转发(0) |
0

上一篇:Linux USB硬盘驱动框架

下一篇:phony小技巧

给主人留下些什么吧!~~