2012年12月8日 星期六

sourceforge 並未凋零只是上了年紀

摘譯 sourceforge 社群經理 Rich Bowen 的 The Myth of the death of sourceforge 文章

sourceforge 上有許多已經許久沒有動靜的專案,這反映開源軟體開發的本質與現實,並非每個專案都會成功。

sourceforge 上有的凍齡專案數較其他開源網站服務多,這表示 sourceforge 相對於其他同類服務的網站較久,只要給其他同類型網站夠久的時間,也是會出現相對夠多的凍齡,沒有再繼續開發的專案。

為何不刪除這些沒有繼續開發的專案?因為這些沒有繼續開發的專案,並非已經沒有價值,對於其他專案來說,可能會發現先前的半成品,只要再修修補補就可以造成新的好輪子。


2012年11月15日 星期四

Linux runtime PM and system suspend resume

在 Linux kernel 3.1 比原本的 device driver suspend/resume 多了另一組 runtime PM,隸屬於 struct device 的新屬性
include/linux/device.h 中定義的 struct device 可以看到:

struct device {
...
    struct device_driver *driver;
    struct dev_pm_info power;

Documentation/power/devices.txt
runtime PM 分成:prepare, suspend, suspend_noirq 三個階段

1. prepare 鎖定 parent, child 關係,申請需要的記憶體空間
2. suspend 停止 I/O 讓 device 進 low power mode 或斷電,可能有 wake up event
3. 關閉 irq 後進入 suspend_noirq 顧名思義是不會再收到 irq request 備份所有必要的暫存器,讓 device 進 low power mode 或斷電

相對應的是 resume_noirq, resume, complete
原本的 device driver suspend/resume

struct device_driver {
...
int (*suspend) (struct device *dev, pm_message_t state);
int (*resume) (struct device *dev);

Android 的 early_suspend, late_resume 是最外層,但是 runtime PM 跟 device driver suspend/resume 的順序關係為何?文件中叫我們自己 trace code...

Documentation/power/runtime_pm.txt

直接看 runtime PM 的資料是開機 default suspend 不管硬體狀態,在 system running 可依定義的 runtime PM 群組 suspend/resume suspend 是由 child -> parent,由下而上的順序相依關係,因此要使用 runtime PM 的 device 還需要使用的 device class 或subsystem, bus type 也使用 runtime PM 才行

/sys/devices/.../power/control 寫入 "on" 可以呼叫

pm_runtime_forbid() 保持在 active mode 禁止 runtime PM 動作
等確定可用後再寫入 "auto"

如果 runtime PM 在 running 沒執行過會由 kernel/power/suspend.c 進行 suspend,resume 最好先全部 active 再說?

PM core 會在呼叫 suspend/resume 時個別設定 counter 加一或減一
drivers/usb/gadget/omap_udc.c

會用到 udc->driver->suspend()

drivers/usb/core/driver.c

會用到 udriver->suspend()

所以還是要確定 device driver suspend 順序跟 runtime PM 的順序關係為何?

2012年11月11日 星期日

開車賣衣服的義大利人

走在庭仔腳時,路邊停了一輛 Tida 車上只有駕駛一人,一直對我說著
什麼?可是又聽不清楚,他看似一直努力要跟我說什麼?我靠近以後,
他先問我會不會英文?他是義大利人,來台北101出差最後一天,車上
後座載著超大旅行箱,好像是說他帶太多衣服,如果過海關會收關稅,
有四套其中三套免費,有一套要收錢,但是收很少的錢,問我要不要買?

我笑笑回答說沒興趣,他就立刻開車走了,連車尾燈牌也沒看到。

不知道是不是詐騙。

2012年11月7日 星期三

TI OMAP 3 Linux USB otg driver trace

Android gadget driver in Linux kernel

drivers/usb/gadget/android.c
定義 vendor ID 0x18D1 product ID 0x0001
可以從 platform data override
定義 Manufacturer, Product string, Serial string (adb 看到的)
rndis 跟 mass storage, MTP 互斥


drivers/usb/gadget/android.c 裡面 include
usbstring.c, config.c,
epqutoconf.c 選擇符合 descriptor 設定的 endpoint以及相對應的
 gadget device



USB controller 端是 otg registers
arch/arm/mach-omap2/usb-musb.c

usb_musb_pm_init() 會先 reset otg controller 應該是漏掉這裡沒追到


musb 資料另外跟廠商要 datasheet,透過 IRQ92 對 core INTC 發中斷
suspend/resume 後一段時間就沒收到新的中斷?主要問題從這裡開始追

drivers/usb/musb/omap2430.c



drivers/usb/musb/musb_core.c musbhdrc 的控制,需要再讀資料

drivers/usb/musb/musb_debugfs.c debugfs 介面


drivers/usb/musb/musb_procfs.c procfs 介面



drivers/usb/musb/musb_gadget.c




drivers/usb/musb/musb_hdrc.c


drivers/usb/musb/musb_host.c


USB Phy 是掛在 PMIC 上,透過 I2C 控制,目前只支援 high speed
USB ULPI 模式,控制 regulator power on/off,Phy suspend/resume
VBUS/ID 腳位有變化時才會打開 vusb3v1,vusb3v1 ldo 的電從
 vbat 來,而非 vio
drivers/usb/otg/twl4030-usb.c





2012年11月5日 星期一

正向循環 惡性循環


摘譯 seth godin 的正向循環 惡性循環( cycle worse cycle better)一文

惡性循環很常見。酗酒問題導致失業,失業又加重酗酒問題。糟糕的客服導致客戶換廠商,當然也導致客服的投資變少,因此問題持續惡化。

老闆因為領導能力的壓力而易怒。易怒問題讓老闆跟同事關係惡化,導致老闆壓力更大更易暴怒。員工因為老闆的負面回應而失去忠誠,導致員工產出降低,當然會導致更多負面回應。

大多數的問題,都是從小問題開始,然後漸漸惡化。答案並不是針對長期的問題找尋快速、確定的解法。而是取代惡性循環,改為正向循環。

常見的明顯簡單計劃是繼續活在造成問題的惡性循環(當有壓力就動彈不得,所以需要找出壓力的來源)。簡單的計劃倚賴外在的環境不要再輸入導致負面問題的原因,這通常無法解決問題。

較困難但也是較有效的選擇,是瞭解惡性循環。當你發現以後,了解導致惡性循環的關鍵原因,學會使用這個惡性循環的根源,並啓動另一個正向循環。

這是我的惡性循環。我要怎麼把惡性循環改成正向循環?誰可以幫我?
我需要學習什麼才能做到改變?我要如何改變習慣跟我的直覺本能?

這不只對組織有效,也對個人有效。魚餐廳銷售量降低,借錢買較新鮮的魚也無法提高銷售量,而是應該提供切邊服務。廣告代理商在損失客戶後,不是裁員,而是僱用更多有創意的員工。

銷售量降低我們需要投資更多客戶服務而不是減少客服資源。銷售量降低我們要花更多時間在熱情的研究,而不是更少。

這困難度是違反人性的。但是找出惡性循環,並投資在建立正向循環是最佳策略。另一個選擇是合理化惡性循環,並解釋惡性循環為自然法則,或是故有習慣,但這只會造成悲劇。


2012年10月10日 星期三

學習使用 Mac OS X on Mac Book Air


一、在單一程式內的操作:
1. Function keys:
Fn + F1(F1) ...Fn + F12(F12) for function keys in MBA

另外可以勾選 終端機 -> 服務 -> 服務偏好設定 -> 鍵盤 -> 
勾選 使用所有 F1, F2 等... 選項, 缺點是原本的功能快速鍵就要使用 Fn + F? 
來執行功能, 看每個人常用的是哪一項再選擇要不要勾選

2. Page up/down Home/End keys:
Fn + up/left (page up/home); Fn + down/right (page down/end) in Mac OS X
瀏覽器可以用, 但是遇到 terminal 會吃掉 Page Up/Down  XD

3. word/string selection:
選字要三指 touch, 還在練, 有時候不知道是誤觸還是有其他功能, 不用三隻也可
以控制選字

double touch 可以選 word, 但要選超過一個 word 還是要用三指 touch 或是 
按下觸控板來選



二、虛擬桌面的操作:
1. 快速開啟螢幕保護程式:
螢幕熱點是要把滑鼠移到最角落, 昨天沒試出來, 剛才試只要確定移到最角落就
可以觸發事件

當然要直接蓋上上蓋也可以 :P

另外記得要設定立即開啓密碼保護, 使用者與群組關閉自動登入, 這兩個設定

2. 在虛擬桌面切換應用程式:
還沒看懂虛擬桌面, 怎麼指定? 跟以前的九宮格概唸好像不太一樣?

Control + 左右可以在不同程式/桌面? 之間移動, 但是遇到同一個應用程式
的多個執行環境, 就要用實體鍵(F3 那個鍵)跳到最上層, 再用滑鼠點選, 或是在最
上層(桌面層)使用 Control + 左右鍵


Command + tab 是 goto application,使用過後會更新你原本的 
Control + 左右鍵的切換順序


Control + 上下鍵是切換三層:最上層是整個虛擬桌面,中間層是各個不同應用
程式,最下(第三層)是同一個應用程式的不同執行實體。

全螢幕的瀏覽器也佔一個桌面? 可以在最上層(桌面層)的最右邊新增桌面

同樣是 Terminal App 開的多個視窗實體, 可以用 Command + 1(2, 3...etc)
快速切換不同的 Terminal

Control + 數字鍵(1,2,3...etc) 可以跳選指定的桌面。



三、可以試試看的應用程式:
1. App Store 可以安裝 Xcode, 要再安裝 Xcode command line tools 才可以有
堪用的 local terminal 開發環境, 要先註冊 Apple Developer ID(信用卡會刷一元)
, 之後選擇 Xcode command line tools 下載.


2. 要安裝其他 open source 第三方套件
有 
  2.1 Fink(debian based, slow update)
  2.2 HomeBrew(better utilization of Mac OS packages, but slow update, too)
  2.3 macports
可選, 我選了 macports. 

畢竟是用 +mac, mac 又是跟 BSD 淵源較深 +ports, 所以用 macports (大誤)

其實各有優缺點, 大家也都講過了, 要選擇前請自行 google.

3. 中文輸入法
目前 Mac OS X 預設注音輸入法的問題:
  3.1 注音輸入法的標點符號:逗號是 (alt)option + , 
      句點是: (alt)option + . 再選字,選字選項的第二個就是句號。
  3.2 無法關閉自動選字,常常一開始前面的字選對了,繼續打到後面時,
      可能會改到前面原本已經正確又改錯的情況,折衷辦法是每打完常用的字詞, 
      都先多按一下 Enter/Return 完成輸出
  3.3 Option + Command + T 可以叫出標準(不是標點)符號,如果有需要輸
       入特別符號也可以試試。

下面有幾個別人推薦的中文輸入法, 以後有空/需要再試

中州韻輸入法引擎
http://code.google.com/p/rimeime/

OpenVanilla
http://openvanilla.org/

2013/01/21 更新:
FreeGroup 介紹小麥注音
http://mcbopomofo.openvanilla.org/

論壇:
http://apple.stackexchange.com/ 有專門答問 apple 軟硬體的 Stack Exchange  論壇

一開始是在 Google plus 的筆記, 整理在此做個總結

https://plus.google.com/u/0/111753281090331493268/posts/a26sNEU3oTY


2012年9月19日 星期三

Linux request_threaded_irq() 與 request_irq() 差異

一開始看到有 driver 用 request_threaded_irq() 以為是 request_irq() 誤植,Google 查詢後才知道是 Linux kernel 2.6.30 之後新加的 irq handler API

如何確定可以用到 request_threaded_irq() ?

Linux kernel config 需要定義 CONFIG_GENERIC_HARDIQS kernel config 才有支援  threaded irq

原因是在 include/linux/interrupt.h

#ifdef CONFIG_GENERIC_HARDIRQS

函式定義位置在:
    ~linux/kernel/irq/manage.c

1306 int request_threaded_irq(unsigned int irq, irq_handler_t handler,
1307              irq_handler_t thread_fn, unsigned long irqflags,
1308              const char *devname, void *dev_id)

