ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年8月31日 星期五

iMX51 的 USB Host Controller 幾乎跟 EHCI 一樣。
-- 可能是為了確保 sw 相容。
只有一些地方不一樣。

以 Port Status/Control Register 來看: * Port Owner : 這本是決定 ehci 或是 companion controller 用,但是 51 沒有 companion controller ,所以這個 bit always 1

arm 的 writel( )

arm 的 writel( ) arch/arm/include/asm/io.h: #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也都播得很順。

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 的 : +#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。
$ 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 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日 星期日

這樣看來,Nexus 7會是不錯的產品

為什麼不給一個後 相機呀?

果然很兩光,用這會被氣死。 輸入法一直當機,其他的也不能用。 結果1024x600還是不夠用。 先寫這些好了。

2012年8月24日 星期五

CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ARC=y CONFIG_USB_EHCI_ARC_OTG=y CONFIG_MXC_OTG=y

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: 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日 星期二

/external/dhcpcd/ 有一個 showlease ,可以用來看 dhcpcd 拿到的 ip lease time。

dhcp server 則是 netd 的 dnsmasq
system 下的 vold, netd 有類似的架構。
都是用 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

2012年8月8日 星期三

debian-multimedia ---- deb-multimedia

www.debian-multimedia.org 改為 www.deb-multimedia.org 了
所以 apt update 會 fail..

ref : http://www.deb-multimedia.org/

2012年8月3日 星期五

NativeDaemonConnector
配合
INativeDaemonConnectorCallback

可以用來實做:程式中,需要用 Thread 來完成的動作。

任何 object 都可以用來同步。
任何 Handler 都可以用來作 message 傳遞。

?

obtainMessage, new Messasge

from http://www.cnblogs.com/android007/archive/2012/05/10/2494766.html

Android 中 SendMessage( ) 時,Message 主體都是用: msg = obtainMessage( ..)
然後再用 sendMessasge(msg) 送出去。

不用 General 的: msg = new Message( ) 的原因,是因為 obtainMessage 會從 message pool 中拿出來,
new 的話,就要請系統作記憶體管理,new object 出來。
所以 obtainMessage( ) 比較快。

2012年8月1日 星期三

unmount fail 的原因是因為沒有 任何一個 external storage 是 MOUTED,
所以 UNMOUNT 都沒作,
所以沒有 UNMOUNT DONE event,
所以 observer 沒有被 call 到.....

標籤

網誌存檔