iMX51 的 USB Host Controller 幾乎跟 EHCI 一樣。
-- 可能是為了確保 sw 相容。
只有一些地方不一樣。
以 Port Status/Control Register 來看:
* Port Owner : 這本是決定 ehci 或是 companion controller 用,但是 51 沒有 companion controller ,所以這個 bit always 1
ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上
2012年8月31日 星期五
arm 的 writel( )
arm 的 writel( )
arch/arm/include/asm/io.h:
然後同一個 source file:
一樣,上面...
所以 v 是 value, c 是 address。
#define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); })
然後同一個 source file:
#define writel_relaxed(v,c) ((void)__raw_writel((__force u32) \
cpu_to_le32(v),__mem_pci(c)))
一樣,上面...
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v))
所以 v 是 value, c 是 address。
2012年8月30日 星期四
心得 -- 山寨平板
網路無法連 ,清除為原廠設定還是不行 把Ap重開才OK
網路真的是死穴,一堆平板的wifi都不好,Tf101,iconia a100都一樣,沒辦法長時間連線。,
往回
無線非常不穩,連一陣子就要手動關掉重開,不然就會卡住。
一堆Gameloftㄉㄜ˙game不能玩。
山寨版就是週邊的效能和 系統穩定問題。
這些都是試用是不出來的。
起碼要用一個禮拜才會有感覺。
但是作為媒體播放器還真是沒話說。 外接姆指碟。rmvb也都播得很順。
網路真的是死穴,一堆平板的wifi都不好,Tf101,iconia a100都一樣,沒辦法長時間連線。,
往回
無線非常不穩,連一陣子就要手動關掉重開,不然就會卡住。
一堆Gameloftㄉㄜ˙game不能玩。
山寨版就是週邊的效能和 系統穩定問題。
這些都是試用是不出來的。
起碼要用一個禮拜才會有感覺。
但是作為媒體播放器還真是沒話說。 外接姆指碟。rmvb也都播得很順。
2012年8月28日 星期二
usb : implement the "componion" attr on TDI type controller
usb 2.0 一般使用 ehci controller
一般會有一個 1.1 的 controller 叫 companion controller,跟 ehci 一起,接在 usb 末端的 TT (Tansition Transistor) 後面。
然後 programmer 可以控制這個 TT ,讓他接到 componion controller 上,就變成 1.1。
接到 ehci 上,就變成 2.0。
linux 也 follow 這個,在 usb device 的 sys filesystem 裡,實做一個 "componion" attribute file。
把數字寫進這個 componion file,該 port (--) 的 TT 就會接到 componion controll 上。
要恢復的話,就把port number 的負值寫到 componion 上 (e.g: -4),TT 就會接回 ehci controller 。
藉此,可以分別控制 各個 ehci 的速度。
但是有些 controller 把 1.0 的功能也作在 ehci 裡,同時內建 TT,這樣,就沒有 companion controller 了。 == source code 叫這種 controller 是 TDI , structure 中用 has_tt 來代表。
這樣,就沒辦法強制工作在 1.1 了。
但是,這邊有一個 patch,是利用這類 controller 的 :
強制讓 ehci 工作在 full speed,來模擬 componion 的作用。
ref : http://permalink.gmane.org/gmane.linux.usb.general/14891
一般會有一個 1.1 的 controller 叫 companion controller,跟 ehci 一起,接在 usb 末端的 TT (Tansition Transistor) 後面。
然後 programmer 可以控制這個 TT ,讓他接到 componion controller 上,就變成 1.1。
接到 ehci 上,就變成 2.0。
linux 也 follow 這個,在 usb device 的 sys filesystem 裡,實做一個 "componion" attribute file。
把數字寫進這個 componion file,該 port (--) 的 TT 就會接到 componion controll 上。
要恢復的話,就把port number 的負值寫到 componion 上 (e.g: -4),TT 就會接回 ehci controller 。
藉此,可以分別控制 各個 ehci 的速度。
但是有些 controller 把 1.0 的功能也作在 ehci 裡,同時內建 TT,這樣,就沒有 companion controller 了。 == source code 叫這種 controller 是 TDI , structure 中用 has_tt 來代表。
這樣,就沒辦法強制工作在 1.1 了。
但是,這邊有一個 patch,是利用這類 controller 的 :
+#define PORT_PFSC (1<<24) /* port force full-speed connect */
強制讓 ehci 工作在 full speed,來模擬 componion 的作用。
ref : http://permalink.gmane.org/gmane.linux.usb.general/14891
printk all out - debug console log level
不是所有的 printk 都會印到 console 上,會有 level 的限制。
系統啟動後,在 /proc/sys/kernel/printk 可以用來控制輸出的level。
這四個數值是寫在 /kernel/printk.c 中。
然後在 include/linux/kernel.h 中分別定義:
在系統啟動以後,可以:
但是如果是連 kernel boot time 都要的話,就只有改 console_printk[] 了。
把 DEFAULT_CONSOLE_LOGLEVEL 定義成 8 就可以。
系統啟動後,在 /proc/sys/kernel/printk 可以用來控制輸出的level。
$ cat /proc/sys/kernel/printk
7 4 1 7
這是說 printk level 小/等 於 7 的,才會被印到 console。這四個數值是寫在 /kernel/printk.c 中。
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel */
DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel */
MINIMUM_CONSOLE_LOGLEVEL, /* minimum_console_loglevel */
DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */
};
然後在 include/linux/kernel.h 中分別定義:
extern int console_printk[];
#define console_loglevel (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])
在系統啟動以後,可以:
$ cat "8 4 1 4" > /proc/sys/kernel/printk
改變 console level。但是如果是連 kernel boot time 都要的話,就只有改 console_printk[] 了。
把 DEFAULT_CONSOLE_LOGLEVEL 定義成 8 就可以。
2012年8月27日 星期一
driver/host/Kconfig:
實際上.config:
然後在 driver/usb/host...
然後 CONFIG_USB_EHCI_HCD::
CONFIG_USB_EHCI_ARC, _OTG 的:
所以主要的好像就只有 driver/usb/host/ehci-hcd.c
然後這個 source include 很多其他的 .c
config USB_EHCI_ARC bool "Support for Freescale controller" depends on USB_EHCI_HCD && (ARCH_MXC || ARCH_STMP3XXX || ARCH_MXS) select USB_OTG_UTILS ---help--- Some Freescale processors have an integrated High Speed USBOTG controller, which supports EHCI host mode. Say "y" here to add support for this controller to the EHCI HCD driver.
實際上.config:
CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ARC=y CONFIG_USB_EHCI_ARC_OTG=y CONFIG_USB_EHCI_FSL_UTMI=y CONFIG_USB_EHCI_ROOT_HUB_TT=y
然後在 driver/usb/host...
然後 CONFIG_USB_EHCI_HCD::
drivers/usb/host/Makefile:obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o
CONFIG_USB_EHCI_ARC, _OTG 的:
arch/arm/mach-mx5/usb_h1.c:#ifdef CONFIG_USB_EHCI_ARC arch/arm/mach-mx5/usb_dr.c:#ifdef CONFIG_USB_EHCI_ARC_OTG arch/arm/mach-mx5/usb_dr.c:#endif /* CONFIG_USB_EHCI_ARC_OTG */ arch/arm/mach-mx5/usb_dr.c:#ifdef CONFIG_USB_EHCI_ARC_OTG arch/arm/mach-mx5/usb_h2.c:#ifdef CONFIG_USB_EHCI_ARC drivers/usb/host/ehci-hcd.c:#ifdef CONFIG_USB_EHCI_ARC drivers/usb/otg/fsl_otg.c: "CONFIG_USB_EHCI_ARC_OTG\n"
所以主要的好像就只有 driver/usb/host/ehci-hcd.c
然後這個 source include 很多其他的 .c
#include "ehci-dbg.c" #include "ehci-hub.c" #include "ehci-sched.c" #include "ehci-arc.c" #define PLATFORM_DRIVER ehci_fsl_driver以上就是實際compile 的 source code.
2012年8月26日 星期日
2012年8月24日 星期五
2012年8月22日 星期三
hotspot (wifiap) 的 dhcp lease time
hotspot 的 dhcp,dns 等動作是交給 dnsmasq 這個程式來作。
netd 的 TetherController.cpp 是負責叫起 dnsmasq 動作的部份。
dnsmasq 跟一般的 command 一樣,是由 command argument 決定動作。
argument 也由 TetherController.cpp 負責。
dhcp 的 lease time 也由 argument 決定。
以下就是準備好 argument,然後用execv( ) 啟動 dnsmasq 的 code:
其中 : "--dhcp-range=%s,%s,1h" 最後一項就是 lease_time: 1h。
dnsmasq 啟動後,會由 read_opts( ) 負責 parsing argument, update parameter.
修改後,client 端可以用 showlease wlan0 這個 command 來看收到的 dhcp server 傳來的 lease time 是多少。
netd 的 TetherController.cpp 是負責叫起 dnsmasq 動作的部份。
dnsmasq 跟一般的 command 一樣,是由 command argument 決定動作。
argument 也由 TetherController.cpp 負責。
dhcp 的 lease time 也由 argument 決定。
以下就是準備好 argument,然後用execv( ) 啟動 dnsmasq 的 code:
int num_processed_args = 4 + (num_addrs/2) + 1; // 1 null for termination
char **args = (char **)malloc(sizeof(char *) * num_processed_args);
args[num_processed_args - 1] = NULL;
args[0] = (char *)"/system/bin/dnsmasq";
args[1] = (char *)"--no-daemon";
args[2] = (char *)"--no-resolv";
args[3] = (char *)"--no-poll";
int nextArg = 4;
for (int addrIndex=0; addrIndex < num_addrs;) {
char *start = strdup(inet_ntoa(addrs[addrIndex++]));
char *end = strdup(inet_ntoa(addrs[addrIndex++]));
asprintf(&(args[nextArg++]),"--dhcp-range=%s,%s,1h", start, end);
}
if (execv(args[0], args)) {
LOGE("execl failed (%s)", strerror(errno));
}
其中 : "--dhcp-range=%s,%s,1h" 最後一項就是 lease_time: 1h。
dnsmasq 啟動後,會由 read_opts( ) 負責 parsing argument, update parameter.
修改後,client 端可以用 showlease wlan0 這個 command 來看收到的 dhcp server 傳來的 lease time 是多少。
2012年8月21日 星期二
system 下的 vold, netd 有類似的架構。
都是用 CommandListener.
netd 也負責 Tethering ,叫起 dnsmasq,這同時負責 dhcp (竟然不是獨立的 dhcp 程式)。
netd 負責很多事:
CommandListenener 繼承 FrameworkListener。
FrameworkListener 是用 unix socket 作為溝通的 interface。
使用的 unix socket,要先 create 好 (init.rc:)
command 的內容好像是用 plain text。
command 本身也是,所以每個 command 都有一個 "name" (CommandListener.cpp):
FrameworkListener 從 netd socket 收到 command 後,在 dispatchCommand ( ) parsing 一下,
把command 整理成: command, argc, argv[],之後,比對 command 字串,
然後 call 比對到的 runCommand(cli, argc, argv)
都是用 CommandListener.
netd 也負責 Tethering ,叫起 dnsmasq,這同時負責 dhcp (竟然不是獨立的 dhcp 程式)。
netd 負責很多事:
class CommandListener : public FrameworkListener {
static TetherController *sTetherCtrl;
static NatController *sNatCtrl;
static PppController *sPppCtrl;
static PanController *sPanCtrl;
static SoftapController *sSoftapCtrl;
static UsbController *sUsbCtrl;
static RouteController *sRouteCtrl;
CommandListenener 繼承 FrameworkListener。
FrameworkListener 是用 unix socket 作為溝通的 interface。
使用的 unix socket,要先 create 好 (init.rc:)
service netd /system/bin/netd
socket netd stream 0660 root system
然後在 netd 啟動的時候,告訴 FrameworkListener,要 listen 哪一個 unix socket (CommandListener.cpp) :
CommandListener::CommandListener() :
FrameworkListener("netd") {
registerCmd(new InterfaceCmd());
registerCmd(new IpFwdCmd());
registerCmd(new TetherCmd());
registerCmd(new NatCmd());
registerCmd(new ListTtysCmd());
registerCmd(new PppdCmd());
registerCmd(new PanCmd());
registerCmd(new SoftapCmd());
registerCmd(new UsbCmd());
registerCmd(new RouteCmd());
command 的內容好像是用 plain text。
command 本身也是,所以每個 command 都有一個 "name" (CommandListener.cpp):
CommandListener::TetherCmd::TetherCmd() :
NetdCommand("tether") {
}
FrameworkListener 從 netd socket 收到 command 後,在 dispatchCommand ( ) parsing 一下,
把command 整理成: command, argc, argv[],之後,比對 command 字串,
然後 call 比對到的 runCommand(cli, argc, argv)
2012年8月9日 星期四
usb auto_suspend & wakeup
奇怪,一個 usb hub 在 xp 下可以正常動作,在 7 下就 fail。
-- 發現只要 hub 上一直有插著裝置,就OK。
一旦 hub 空了,3,4 sec 後, hub 上的clk 就停了。
在 xp 上,即使 hub 空了,clk 也不會停。
大概是因為 7 的 usb driver 有 auto suspend 吧。
hub 支援 auto-suspend,所以 7 在問 hub 時,知道他可以 auto-suspend。
所以當 hub 上沒東西的時候,過一段時間, 7 就、把他 suspend 了。
為了配合,還要有 wakeup 功能。
一旦 suspend 後,只要有東西插入 hub,hub 就會發出 interrupt,通知 7。
這個wakeup function 在 linux source code 是(以 imx51 為例):
arch/arm/mach-mx5/usb_dr.c
-- 發現只要 hub 上一直有插著裝置,就OK。
一旦 hub 空了,3,4 sec 後, hub 上的clk 就停了。
在 xp 上,即使 hub 空了,clk 也不會停。
大概是因為 7 的 usb driver 有 auto suspend 吧。
hub 支援 auto-suspend,所以 7 在問 hub 時,知道他可以 auto-suspend。
所以當 hub 上沒東西的時候,過一段時間, 7 就、把他 suspend 了。
為了配合,還要有 wakeup 功能。
一旦 suspend 後,只要有東西插入 hub,hub 就會發出 interrupt,通知 7。
這個wakeup function 在 linux source code 是(以 imx51 為例):
arch/arm/mach-mx5/usb_dr.c
2012年8月8日 星期三
debian-multimedia ---- deb-multimedia
www.debian-multimedia.org 改為 www.deb-multimedia.org 了
所以 apt update 會 fail..
ref : http://www.deb-multimedia.org/
所以 apt update 會 fail..
ref : http://www.deb-multimedia.org/
2012年8月3日 星期五
obtainMessage, new Messasge
from http://www.cnblogs.com/android007/archive/2012/05/10/2494766.html
Android 中 SendMessage( ) 時,Message 主體都是用:
然後再用 sendMessasge(msg) 送出去。
不用 General 的:
new 的話,就要請系統作記憶體管理,new object 出來。
所以 obtainMessage( ) 比較快。
Android 中 SendMessage( ) 時,Message 主體都是用:
msg = obtainMessage( ..)
然後再用 sendMessasge(msg) 送出去。
不用 General 的:
msg = new Message( )
的原因,是因為 obtainMessage 會從 message pool 中拿出來,new 的話,就要請系統作記憶體管理,new object 出來。
所以 obtainMessage( ) 比較快。
標籤
- 3g (19)
- 工作的備worklog (93)
- 自言自語 (36)
- 草稿 (1)
- 亂亂寫 (8)
- 翻譯 (3)
- administration (76)
- alsa (7)
- android (299)
- apple (5)
- application (42)
- archlinux (1)
- audio (3)
- avr (6)
- backup_restore (2)
- bluetooth (5)
- bookmark (38)
- bootloader (21)
- browser (5)
- cellphone (28)
- command (8)
- Configuration (27)
- debug (7)
- django (1)
- driver (15)
- earphone (1)
- editor (1)
- EFL (1)
- ffmpeg (18)
- Filesystem (4)
- GCC (8)
- Gentoo (1)
- google (1)
- Graphic (3)
- hardware (40)
- hero (7)
- hibernation (9)
- iMX51 (38)
- Info (3)
- Install (30)
- java (4)
- Kernel (102)
- language (2)
- life (2)
- make (11)
- MantainLog (38)
- MCU_P (9)
- memo (8)
- microcontroller (3)
- MINGW (7)
- network (19)
- OpenCL (1)
- OS (11)
- package (3)
- pad (1)
- ProblemAndSolve (15)
- programming (8)
- Python (7)
- raspberry_pi (23)
- SDL (2)
- sensation (13)
- setup (3)
- software_package (36)
- SQL (1)
- suspend (2)
- ToDo (5)
- tool (3)
- ubuntu (1)
- VersionControl (45)
- Virtualization (15)
- VLC (5)
- wheezy (1)
- wifi (3)
- Windows (16)
- xiaomi (1)
- xperia (1)
網誌存檔
-
▼
2012
(176)
-
▼
8月
(18)
- iMX51 的 USB Host Controller 幾乎跟 EHCI 一樣。 -- 可能是為了...
- arm 的 writel( )
- 心得 -- 山寨平板
- usb : implement the "componion" attr on TDI type c...
- printk all out - debug console log level
- driver/host/Kconfig: config USB_EHCI_ARC bool "Su...
- 這樣看來,Nexus 7會是不錯的產品 為什麼不給一個後 相機呀?
- 果然很兩光,用這會被氣死。 輸入法一直當機,其他的也不能用。 結果1024x600還是不夠用。 先寫...
- CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ARC=y CONFIG...
- hotspot (wifiap) 的 dhcp lease time
- /external/dhcpcd/ 有一個 showlease ,可以用來看 dhcpcd 拿到的 ...
- system 下的 vold, netd 有類似的架構。 都是用 CommandListener. ...
- usb auto_suspend & wakeup
- debian-multimedia ---- deb-multimedia
- NativeDaemonConnector 配合 INativeDaemonConnectorCal...
- 任何 object 都可以用來同步。 任何 Handler 都可以用來作 message 傳遞。 ?
- obtainMessage, new Messasge
- unmount fail 的原因是因為沒有 任何一個 external storage 是 MOUT...
-
▼
8月
(18)