    request_threaded_irq:   kernel thread context ist
    request_irq:    direct function call from hardware IRQ isr

Moving interrupts to threads 介紹 request_threaded_irq() 的由來,從 realtime tree 移植而來,為了減少 kernel 因為要等每一個硬體中斷處理的時間,就另外交給 kernel thread 處理中斷後續處理。

優點:

  1. 減少 kernel 延遲時間
  2. 避免處理中斷時要分辨是在硬體中斷或軟體中斷?
  3. 更容易為 kernel 中斷處理除錯,可能可完全取代 tasklet

   
原本的中斷處理分上半部(硬體中斷處理,必須關閉中斷無法處理新的中斷)跟下半部(軟體中斷處理),因此上半部的硬體中斷處理必須盡可能簡短,讓系統反應速度更快。

request_threaded_irq 是在將上半部的硬體中斷處理更加縮短為,只確定硬體中斷來自我們要處理的裝置,喚醒 kernel thread 執行後續中斷處理。只有將 tasklet 跟 softirq 處理都放到 threaded_irq 的 kernel thread 中,才能發揮最大的系統效能增益。

原本在 reuqest_irq 的 handler 變成快速檢查用的 handler function,

缺點:

對於非處理 irq 中斷的 kernel threads ,需要在原本 task_struct 新增 struct irqaction 多佔 4/8 bytes 記憶體空間,linux kernel 2.6.29 之後(2.6.30)加入 request_threaded_irq

