分类: 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.c和davinci..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 控制器产生中断时会复位USB的BUS电源