usb_hcd 是在 init_host_mode( ) 時 create 出來的。
hcd = usb_create_hcd(...)compion_ports 是一個 bit variable, 每一個 bit 代表一個 port.
這個變數代表哪一個 port 歸 companion controller 管。
SET_CMF(PORTC1, reg_val, PFSC, 0x01);
這個 function 定義是:
#define SET_CMF(r, rv, c, v) rv = ((rv & ~r##_##c##_MASK) | (v << r##_##c##_OFFSET))所以上面就變成..
PORTC1_PFSC_MASK 和 PORTC1_PFSC_OFFSET 的操作。
ehci_hcd.c -- include 一堆。
其中有 :
module_init(ehci_hcd_init);所以這個大概是 driver 的本體(?)
include
- ehci-hub.c
- sucksoc_usb_hcd.c
其中的 control register table 初始話就 是在 driver probe:
rsc = platform_get_resource(pdev, IORESOURCE_MEM, 0); usbcd_db->vaddr = (u8 *)ioremap(rsc->start, (rsc->end - rsc->start + 1));
datasheet , Port Status Control Register 中,有一個 Port Force Full Speed Connect.
可以限制 在 full speed 工作。
理論上只要 set 這個 bit,並且 keep 住,就可以讓 usb controller 工作在 full-speed.
但是這個 bit 在 controller reset 後就會被 clear。
所以要注意,reset 前要 先 save bit, 完後 restore
這樣找完所有的 code, 修改掉後,就可以讓 usb controller 工作在 full speed 了。
沒有留言:
張貼留言