    nested top halves?

jlokier 在回覆 Moving interrupts to threads 補充:跟傳統 top/bottom havles 的差異是 threaded_irq 受限於 Linux kernel system 的 process scheduling 控制。較不會發生寫錯的 bottom half 程式碼造成整個系統延遲的問題。

也可以透過 RT/non RT 跟 nice 等工具調整各個 thread 優先權,丟給使用率較低的 cpu 以及受惠於 kernel 原本可以對 threads 做的各種控制,包括但不限於 sleep, lock, allocate 新的記憶體區塊。

受惠最大的是 shared irq line 的多個中斷處理。除了可以加速共享中斷造成的延遲,threaded_irq 也可以降低在同一段程式碼處理多個裝置中斷的複雜度。

 threaded irq 在使用性上也比 tasklet(接著 top half 直接執行,無法 sleep) /workqueue(kernel context?) 等需要在 top half 增加跟 bottom half 連結與溝通的麻煩。

2012年8月25日 星期六

小兒玫瑰疹

小兒子SCH從8/17開始發燒,連燒3天,都是39-40度,退燒藥已經吃了12次之多,好不容易第四天終於退燒,第五天全身長滿紅疹,第六天紅疹漸消。原來他得到的是『玫瑰疹』。

第一天發燒時,帶去醫院看病,因為沒有感冒症狀,沒咳嗽,沒流鼻涕,醫生只開了退燒藥,說回家再觀察。第二天依舊高燒,吃了退燒藥會退燒,但隔不到6小時又燒起來,兩種退燒藥+塞劑交替使用。他活動力很好,能吃能睡,能調皮搗蛋,我看『輕鬆當爸媽,孩子更健康』這本書上關於玫瑰疹的說明,我就有懷疑SCH很可能是得到『玫瑰疹』。

1. 玫瑰疹的病童年齡要小,一般發病的年紀是兩歲以內。

2. 玫瑰疹常常是發『高』燒,最高溫度動輒三十九、四十度,反覆高燒4-5天。

3. 玫瑰疹的病童沒有呼吸道症狀,也就是沒有咳嗽,沒有流鼻涕,食慾正常,不會嘔吐,唯 
    一的線索是,會有輕微腹瀉,但不嚴重。

4. 玫瑰疹的孩子精神很好,除了發高燒時有點懶洋洋,吃了退燒藥後,又是一條活龍。

5. 最後一個徵象,要醫師檢查喉嚨才看得到,就是有一點點喉嚨泛紅發炎。

 以上藍色文字引用自『輕鬆當爸媽,孩子更健康』 黃瑽寧 著

SCH從8/17-8/19高燒三天後,8/20(第四天)再去看門診,醫師這次有看喉嚨,確實有一點泛紅發炎,但當時疹子還沒長出來,雖然我跟醫師都有懷疑可能是玫瑰疹,可是醫師說,也有可能是泌尿道感染,所以安排作驗尿。如果是泌尿道感染,就幾乎是細菌感染,需用抗生素治療,而且怕下面的細菌往上跑,不能輕忽。等到下午驗尿報告出來,還好是正常! 醫師排除細菌感染,說如果是玫瑰疹應該燒三天,第四天就會出疹子。

