ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2014年10月24日 星期五

usb . some codes, about force full speed connect

driver 的 data : struct ehci_hcd, 內嵌在 struct usb_hcd 裡。
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
另一個 driver 本體應該就是 socksoc_usb_driver.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 了。

沒有留言:

標籤

網誌存檔