 8/20(第四天)從醫院回家後,SCH就退燒了 。傍晚肚子開始冒出小紅疹。8/21(第五天)臉上長滿紅疹,前胸後背全是疹子,手腳也有,但不多,主要集中在軀幹跟臉部。8/22(第六天),臉上疹子漸漸消退,到第七天幾乎恢復正常。

SCH這次玫瑰疹的症狀跟書上提到的五種徵象都符合,因為玫瑰疹屬病毒疹的一種,既然是病毒感染,就只能靠自體免疫力來對抗。退燒藥只是症狀治療,幫助孩子舒服一點而已,並不會因為吃退燒藥就少燒一天,或是縮短病程。雖說如此,我在SCH高燒那三天,總共退燒了12次,因為他高燒時全身是燙的,我既害怕又心疼,想說用退燒藥讓他舒服,也讓我心安。

2012年8月23日 星期四

幼兒近視

四歲的SSH作視力檢查,左眼有100度近視,醫生開長效型散瞳劑,每天睡前點一滴,並再三交代說,電腦、電視、手機、ipad,都不能玩。醫生強調,是不能玩,不是少玩。ssh本來每天都玩電腦跟ipad玩很久,發現近視後,完全不看電視,不碰電腦。一週後回診,竟然變成25度。醫生很滿意他的進步,就說散瞳劑改成一週點兩次,電視可以看,但看30分鐘要休息,至於電腦跟手機還是禁止,並安排兩週後再回診,如果有再繼續進步,就考慮停藥。

因為近視度數有改善,加上醫生說可以看電視了,ssh開始每天看卡通,但沒有每次都30分鐘就休息,結果2週後再回診,度數又加深變成50度。醫生這次謹慎起見,決定繼續點藥水,且一週改成點3次。一個月後再回診決定是否停藥。

2012年8月7日 星期二

101台北市公幼

今年開始實行幼托整合,學區內的國小附幼把3個中大班改制成1個3歲專班,2個中大班。公幼一個班招收30人,中大班共60個名額,扣除直升,優先入園,5歲先登記,剩下不到20個留給4歲。雖然現在少子化,但求過於供,SSH第一次登記公幼還是面臨了抽籤的命運。抽籤時SSH一直嚷嚷著:怎麼還沒到我啊?他一說完,馬上聽到他的名字被唸出來,感謝老天,SSH抽中了。

抽中公幼,開始煩惱的東西不少,尤其是SSH自主能力。 吃飯,穿脫衣服,刷牙,大小便,這些生活能力要開始作到百分百完全自理。像SSH在家大便是用水洗屁股,現在要教他用衛生紙擦屁屁,他很抗拒,他說怕手沾到大便。穿脫衣服繼續天天練習中,我發現要讓小孩穿寬大一點的衣服比較好脫。刷牙他最行了,因為他喜歡刷牙後可以用泡泡糖口味漱口水,所以刷牙是他的最愛。

101年9月起,公幼課後留園可延至六點(or六點半),由於課後留園費用併入註冊單繳費,所以登記時就須決定是否參加。原本以為課後留園是學才藝,像音樂,美勞,工藝,畫畫,黏土,肢體律動等,所以我選擇讓ssh參加,但後來園長來電作最後確認時說,課後留園內容主要是白天課程的延伸,偶爾看看教學影片,但大部分時間都讓孩子在角落玩,如果想學才藝,建議我到外面找,像雲門舞集YAMAHA音樂教室那種。園長說這一學期約有十位小朋友參加,四點放學後將三個班級參加課後班的小朋友,也就是3歲到5歲都集中在教室內,由一位老師照顧至六點半。公幼是就算只有一位小朋友也會開課後留園班,這是台北市政府給雙薪家庭的福利。課後留園(四點~六點半)必須自費,去年是到五點半,約六千元,今年延至六點半,估約八千元。我考慮過後決定先不參加課後留園。大部分可以四點就接放學的家長都選擇不參加,所以三個班90位小朋友中,只有10位留下來。

公幼的學費,101年全天班一學期(約4.5個月)是21873元,不含課後留園。註冊時須另外繳1000元,用來購買書包/圍兜/餐袋。

最近開始準備ssh的開學用品。以下是學校要求自備的東西:2個鋼杯(1個喝水,1個刷牙)
,牙膏牙刷,一包衛生紙,棉被(午睡用),拖鞋。

2012年7月7日 星期六

omap3isp, camera sensor V4L2 subdev driver, media controller

跟上時代的感覺還不錯,摸索了 v4l2 subdev 的設計方式,也讓 camera driver 進化到 current 介面了 :) 雖然為了改版事情變多,戰力也少了一位同仁(算畢業嗎?XD)

希望趕快有生力軍加入,可以補缺額恢復戰力。

1. omap3isp driver
v4l2 因為已經有包進 i2c 介面,因此我們在新增 camera driver 時,就要宣告
~linux/arch/arm/mach-omap2/devices.c 中 omap3_init_camera() 所需要的
struct isp_platform_data *pdata, 會用來註冊 omap3isp device 搭配 omap3isp driver 
使用

其中 isp_platform_data 定義在 include/media/omap3isp.h 中,裡面又需要定義 isp_v4l2_subdevs_group 也就是單一 camera sub device 的 I2C 與 Camera InterFace 定義,如果有第二個 v4l2 subdev 就是新增一個

isp_v4l2_subdevs_group,依此類推。

Camera I2C 是定義在 struct isp_subdev_i2c_board_info *subdevs; 以及 interface,如果是用 parallel(疑?還沒進化到 MIPI),就定義 bus.parallel 當然也要設定裡面的 bridge 介面參數與 VS, HS CLK 高低準位等。

i2c_board_info 中另一個要定義的是 .platform_data 指到 camera sensor 的 pdata 參考 include/media/mt9p031.h 定義 set_xclk 由 SoC 給 camera sensor mclk 的開關,reset 定義 reset 的 GPIO, ext_freq 定義 mclk 頻率, target_freq 定義 pixel clock 頻率

2. camera sensor driver
~linux/drivers/media/video/mt9p031.c
mt9p031_probe()

註冊 mt9p031->subdev.ctrl_handler = &mt9p031->ctrls;

v4l2_i2c_subdev_init(&mt9p031->subdev, client, &mt9p031_subdev_ops);

掛載 v4l2 的 i2c 介面 device, 另外也有定義 spi 介面的註冊方式

crop 與 format 的 window size, pixel format

而 Linux 的 Media controller 目前除了可以控制 camera, display 等 video device 外,也可以包括 audio 等

3. media-ctl
media controller, build kernel 需要加 media controller driver, mknod /dev/media0 c 252 0
設定各個 v4l2 sub device(entity) 的各個 input/output pad 的 pixel format, picture width, height

流程大致上是

media-ctl -r // reset previous links
media-ctl -l '"mt9p031 2-00cc":0->"OMAP3 ISP CCDC":0[1]'
media-ctl -l '"OMAP3 ISP CCDC":1->"OMAP3 ISP CCDC output":0[1]'
media-ctl -d /dev/media0 -V '"mt9p031 2-00cc":0 [fmt:YUYV/1024x768]'
media-ctl -d /dev/media0 -V '"OMAP3 ISP CCDC":0 [fmt:YUYV/1024x768]'
media-ctl -d /dev/media0 -V '"OMAP3 ISP CCDC":1 [fmt:YUYV/1024x768]'
yavta -f YUYV -s 1024x768 -n 2 --capture=4 -F `media-ctl -e "OMAP3 ISP CCDC output"`
當然也可以串 previewer, resizer,但這就要看各個 entity(sub device) 的 input/output pads

4. references:
~linux/Documentation/video4linux/omap3isp.txt
~linux/include/linux/omap3isp.h

http://git.ideasonboard.org/?p=media-ctl.git;a=summary 其中有 media-ctl git tree
https://gitorious.org/omap4-v4l2-camera 其中有 yavta git tree
git://gitorious.org/omap4-v4l2-camera/yavta.git

http://processors.wiki.ti.com/index.php/UserGuideOmap35xCaptureDriver_PSP_04.02.00.07

http://www.linuxtv.org/downloads/presentations/summit_jun_2010/20100206-fosdem.pdf

http://processors.wiki.ti.com/index.php/Writing_V4L2_Media_Controller_Applications_on_Dm36x_Video_Capture

2012年6月8日 星期五

git repository with large files settings

In some circumstances, we have to allow developers to put large files into git repository, but that would
usually encounter mmap/malloc memory space shortage errors in git.

To fix this issue,  we have to upgrade git version to 1.7.10+ and add the following settings to ~/.gitconfig

[core]
    packedGitWindowSize = 128m
    packedGitLimit = 128m
    bigFileThreshold = 128m
[pack]
    compression = 1
    windowMemory = 128m
    threads = 1
    window = 1
    depth = 1
    deltaCacheSize = 1
    packSizeLimit = 128m

vendor BSP Linux kernel 版本選擇

用了 Vendor  的 Android BSP,就必須跟著提供的 Linux kernel 版本走,但是如果用的
第三方晶片、模組廠只給 binary driver,driver 又鎖定特定版本介面,這時候只好跟
著找其中的交集,或是差異最小的版本。

比較可能有出問題的就是 audio alsa, video v4l2, wifi 的 wext, cfg80211 等介面差異。

晶片線路內部供電與外部供電

在追 sdcard 的 vmmc1 regulator 設定時,發現 TI 的設計是透過 PMIC 再給 vmmc1
電源,但回過來想既然 SoC 都有電了,為什麼就 mmc1 controller 要外部給電?

問了 Ken Chen 才知道有幾種可能,一種是數位跟類比電源差異,第二種可能是特定
的 bus 介面需要將電源切出來另外在 BUS 傳輸協定中獨立控制電源開關,第三種可
能是晶片本身有的電壓跟外部供電的 controller 電壓不同。

外部供電或內部供電的差異,也是有可以研究的地方。

2012年5月11日 星期五

使用 android property 連結 linux user space 與 android service

某些情況下我們希望在 linux user space 做某些動作或檢查,開關 android service
透過 android property 的 set property (setprop in init.rc 或 command line 或 C API),
再經由 android init.rc 的
on property:my.property=value
語法再執行 start/stop service 就可以完成這個連結



修改過檔案後直接 git pull 為何一定失敗?

原本已經習慣的 git pull 如果失敗,就 git stash 保留 working tree 再 git pull,最後 git stash pop 看 git auto merge 或有 conflict 再手動解之後 git add, git commit ...

但今天被問到為何直接修改檔案後 git pull 都會必須 stash 或 commit 時,卻答不出來

答案在 git help pull 的說明中,git pull 其實是 git fetch 再 git merge,而 merge 一定要是一個 branch,但在 working tree 內修改過的內容如果沒 commit 就不屬於這個 working tree 對應的 branch,因此 git 會警告你要先 commit (之後會 auto merge 或 conflict),或者是依我目前習慣的 git stash 暫存修改,等 git pull (主要是 merge) 之後再 git stash pop。不然可能會有遺失 work tree 修改的風險。

stash 想成是 stack 就比較容易理解,0 在最上面是 top,數字越大放在越底下表示越舊的資料,也符合一般圖解的 stack 示意圖。

習慣的動作習慣以後,本來就沒搞懂的、或遺忘細節,一被問就倒了 XD


2012年3月31日 星期六

python, django and mongodb 初心者參考資料

在 ubuntu 嘗試 python, django 與 mongodb 的組合建 web application

python 程式語言參考資料:
http://docs.python.org/reference/index.html#reference-index
http://docs.python.org/contents.html
http://code.google.com/intl/zh-TW/edu/languages/google-python-class/
http://pypi.python.org/pypi
http://www.youtube.com/playlist?list=PLEA1FEF17E1E5C0DA

python web framework, django 參考資料:
https://docs.djangoproject.com/en/1.3/intro/tutorial01/
http://www.openfoundry.org/index.php?option=com_content&task=view&id=1330&Itemid=144
http://www.openfoundry.org/tech-column/1350
http://blog.wu-boy.com/2009/04/django-web-framework-django-%E5%88%9D%E9%9A%8E%E5%AD%B8%E7%BF%92%E5%BF%83%E5%BE%97/

https://code.djangoproject.com/wiki/UsingVimWithDjango

django-admin startproject firstproject
cd firstproject

./manage.py
列出 django 可控制參數

./manage.py startapp firstapp
產生新的 django application

修改 firstproject/settings.py 設定 database, install application,
修改 firstproject/urls.py 設定 web application url

修改 firstproject/firstapp/models.py 加入定義的 database schemas, 或
 mongoengine 的 Document,相當於 Ruby on Rails 的 model

修改 firstproject/firstapp/views.py 加入要支援的 url actions
(配合 firstproject/url.py),相當於 Ruby on Rails 的 controller

修改 firstproject/templates/*.html 顯示的 html temlate 相當於
Ruby on Rails 的 view

修改 firstproject/urls.py 加入要支援的 url regex 相當於 Ruby on Rails
的 routing 設定

firstproject/firstapp/manage.py runserver
如果沒錯誤就應該可以在預設的 http://127.0.0.1:8000/ 看到你的
django web applications

mongodb 的 python driver, mongoengine 應用在 django 的參考資料:
http://mongoengine.org/docs/v0.5/django.html

django 搭配 mongodb 的基本參考範例:
IBM developerWorks: Using MongoDB with Django

automation and deployment of django web application:
Fabric:
http://docs.fabfile.org/en/latest/index.html

http://www.jeffknupp.com/blog/2012/02/09/starting-a-django-project-the-right-way/
提到 python-django-south (ubuntu package name of south) 可以管理
 database migrations,但仍不確定對 NoSQL schema less 的 mongodb 是否有用?


2012年3月29日 星期四

日舒 黴漿菌

如果久咳不癒”(一個月)、頓音型咳嗽,睡眠中咳到醒,發燒不退,可能是黴漿菌感染,醫生會開日舒,需要持續三到五天的服藥,另一個之前常見的抗生素是安滅菌。

耳鼻喉的上呼吸道感染如鼻竇炎、中耳炎,下呼吸道感染,如支氣管炎、肺炎則是使用安滅菌抗生素治療,可以殺的細菌有很多樣可以參考

gsk 的安滅菌 pdf 說明檔案。常見副作用是腹瀉、噁心。

2012年3月24日 星期六

Linux 支援 ARM big.LITTLE 架構的方式

摘譯 http://lwn.net/Articles/481055/

這篇文章中提出了兩種支援 ARM 新雙核架構 Coretex-A15 & Cortex-A7 的可能實作方式。原本 ARM big.LITTLE 期望達到可以使用 Coretex-A15 的高效能與 Coretex-A7 的低功耗,達到兩種市場通吃的多核 cpu cluster 系統。

Linux scheduler 原本預期的多核系統,都是假設每顆核心的工作效能相等,因此要在 Linux 支援 ARM big.LITTLE 的異質多核,勢必需要改變原有的 Linux kernel,才可能決定何時將哪一個 kernel task 交由 Coretex-A15 或 Coretex-A7 執行?以享受到 ARM big.LITTLE 的高效能與省電的雙效果。

針對 Linux 整合 ARM big.LITTLE 架構的可能性,文中提出兩種可實作方式。

第一種是 ARM 的參考實作使用了 Coretex-A15 與 Coretex-A7 的虛擬化功能,讓作業系統 ARM big.LITTLE 的多核心硬體只有一組 Coretex-A15 cluster (4 核)的虛擬核心。

對於 Linux scheduler 來說因為仍可以安全的套用多核心的硬體都是同等效能與耗電量,如此 hypervisor 可以在作業系統不知情的狀態下,將整個執行狀態從某一個 cluster suspend,再搬移到另一個 cluster resume 繼續執行。對作業系統來說差異是會發現速度的改變(看是在 big Coretex-A15 或是 LITTLE Coretex-A7 執行)。

優點是對已經支援 Coretex-A15 多核的作業系統可無痛轉換,但缺點是 hypervisor 需要多考慮 Coretex-A15 與 Coretex-A7 的 cache 等系統實作細節的差異。另一個衍生問題是每次 hypervisor 轉換 cluster 的 performance penalty 是否造成另一種資源浪費?

第二種是利用 Linux Kernel 原有的 cpu driver cpufreq 的架構,將不同的 Coretex-A15 與Coretex-A7 工作頻率排列組合後,當作一個虛擬的 cpu freq 設定。這方法的好處是上層 user space 控制 kernel cpu 工作頻率的操作介面不用改變。

2012年3月19日 星期一

閱讀 Blind_signature 維基百科條目


Blind Signature

一開始是看到 godfat 的 G+ 的連結,連到 gslin 的 blogspot blind signature

維基百科的類比方式是,把一封秘密的信件放到信封中,簽名的人對著內夾覆寫紙
在內的信封直接簽 (因此簽名者不知道信件內容,但確實達到驗名証身的效果),因此
不止信封,連信件內容也有簽名,主要適用在需要隱私又要能確保無偽造可驗証的
系統。

兩大應用分別是:
1. 匿名投票,又需要能驗全體投票內容,
2. 數位錢包。

其中用到的數學原理是 blind RSA Signatures,原訊息 m 加上 blinded factor r 後變 m',
m' 給簽名者簽完得到 s', 原信件作者可以再透過 blinded factor r**(-1) 跟 s' 取得
原訊息 m 的簽名 s. (see wikipedia section)

但維基百科也提到 RSA 的 blind Signature 同時也可能被攻擊者用來騙簽名者解一段
簽名者 public key 加密過的私密訊息,主因是 1. blind (簽名者不知道是簽啥) 2. RSA
的 private key 簽名其實相當於解開用 public key 加密的內容,因此使用 RSA 簽名的
話,要記得 RSA 簽名跟加解密絕對不能使用同一組公開/私密金鑰。

https://plus.google.com/113906251313439000579/posts/iHQ6j2ktYH8
http://blog.gslin.org/archives/2012/03/18/2852/blind-signature/

https://en.wikipedia.org/wiki/Blind_signature
http://crypto.stanford.edu/pbc/notes/crypto/voting.xhtml

digital cash 電子錢包
https://en.wikipedia.org/wiki/Ecash

voting protocol 可驗証的投票協定
https://en.wikipedia.org/wiki/End-to-end_auditable_voting_systems

zero knowledge proof 不知道內容下驗証訊息為真的方式
https://en.wikipedia.org/wiki/Zero-knowledge_proof


2012年3月16日 星期五

add new ssh key/host settings for github access

主要是照 github 的 Set Up Git help, Linux part
(不知道為什麼這個網頁載很久...有時還會 timeout XD)

1. ssh-keygen ...輸入 id_rsa_github 或自己取名以免蓋掉你原本的 ssh key pairs
2.  ssh -i .ssh/id_rsa_github -T git@github.com 確定可以 ssh (no shell, else..0wned XD)
3.  setup github username and api token for github services
    git config --global github.user your-github-username
    git config --global github.token your-github-api-token

4. ~/.ssh/config 加入針對 github 的 ssh key

    Host github.com
        IdentityFile ~/.ssh/id_rsa_github
        SendEnv LANG LC_*
        HashKnownHosts yes
        GSSAPIAuthentication yes
        GSSAPIDelegateCredentials no

接下來再照 github 的 create a repo....網頁就可以開始你自己的 github open sharing
之旅了,只是要記得免錢的服務都是要公開的...

change vimdiff colors in railscasts.vim colorscheme

在使用 railscasts.vim 一段時間後,當用到 vimdiff 時,常常因為 railscasts.vim 中的
DiffAdd, DiffDelete 設定(DiffText, DiffChange則未定義) 顏色不易分辨而作罷,甚至
有時候就回到 diff -u 的黑白 -+ 世界比較單純。

但在看過 Change vimdiff color 一文後才知道原來只要改 DiffAdd, DiffDelete, DiffText,
DiffChange 四個選項,就可以讓原本 railscasts.vim 的 colorscheme 跟 vimdiff 使用
更容易分辨的 256 色的 xterm 環境設定,我調整後的四個選項設定如下:

DiffAdd 指相對於另一邊檔案新增的部份

DiffDelete 指相對於另一邊檔案刪除的部份
DiffChange 指兩邊檔案文字有差異的文字區塊
DiffText 指兩邊檔案文字差異的文字內容



highlight DiffAdd cterm=bold ctermbg=245 ctermfg=white
highlight DiffChange cterm=bold ctermbg=100 ctermfg=black
highlight DiffText cterm=bold ctermbg=140 ctermfg=white
highlight DiffDelete cterm=bold ctermbg=180 ctermfg=black


https://github.com/sjh/config_files/blob/master/vim/.vim/colors/railscasts.vim

用起來效果如下圖:











當然你可以再改成自己喜歡的配色,而 xterm 256 色(0黑~255白)的對照表可以參
考以下網站:
 http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim

guifg 跟 guibg 的部份因為我沒用到所以還沒調整。

2012年2月20日 星期一

TI OMAP3 DM3730 USB host controller high full low speed?

因為 TI OMAP3 DM3730 在 USB host controller 上偵測不到 full/low speed USB device,經查之後發現目前的硬體接線 ULPI 因為 DM3730 跟選用的 USB transceiver 的ULPI phy 的 serial 排線順序不一樣,在設定為外接 USB transceiver phy,而非 TLL 的接線方式時,無法使用 full/low speed mode,選用 device 時必須注意只能接 high speed device,如果要保持原有 

USB host controller ---phy--- USB transceiver --D+D-

接法, ulpi phy 線路不改而想要使用 full/low speed USB device,可以再外接一顆 high speed USB hub 解決。

2012/02/24

今天又花了些時間跟 Ken,還有 EE 確定 USB 問題,有些地方一開始誤解,因為是從軟體驅動程式行為,發現硬體有問題,一開始以為是目前元件接法

USB host controller ---phy--- USB transceiver --D+D-

無法實作, EE 在我提出有問題後就進行調查,發現是 ulpi serial 無法對應,其實並非這樣子的元件接法問題,而是 DM3730 的輸出分 ulpi parallel, ulpi serial, TLL 三種,因為我們有接 transceiver,就只能選擇 transceiver 有支援的 ulpi parallel 或 ulpi serial二擇一,high speed 的接法是 ulpi parallel,而 full/low speed 的 ulpi serial 接法,因需要接腳比 parallel 少,原本可以使用同一組硬體排線,但是因為 DM3730 跟所用 transceiver 的 ulpi serial 接腳順序與 transceiver 不同,造成無法使用現有的線路,待跳線驗證後可確定。

結論:

跳線加上 ohci driver 實測驗證後發現以 3 wire 的 ulpi serial 對 usb transceiver 就已經會發生誤判為有 USB low device (MiniPCI-E 上沒插卡),但我們 usb host port 的 transceiver 又沒有介面控制調整為 3-wire serial, 6-wire serial 或 12(8+4) parallel(預設),再加上 DM3730 SoC 原有的 ehci 轉換到 ohci 就會鎖死的 bug,最後確定無法使用原來的 

DM3730 USB host controller -- phy -- USB transceiver -- D+D- 

的接法,必須要再外接一個 USB hub 在 MiniPCI-E 上才能使用 USB full/low speed device.

相關文章:

2012年2月18日 星期六

Cadence Allegro 可讀電路圖 brd layout 檔案

The Cadence®  Allergo®  FREE Physical Viewer 填入個人資料後,會郵寄下載連結到電子郵件信箱供下載。

如果要測漏電,通常都是讀 EE 人員給的 pdf 電路圖,但要量測電壓電流時,pdf 檔怎麼對應到 PCB 板子上的元件就比較麻煩了。

Ken 因為有畫過電路圖 layout,提出向 EE 要 brd 檔案的需求,並且教我們如何使用 Allegro 讀 brd 檔,當然我還在學習中(*汗*)。

首先看 pdf 轉出來的電路圖,找到要量測的點,如 T82,但要找到PCB 板子上的元件實際量測點 ,需要使用 Allegro 開 brd 檔,選擇 Top 或 Bottom(因為只有這兩面我們量得到)配合搜尋跟 highlight 去找到 T82 的亮點,再配合右下角縮圖,跟滑鼠中鍵的移動視角(而非圖本身)就可以知道在整個 PCB 板的哪個實際位置了。

說到 Cadence...今天在 Google plus 有個叫 Cadence 的 porn bot 要找我視訊XD 看到 Cadence 我就先點了,但問了幾個問題後,發現都是固定回應,就刪了他,要刪掉加入 Google talk 的聯絡人還有點麻煩,Google plus 上看不到,必須要到 Gmail 選左上角的通訊錄 tab,搜詢新加的聯絡人 porn bot email address, 再刪除他即可。

2012年2月10日 星期五

BUILD_BUG_ON_XXXX macros in kernel.h

剛在 stackoverflow 看到有人在問 ":-!!" 在 C 語言的作用,點進去才知道是 linux kernel
header file ./include/linux/kernel.h 的兩個 Macro 定義:

683 /* Force a compilation error if condition is true, but also produce a
684    result (of value 0 and type size_t), so the expression can be used
685    e.g. in a structure initializer (or where-ever else comma expressions
686    aren't permitted). */
687 #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
688 #define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
689
然後也有人解釋了:-!!,就是 : 取位元數, - 負的,!! 測試 e 是否為 0 ,回傳 0 或 1

就語意上是在測試另一個在 ./include/asm-generic/bug.h BUG_ON() macro 是否回傳
 0 或 null,如果是 0 或 null 就正確 (size 0),否就會 build fail (size (-1))

2012年2月8日 星期三

解 bug 的心理陷阱:我的可以動

昨天又遇到鬼打牆的解 bug 問題,一開始是自己寫的 AP + JNI shared library 可以用,但是給同事的 AP call 就有錯誤,於是卡在我的可以動的迷思中 XD。所以先請同事幫忙 debug,但是除了一個 static access warning 外,在應用程式端也沒別的線索了。自己才真正開始回去追 JNI shared library,結果確定是該用 jintArray 的型態用錯為 jint *。於是修改過後今天給同事確定可以解掉這個問題。但現在問題變成是,為何原本的寫法我的應用程式可以存取 JNI integer array ? XD

另外昨天看到一篇 Joshua Bloch 的 binary search, merge sort 的實作 bugJoshua Bloch 發現 Jon Bentley 的 Programming Pearls 書(1986, second edition 2000 )中的演算法,跟他在 JDK 實作 java.util.Array 的 binarySearch (存在九年的 bug) 同樣犯了 divide and conquer 取中間數的錯誤:

 6:             int mid =(low + high) / 2;

mid 可能遇到太大的 low 跟 high 造成 mid 發生 integer overflow,大於最大正整數 (2^31 - 1),這個 bug 可以藏這麼久的原因是之前沒有人測過這麼大量的 binary search 或 merge sort 解法是

 6:             int mid = low + ((high - low) / 2);

或用 Java 的 unsigned right shift, ">>>", (最高位補 0 確保為正整數)取代除以 2 較快些

 6:             int mid = (low + high) >>> 1;

C/C++ 參考解法如下:(參考 Nokia 的 Antonie Trux 指出 C89/90 跟 C++、C99 說明 signed integer 相加 overflow 的話是未定義行為,因此先轉型為 unsigned int)

 6:             mid = ((unsigned int)low + (unsigned int)high)) >> 1;

該文後面 Joshua Bloch 說明的是這個 bug 讓他學會謙虛,即使是我們認為理所當然的取平均都可能出錯,細心的設計、測試的重要性、正規方法、檢 視程式碼、靜態分析都是很棒的,任何單一方法絕對無法保證沒有 bug。即使我們竭盡全力解一個 bug,也可能要花上幾十年才解掉。因此寫程式必須小心、防衛並時時警覺。



2012年2月5日 星期日

被誇大的架構議題

摘譯:Architect - Overrated 一文自我警惕開發者該做的事

1. 總是在談願景、大方向
2. 認為自知該怎麼建造系統
3. 對於團隊不依照自己想法執行讓你不高興
4. 從沒擁有一個可用的 build
5. 花太多時間寫文件而非程式碼
6. 可以寫出產品原型,但從未寫出可賣的量產品
7. 花太多時間開會
8. 寫過最好的程式碼都是幾年前的事了
9. 被問到意見時,都只能回答一些不切實際的大概、方向
10. 懷疑團隊成員私底下取笑你
11. 花太多時間看科技、資訊產品部落格
12. 成為過去式

不要只寫維基文件跟 powerpoint。寫程式。

2012年1月15日 星期日

mount loop offset partitions of root disk image

因為 VirtualBox 找不到讀卡機的關係,必須要有辦法在 ubuntu 讀寫整個 disk image 中的個別
partitions...更新後再到 windows disk image 更新...

原本只知道 mount -o loop 掛載單一 partition 到目錄。
Ken 找到 loop mount disk image 的選項中,有 offset 的選項可以將 root disk image 中的 partition
個別掛載到 linux 目錄。

可以先對 disk image 下 fdisk -ul 或 parted,差別是 parted 可以直接下 unit 給 B 選項知道
partition 在 disk image 中的 byte offset,fdisk 需要從 sector size 轉成 byte

fdisk 指令是給 -u 取得該 disk 的 sector byte size
sudo fdisk -u -l /dev/sdx

parted 指令是給
sudo parted /dev/sdx
unit B (設定 byte offset)
print

parted 可以用 -s 的 script 選項變成對 script 友善的工具。

最後再下 mount -o loop,offset=calcalated_byte_offset whole_disk_image /path/to/dir
掛載其中的單一 partition

參考:

http://www.andremiller.net/content/mounting-hard-disk-image-including-partitions-using-linux

http://nixcraft.com/ubuntu-debian/15295-ubuntu-mount-root-disk-image-loop-device-using-offset.html



2012年1月12日 星期四

Linux sound ALSA soc kernel 文件略讀

主要參考 Documentation/sound/alsa/soc/ 目錄中的文件

    Documentation/sound/alsa/soc/overview.txt
    Codec driver: 包括 audio control, interface, DAPM define, I/O function
    sound/soc/codecs/twl6040.c

    Platform driver: audio DMA and DAI(I2S, PCM, AC97)
    sound/soc/omap/omap-mcbsp.c DMA 控制, DAI system clock

    Machine driver: SoC machine board control and audio event
    sound/soc/omap/sdp4430.c DAI 控制
        1.  Amplifier 控制
        2.  snd_soc_card 註冊為 platform device
        3.  DAI system clock 控制跟 DAI 初始化設定

    Documentation/sound/alsa/soc/DAI.txt
    講 soc codec 常用的 AC97, I2S, PCM 三種 Digital Audio Interface

    Documentation/sound/alsa/soc/clocking.txt
    audio 相關的 clock 描述:
    Master clock, MCLK, SYSCLK
        derived from crystal(fixed), PLL(configurable), CPU clock(configurable)
        to produce correct playback and capture sample rates

    DAI clock
        1.  DAI clock is driven by Bit Clock(BCLK)
        to drive digital audio data between CPU and codec


        2.  frame clock(LRC Left Right Clock, FRAME), is sample rate
        to signal start of audio frame

        3.  BCLK(Bit Clock) 的產生依 CPU 與 audio codec 設定不同而改變
            BCLK = MCLK / x
                or
            BCLK = LRC * x
                or
            BCLK = LRC * Channels * Word size

        4.  BCLK 越慢越能達到節電源的效果
        5.  audio codec 也可以產生 BCLK,通常比 cpu 更精準

    Documentation/sound/alsa/soc/codec.txt
    ASoC codec driver 是通用、不相依於硬體的抽象層,用來設定播放或錄音。
    其中不應有相依於軟硬體平台的程式碼。硬體平台相關程式碼應該放在 platform driver 與 machine driver 中。

    codec driver 必須提供的功能:
    1.  Codec DAI 與 PCM 設定 snd_soc_codec_dai structure
    包括 stream name, channel, rate, format

    2.  Codec control IO
    control_data 指向 i2c/spi/ac97
    reg_cache 指向 codec register map
    read/write 指向 i2c/spi/ac97 的 read/write 介面

    3.  Mixer 與聲音控制
    定義 include/sound/control.h 中的  struct snd_kcontrol_new 內容,可以使用以下 macro:
    include/sound/soc.h 定義的 kcontrol builders macro,如 SOC_SINGLE() 等
    可以建立一個 xname ,以便控制如 Playback Volume 等的暫存器。

    4.  Codec Audio operation
    需要實作 snd_soc_ops 提供的介面,參考

    5.  DAPM 描述
    Dynamic Audio Power Management 描述 codec 元件的電源與控制的暫存器,可以參考 Documentation/sound/alsa/soc/dapm.txt

    6.  DAPM 事件處理
    用來處理 codec domain 與 cpu domain 的事件呼叫,註冊所需的 callback function 即可,是實際執行 power saving 的函式。
164 Power states:-
165
166     SNDRV_CTL_POWER_D0: /* full On */
167     /* vref/mid, clk and osc on, active */
168
169     SNDRV_CTL_POWER_D1: /* partial On */
170     SNDRV_CTL_POWER_D2: /* partial On */
171
172     SNDRV_CTL_POWER_D3hot: /* Off, with power */
173     /* everything off except vref/vmid, inactive */
174
175     SNDRV_CTL_POWER_D3cold: /* Everything Off, without power */
176
    sound/soc/soc-core.c 有實作。呼叫 snd_power_wait() snd_power_change_state()

    7.  Codec DAC 數位靜音控制
    可用在啟動 DACs 之前的數位靜音,避免系統雜音。可確保不會有數位聲音資料傳到 DACs,可以註冊 include/sound/soc-dai.h 其中 struct snd_soc_dai_ops {} 所定義的 digital_mute callback 讓系統呼叫。

    另外系統也有預設定義靜音介面 snd_soc_dai_digital_mute()

    Documentation/sound/alsa/soc/machine.txt
    machine 或稱 board driver 就是將 platform driver 與 codec driver 連結的程式碼,會使用 struct snd_soc_card 在 linux kernel 註冊一個 platform device,提供 probe, remove...介面
  
    DAI 的控制使用 struct snd_soc_dai_link 連接 codec driver 與 cpu DAIs,可用來初始化 DAI system clock 等 DAI 所需的初始化動作,如 machine audio map 跟 codec audio map,或是有未連接的 codec 腳位設定等...snd_soc_dai_link 設定 codec<->CPU 之間的 DAI
    比如:
 58 /* corgi digital audio interface glue - connects codec <--> CPU */
 59 static struct snd_soc_dai_link corgi_dai = {
 60     .name = "WM8731",
 61     .stream_name = "WM8731",
 62     .cpu_dai_name = "pxa-is2-dai",
 63     .codec_dai_name = "wm8731-hifi",
 64     .platform_name = "pxa-pcm-audio",
 65     .codec_name = "wm8713-codec.0-001a",
 66     .init = corgi_wm8731_init,
 67     .ops = &corgi_ops,
 68 };
 69
 70 struct snd_soc_card 再跟 snd_soc_dai_link 連結.
 71
 72 /* corgi audio machine driver */
 73 static struct snd_soc_card snd_soc_corgi = {
 74     .name = "Corgi",
 75     .dai_link = &corgi_dai,
 76     .num_links = 1,
 77 };
 78

    Machine power map 可以擴充 codec power map 成為 audio power map 的一部份,可達到自動開關  speaker/HP amplifiers 等 audio path。machine init function 可以連接 codec 腳位到 jack socket,請參考 soc/pxa/spitz.c 與 dapm.txt

    Machine 的混音器 mixer 控制

Linux kernel alsa 版本查看方式
        1.  linux kernel source code
        include/sound/version.h
        #define CONFIG_SND_VERSION "1.0.21"

        2.  linux run time /proc file
        cat /proc/asound/version

Linux kernel alsa driver 所產生的 /sys 介面 device 檔案,最後會再透過 user space 的 mdev 或 udev (ueventd in android?) 生成 /dev/controlC0 或 /dev/snd/controlC0 等介面,供 alsa lib 與 alsa utility 使用。

2012年1月6日 星期五

TI OMAP DM3730 PWM 控制

DM3730 TRM 的第 16.2.4.6 章節,參考 Figure 16-12 跟 16-13

1. GPTi.TCLR[7] 的 SCPWM 是 Set or Clear PWM,指 PWM 預設 high(Set) or low(Clear)

2. 先設定 GPTi.TLDR 暫存器給定
(0xFFFF FFFF - GPTi.TLDR[31:0] LOAD_VALUE + 1) overflow 觸發的頻率
3. 設定 GPTi.TMAR match 暫存器給定 match 觸發的頻率

overflow 跟 match 的 pulse 頻率設完之後

4. GPTi.TCLR[11:10] 的 TRG 控制 PWM 哪時候要變換 high/low
  TRG == 0x01 是只看 overflow
  TRG == 0x02 是看 overflow 跟 match 的 pulse

5. GPTi.TCLR[12] PT 位元設定 PWM 依 TRG 變換之後是一個 pulse 或維持新準位(high/low)
直到下一次依 TRG 設定的變換

實際的驅動程式範例可以參考:https://github.com/scottellis/omap3-pwm
裡面用到 TI Linux BSP 的 arch/arm/plat-omap/include/plat/dmtimer.h 介面,可以省去
看 datasheet 查暫存器定義的時間