2012/12/20

開始研究 perforce 軟體管理工具

我們之前最常提到git
而git也真的很好用, 但是並非所有客戶都希望使用Git
現在客戶要用perforce這套版本控制軟體

開始研究一下吧!
—————–
官方網站:
http://www.perforce.com/downloads

教學文章:

http://www.weithenn.org/cgi-bin/wiki.pl?Perforce-Version_Control_System

2012/11/22

PSPad 快速管理你的專案source code

標題下得很像現在訪間的書名

感覺好像很強, 但是其實就是一些小技巧而已啦

我們寫程式的工程師, 需要好用的工具來管理程式碼

當然很多不錯的軟體工具,

比較知名的有 “source insight“, 我以前在Linux平台上用過覺得很不錯

.

現在新發現一個小巧工具軟體也很好用

大家可以試試看- “PSPad” (免費軟體)


1) 由資料夾設定專案位置, 以及收錄檔案

2) 更新與同步

2012/10/09

javascript 開啟視窗後, 自動關閉且原本父視窗重新整理

javascript 開啟視窗後,
自動關閉且原本父視窗重新整理
<script type="text/javascript">
    function refreshAndClose() {
        window.opener.location.reload(true);
        window.close();
    }
</script>

當你遇到 [object window]或 [object]錯誤時

你在寫javascript 開啟視窗或其他動作
可能會發生這類的錯誤 : [object window]或 [object]錯誤
原因來自於回傳值

解法之一, 也是比較快的
就是將你的javascript函式加上void()

<a href="javascript:void(window.open('doc3.htm', '', 'width=100,height=200,scrollbars=yes,resizable=yes'));">

2012/09/20

python fail in Cygwin? 自己裝一個吧

使用cygwin當作你在windows環境裡的unix-like介面, 如果遇到指令執行錯誤,像是python太舊的問題, 這裡有個workaround的方式提供~

1,錯誤發生:

File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

2. 分析一下是否環境變數路徑順序的問題
Vincent@VINCENTC_PC /cygdrive/d/codebase
$ python --version
Python 2.6.5

Vincent@VINCENTC_PC /cygdrive/d/codebase
$ which python
/usr/bin/python

Vincent@VINCENTC_PC /cygdrive/d/codebase
$ echo $path

Vincent@VINCENTC_PC /cygdrive/d/codebase
$ echo $PATH
/usr/local/bin:/usr/bin:/cygdrive/c/Perl/site/bin:/cygdrive/c/Perl/bin:/cygdrive/c/Program Files/ARM/bin/win_32-pentium:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windows/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0:/cygdrive/c/Program Files/Microsoft ASP.NET/ASP.NET Web Pages/v1.0:/cygdrive/c/Program Files/Windows Kits/8.0/Windows Performance Toolkit:/cygdrive/c/Program Files/Microsoft SQL Server/110/Tools/Binn:/cygdrive/c/Program Files/ARM/RVCT/Programs/4.1/713/win_32-pentium:/cygdrive/c/Program Files/ARM/RVI/Tools/4.2/39/programs/win_32-pentium:/cygdrive/c/Program Files/ARM/RVD/Core/4.1.2/38/win_32-pentium/bin:/cygdrive/c/Program Files/ARM/Utilities/FLEXlm/10.8.5.0/1/win_32-pentium:/cygdrive/c/Python27:/cygdrive/c/Program Files/Microsoft Visual Studio 11.0/VC/bin:/usr/lib/lapack

(看得出來cygwin創建的環境變數/usr/local/bin:/usr/bin優先於我自己安裝的新版/cygdrive/c/Python27)

3.備份舊版python, 讓系統找到後面環境變數裡的指令python

Vincent@VINCENTC_PC /cygdrive/d/codebase
$ mv /usr/bin/python /usr/bin/pythonBAK

Vincent@VINCENTC_PC /cygdrive/d/codebase
$ which python
/cygdrive/c/Python27/python

4. Build OK

2012/08/27

windows 8 - metro 介面底下的bluetooth 使用API為networking.proximity

Bluetooth 就是 networking.proximity
Bluetooth support is available to Metro style apps through the proximity APIs. There is no other method to do this from a Metro style app.

http://social.msdn.microsoft.com/Forums/en-US/tailoringappsfordevices/thread/8badd5cf-4eaa-4edc-9c6e-9ce90f09b057


A: 有on/off吗
A: 看來沒有@@
A: 如果先打開的話 應該都可以測吧
B: 我剛有看一下
B: 他有兩個API
B: 寫在initialization
B: 可能是on/off

private void ProximityDeviceArrived(Windows.Networking.Proximity.ProximityDevice device)
{
WriteMessageText("Proximate device arrived. id = " + device.DeviceId + "\n");
}

private void ProximityDeviceDeparted(Windows.Networking.Proximity.ProximityDevice device)
{
WriteMessageText("Proximate device departed. id = " + device.DeviceId + "\n");
}

B: 對呀 應該按照她寫的範例 initial 就可以打開BT功能
A: Bluetooth support is available to Metro style apps through the proximity APIs. There is no other method to do this from a Metro style app.
A: 那這句話又是甚麼意思
B: 就是 Bluetooth在 Metro裡面, 可以透過proximity API來實現~ 除此之外沒其它API 可以實現BT
B: 所以 當device 在BT的感測範圍內或外
http://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.proximity.proximitydevice.aspx
B:

The ProximityDevice class has these events.
Event Description
DeviceArrived Occurs when a device enters the proximate range.
DeviceDeparted Occurs when a device leaves the proximate range.

A:

PeerFinder
Enables you to discover another instance of your app on a nearby device and create a socket connection between the peer apps by using a tap gesture or by browsing.

A: 先叫他由設定打開 然後進來測 我只要叫他去找 找的到我就算ok
B: 找得到就表示metro app是work的

2012/08/23

Allegro 超簡筆記

我使用allegro通常都只有基本功能
由於我不是HW工程師 我是寫軟體的
所以通常只想知道:

  • 1-元件位置
  • 2-BUS資訊
  • 3-待測板的對應schematic檔案

幾個步驟看硬體線路與symbol位置 – Allegro

  • 1: 載入板子檔 xxx.brd
  • 2: 選board-outline / 選驚嘆號! (show element) / top或bottom
  • 3: 你就可以輸入關鍵字查詢

2012/08/06

處理msysgit的中文變亂碼

上一篇文章我安裝了msysgit, 可以在windows平台使用git
但是遇到一些中文編碼的問題!

1) git bash介面底下:
经常会碰到有一些中文文件名或者路径被转义成\xx\xx\xx之类的,
此时可以通过git的配置来改变默认转义具体命令如下:
git config core.quotepath false

2) git history (gitk) 的內文可以顯示中文
git config --system i18n.logOutputEncoding gbk
git config --system i18n.commitEncoding gbk

原理:强制log统一使用utf-8编码。
1.在 etc\gitconfig 中添加:
[gui]
encoding = utf-8
[i18n]
commitencoding = utf-8
logoutputencoding = gbk

说明:

  • 1) gui.encoding = utf-8 解决在 $ git gui 和 gitk 里中文乱码。
  • 2) i18n.commitencoding = utf-8 设置 commit log 提交时使用 utf-8 编码,可避免服务器上乱码,同时与Unix上的提交保持一致!
  • 3) i18n.logoutputencoding = gbk 使得在 $ git log 时将 utf-8 编码转换成 gbk 编码,解决 MSYS Bash 中 $ git log 乱码。

2.使得 $ git log 可以正常显示中文(配合i18n.logoutputencoding = gbk),在 etc\profile 中添加:
export LESSCHARSET=utf-8

Ref:

解决msysGit的中文录入问题

msysGit的shell环境中无法输入中文的,想要输入中文,我们需要修改下配置文件/etc/inputrc。
步骤1:进入git安装目录,找到/etc/inputrc;
步骤2:修改配置项
找到如下配置代码
set output-meta off
set convert-meta on
修改成
set output-meta on
set convert-meta off

步骤3:关闭git bash然后再重启
就可以在shell环境中输入中文了

2012/07/30

雲端管理你的程式碼: Dropbox + Git

之前我就在思考如何管理程式碼,因為程式碼很重要
如果使用一個有效率的管理機制的話,就可以跨平台的使用
畢竟現在平台有可能是Linux或是Windows,或更多作業系統~

上次我把程式碼管理透過一台Linux主機
我滿喜歡這樣管哩, 滿方便的! 但是現在這台主機可能必須還別人
下次可能要重新設置在另一台Linux主機~ 有點麻煩

雲端工具 Dropbox
所以我把腦筋動到了雲端工具 Dropbox
索性google了一下關鍵字: “Dropbox git”
沒想到真的有人跟我有一樣的想法, 透過dropbox管理程式碼

我的作法
類似這篇文章, 在Dropbox上建立Server端原始碼的repo git,讓個平台再重dropbox上作git clone到client端

root@ROOT-PC /C/Users/root/Dropbox/project$git clone file://git@127.0.0.1/C/Users/root/Dropbox/git/project.git

不過我有點不一樣
就是我連client端都是在dropbox資料夾裡面
主要這樣作是因為我的程式碼都是HTML,PHP的網頁文字檔而已
若以後的程式碼需要被編譯, 我就會跟這篇文章一樣

步驟

(假設程式碼已經放入資料夾 ~/Dropbox/project裡)在Dropbox上建立Client端:~/Dropbox/project $ git init~/Dropbox/project $ git add .~/Dropbox/project $ git commit -m “first commit”~/Dropbox/project $ cd ~/Dropbox/git--在Dropbox上建立Server端:~/Dropbox/git $ mkdir project.git~/Dropbox/git $ cd project.git~/Dropbox/git $ git init –bare~/Dropbox/git $ cd ~/project--將Client端的資料push到Server端:~/Dropbox/project $ git remote add origin ~/Dropbox/git/project.git~/Dropbox/project $ git push origin master

Git使用方式

在Linux平台:
使用就是透過git指令, ex: git status, git commit, git push, git log …

在windows平台:
我使用這工具msysgit,
可以方便你在資料夾按右鍵就選git bash執行git指令
參考自 http://www.mrmu.com.tw/2011/05/06/git-tutorial-for-beginner/

2012/07/25

X86系統的生態, 處理器彼此如何溝通呢? CPU/北橋/南橋/EC

作為一個X86的工程師, 基本的晶片各自負責的工作都要知道一下, 還有使用的bus prototype等等, 有點不同於SOC處理晶片幾乎全包了, 在X86處理器通常會有北橋與南橋協助處理週邊高速與低速裝置! X86系統的生態, 處理器彼此如何溝通呢? 我本來以為就CPU管全部的devices/components, 後來我發現我錯了, CPU主要只管邏輯運算那塊, 其他的周邊裝置是南北橋管的! 突然覺得跟人體很像, 應該說電腦當初的設計就是根據人類的構造去發想的吧, 大腦負責運算思考小腦 …脊椎 … / CPU..北橋..南僑..EC


CPU-就是所謂的中央處理器或中央處理單元

也就是CentralProcessingUnit的縮寫。CPU是驅動整個電腦運作的中心樞紐,又稱電腦的心臟,其內部包括控制單元、算術及邏輯單元、暫存器或記憶單元。當電腦系統開始運作時,CPU從記憶體內,讀取操作它的軟體的指令與資料,透過ALU運算出結果後存回記憶體,同時由主機板,與外界的I/O週邊溝通,達到資料處理的目的。CPU會因其硬體架構如資料/指令格式、分配、解碼、介面與運作方式的不同有差異,而且用途也可能不一。

CPU基本架構:

  • 算術及邏輯運算單元(ALU):加、減、乘、除及比較、選擇、判斷等運算。
  • 控制單元(CU):翻譯程式中的指令的解碼功能及協調控制各部門依指令執行使電腦自動化處理資料。
  • 記憶單元(memory):儲存目前正要被處理運算的程式或資料,容量以KB為單位。
  • 輸入單元(Input,I/P):接受輸入的資料或程式,以供進一步處理。如:鍵盤、滑鼠等。
  • 輸出單元(Output,O/P):負責將CPU處理結果輸出,輸出於各種輸出設備上,如:印表機、磁碟機等。
  • 暫存器(Register):暫時儲存資料,如用來儲存運算的累積器。其功能與記憶體相似。

CPU內部較重要的暫存器:

  • 程式計數器PC(Program Counter):負責儲存CPU下一次所要執的記憶體位址。
  • 指令暫存器IR(Instruction Register):負責儲存CPU所要執行的指令。
  • 堆疊指標器SP(Stack Pointer):負責儲存CPU目前使用的堆疊位址。
  • 位址暫存器MAR:負責儲存CPU所要存取記憶體資料的位址。

北橋晶片

北橋是主機板上最重要的晶片,主要是控制CPU、記憶體、AGP或PCI-E×16插槽(顯示卡專用)等設備的高速整合晶片,其傳輸速度可達每秒數GB來計算的,比如CPU(8~10 GB/s)、記憶體(8~10 GB/s)、顯示卡(8 GB/s),與南橋晶片兩顆合稱晶片組,越高級的北橋晶片支援的CPU、記憶體的頻率越高(例如圖中P35晶片支援最高到FSB1333,超頻可上1600、且支援雙通道架構的DDRII 667 800,超頻可上1066)

南橋晶片

和北橋互連並連接其他週邊,我們熟知的主機板「功能」大多來自南橋,南橋連接慢速週邊,傳輸速度以每秒數MB來計算,例如硬碟(375 MB/s)、USB(60 MB/s)、PCI(133 MB/s),例如鍵盤滑鼠、印表機、USB、網路、音效、SATA/IDE硬碟。

討論-界線模糊的北橋和南橋 (引用自mobile01)

為什麼要分南北橋?
南北橋是主機板上最主要的晶片,通常是上游晶片組廠商(NVIDIA、AMD、Intel)賣出晶片,下游板卡廠(華碩、技嘉、微星等等)再做成主機板,某些極少數的主機板是由晶片組廠商自行生產,再以完整的板子賣給下游板卡廠去出貨。

先來一張之前用過的晶片組簡易架構圖:

為什麼要分成北橋和南橋?這主要是兩個考量:設計和製造。就晶片設計的角度,如果要讓東西溝通的速度越快,那就讓它們越靠近越好,只要一分離,勢必就得拉出傳輸的通道,而有通道就要佈線、就有傳輸的延遲。如果可以的話,最好是把所有功能全部塞進一顆晶片內,可是必須考量到晶片製造的難度,廠商一定想賺錢,如果設計出一顆根本生產不出來、或太貴沒人要買的晶片也沒用。

北橋和南橋就是在這樣的取捨下分離,現在晶片組搭載的功能超多,而且很多週邊的速度太快,很難在一顆晶片內搞定,所以就讓需要高速傳輸的功能靠近CPU,並獨立成北橋晶片,而其他較慢速的週邊就變成南橋來連接北橋,與CPU做間接傳輸。

當然,整合南北橋變成一顆晶片是絕對是可行的,只要設計和製造難度允許,很多廠商都出過單晶片的產品,但通常是AMD平台或功能較少的入門晶片組,因為花樣少、製造難度較低,做成單晶片會有利於降低成本。

南北橋的功用

我們先以最標準的Intel的南北橋架構做解說,特別的案例最後再聊。這部分免不了要看晶片組的架構圖,別太緊張,其實看架構圖會比看實際的板子更容易了解晶片組的設計,只不過是一些PowerPoint的方塊圖而已


Intel P35晶片組的架構圖,這是非常標準的南北橋設計,由P35北橋加ICH9南橋,旁邊都有標上通道的速度,可明顯看出南橋連出去的週邊都比北橋慢。

北橋所連的都是高速傳輸的週邊,包括CPU、記憶體和顯示卡,也就是電腦最核心的三項零組件,只要其中有一項產品出現大改的新規格,相對應的北橋就一定要出新版,而換北橋就是出新的主機板,換主機板差不多就是砍掉重練整台電腦,也就是大家常說的世代交替或敗家升級了。

基本上,北橋可視為一堆通道的集合體,有專屬的通道連往CPU、記憶體、顯示卡和南橋,透過北橋這個轉運中心,CPU就可接收和送出資料給所有電腦週邊。

1.CPU通道
北橋和CPU連接的通道就是Intel的FSB或AMD的HyperTransport,在CPU的章節已經提過很多次,這是CPU對外的溝通管道,也就是和北橋連接,進而與所有週邊溝通。很直覺的,CPU和北橋的FSB和HyperTransport,兩邊一定要配對才能使用,或是北橋支援的FSB/HyperTransport速度要高於CPU的,也就是新主機板能向下相容舊CPU,但舊主機板不一定能向上相容新CPU(注意是不一定,例外到處都有,能不斷向上相容的板子很多,台灣板卡廠RD太強了)。

CPU每隔一兩年,對外的FSB或HyperTransport的速度就會提升,自然就會有新的北橋出現與它搭配,比如AMD最近要推新的AM2+ CPU,支援HyperTransport到最新的3.0版,時脈達2GHz(之前的是1GHz),AMD就推出新的RD790北橋來搭配。除了CPU與北橋之間的通道要匹配之外,當然還有CPU腳位的問題,如果CPU更改傳輸腳位的定義,主機板上的北橋通常也要更新或修改才能支援。

2.記憶體通道
北橋另一個重點是記憶體控制器,直接決定支援的記憶體種類和時脈,時脈的部分,就是由CPU的外頻,乘上北橋裡控制器內附的比值,計算出記憶體時脈。比如CPU的外頻是266,北橋設定的比值是1:1.5,那記憶體的真實時脈就會是266×1.5=400MHz,DDR之後就是800MHz。這個比值有很多種,計算方式也不一定都是這樣,但無論如何,都是由北橋的記憶體控制器來決定算法和時脈。至於記憶體種類,北橋通常只會支援一種記憶體,比如現在主流的DDR2,但在世代交替的當口,就會出現同時支援兩種記憶體的北橋,以緩和世代轉換的陣痛,像Intel現在正要推行DDR3新規格,P35/X38晶片組就同時支援DDR2和DDR3。

3.顯示卡
顯示卡是近幾年才變成高速週邊的,當它開始需要大頻寬時,北橋其實並沒有對應的匯流排可用(PCI的每秒133MB頻寬太慢了),所以才會有AGP的出現。AGP是專門給顯示卡用的擴充「埠」,它是一對一的通道,不是匯流排,北橋內建一個AGP埠就只能插一張顯示卡。由於AGP限制太多,所以現在都改用PCI-Express,希望可以統合PCI和AGP,做為擴充卡的匯流排單一標準。不過結果大家都看的到,AGP是差不多淘汰了,但PCI還活的好好的。PCI-Express的設計是以Lane為主,每條Lane就像一條獨立車道,雙向頻寬是每秒500MB,北橋會支援一個固定的Lane數,但可自由調配組合成寬度不一的道路。比如NVIDIA MCP55支援PCI-E Lanes x28,當插一張顯示卡時,就可以用PCI-E x16的速度,插兩張顯示卡時就變x8加x8,剩下的12 Lanes,可以再分成x8、x4、x1等不同數目的插槽,給不同的擴充卡週邊使用。

另外,一些低階的北橋產品也會直接內建顯示晶片,當然,在設計與製造成本的考量下,內建顯示晶片通常就是拿來「顯示」而已,3D能力絕對比不上同一個世代的獨立顯示卡,不過針對它所在的定位,只要能顯示畫面就很夠了。

4.包山包海的南橋
相對於北橋都是高速週邊,南橋就是比較功能面的,除了以上那些核心零組件之外,其他都是放在南橋,比如PCI插槽、IDE/SATA硬碟介面、大家一定用過的USB、AC97或HD Audio音效和10/100/1000網路,如果板卡廠願意,還可以另加晶片和南橋連接,讓主機板的附加價值更高,比如快閃記憶體(ReadyBoost)、無線網路、IEEE 1394、RAID晶片……。由於南橋晶片的獨立性和它所控制的功能面,晶片組廠商都會讓一顆北橋搭配不同的南橋,做出不同定位與附加功能的晶片組產品。

雖然現在晶片組的南橋都已經包山包海,但廠商為了增加附加價值,可能自己還會在主機板外加晶片,塞進更多功能,比如這顆VIA VT6308P就是讓主機板多出IEEE 1394功能的晶片。現在的南橋都有內建音效,但那只有「數位音效處理」,要讓主機板可以直接發聲,必需把數位音訊轉換成類比輸出,才能連接耳機或喇叭,而這個數位/類比的轉換晶片,南橋通常不會內建,所以主機板都會有一顆類似照片中「ALC888T」的Audio Codec,負責轉換成類比輸出,或是顛倒過來,把類比轉成數位做出錄音功能。南橋的網路功能通常只有提供MAC,做為網路數位資料的傳輸功能,但要真正支援實體網路線的電子訊號傳輸,還要另外再加網路PHY晶片,比如照片中的RTL811B。

BIOS (basic input output system 即基本輸入輸出系統)

水銀電池是系統BIOS的主要供電來源, BIOS(黃圈處),是主機板內建的「系統軟體」,用來辨識主機板上的各式裝置,調整各種設定,再交給作業系統啟動,BIOS是開機過程中的第一步,BIOS辨識完畢之後再給作業系統接手。BIOS軟體通常放在一個很小的Flash ROM儲存裝置(可以刷BIOS更新內容)。

BIOS 是被固定在電腦主板上的ROM晶片中的一群組程式:
(引用出處) 其主要功能是為電腦提供最底層的、最直接的硬體設定和控制。BIOS設定程式是儲存在BIOS晶片中的,只有在開機時才可以進行設定。CMOS主要用於存儲BIOS設定程式所設定的參數與資料,而BIOS設定程式主要對技巧的基本輸入輸出系統進行管理和設定,是系統執行在最好狀態下,使用BIOS設定程式還可以排除系統故障或是診斷系統問題。 準確地說,BIOS是硬體與軟體程式之間的一個「轉換器」或是說是接口(雖然它本身也只是一個程式),負責解決硬體的即時需求,並按軟體對硬體的動作要求具體執行。

BIOS分為三大功能:

  1. 自檢及起始化程式 (System startup & Boot process)
    • 這部分負責啟動電腦,具體有三個部分,第一個部分是用於電腦剛接通電源時對硬體部分的檢驗,也叫做加電自檢(POST),功能是檢查電腦是否良好,例如記憶體有無故障等。第二個部分是起始化,內含建立中斷向量、設定寄存器、對一些外部裝置進行起始化和檢驗等,其中很重要的一部分是BIOS設定,主要是對硬體設定的一些參數,當電腦啟動時會讀取這些參數,並和實際硬體設定進行比較,若果不符合,會影響系統的啟動。最後一個部分是引導程式,功能是引導DOS或其他動作系統。BIOS先從軟碟或硬碟的開始扇區讀取引導記錄,若果沒有找到,則會在顯示器上顯示沒有引導裝置,若果找到引導記錄會把電腦的控制權轉給引導記錄,由引導記錄把動作系統裝入電腦,在電腦啟動成功後,BIOS的這部分任務就完成了。
  2. 硬體中斷處理 (BIOS interrupt calls)
  3. 程式服務請求 (Operating system services)
    • 這兩部分是兩個獨立的內容,但在使用上密切關聯。
      程式服務處理程式主要是為套用程式和動作系統服務,這些服務主要與輸入綉輸出裝置有關,例如讀磁碟、檔案輸出到印表機等。為了完成這些動作,BIOS必須直接與電腦的I/O裝置打交道,它通過連接埠發出指令,向各種外部裝置傳輸資料以及從它們那兒接收資料,使程式能夠脫離具體的硬體動作,而硬體中斷處理則分別處理PC機硬體的需求,因此這兩部分分別為軟體和硬體服務,群組合到一起,使電腦系統標準執行。BIOS的服務功能是通過呼叫中斷服務程式來實現的,這些服務分為很多群組,每群組有一個專門的中斷。例如視訊服務,中斷號為10H;螢幕列印,中斷號為05H;磁碟及序列口服務,中斷14H等。每一群組又根據具體功能細分為不同的服務號。套用程式需要使用哪些外設、進行什麼動作只需要在程式中用相應的指令說明即可,無需直接控制。

 

2012/07/02

putty config 之 Windows Registry Editor

之前寫了一篇在windows底下設定putty的方法, 熟悉windows的人應該會知道registry是windows重要的設定方式

今天學到一個小技巧,可以匯出registry設定檔
修改某一部分之後,再重新執行就可以將windows作業系統裡的registry修改完畢
.

按右鍵>匯出 (改完之後再執行該檔案即可匯入)

2012/06/20

深入I2C/smbus匯流排 解決多重主控端所引發之各種問題

i2c-smbus-difference.pdf
https://docs.google.com/open?id=0B7Hc2mvu-wI_eFROSzVUZzVqbkk

I2C信號的原理與解碼
https://docs.google.com/open?id=0B7Hc2mvu-wI_ZWZmYWY4MWQtN2Q1MC00YmMwLThhN2YtODExNTgwODk0ZWY3

深入I2C匯流排 解決多重主控端所引發之各種問題
新通訊 2005 年 8 月號 54 期《 技術前瞻 》
文.陳乃塘
相信從事產品規劃或是工程人員,或多或少在元件規格中會見到I2C介面的存在,也許也見過SM-Bus,兩者究竟有何差異?兩造的內在又是如何,相信是很多人想去知道的事情…
相信從事產品規劃或是工程人員,或多或少在元件規格中會見到I2C介面的存在,也許也見過SM-Bus,兩者究竟有何差異?兩造的內在又是如何,相信是很多人想去知道的事情。一個歷經時間打不死的介面,必然有其前因與後果。有不少場合,I2C介面也被寫成I2C介面,是指向同樣東西。 

回首1980年代初期,飛利浦半導體為了積體電路內部的連接方便,發展了兩線式(2 Wire)的雙向介面,當時將之稱作「Inter-IC」介面,簡稱I2C介面或I2C匯流排,原本的目的是為了在電視機內部讓處理器CPU晶片與周邊晶片更容易連接。我們都知道嵌入式系統的設計,連接到MCU控制器的周邊裝置往往用記憶體映射的I/O處理方式,換句話說,在線路板上的微控制器必須連接一堆的位址信號線(Address Bus)與資料信號線(Data Bus)。不用多說,必要的位址解碼線路以及額外的邏輯線路是跑不掉的,這一點對於像電視機、錄放影機或音響機器在大量生產的時候,是很不利的一面,至於多條控制線引起額外的副作用,好比說電磁干擾EMI等,也是惱人的問題。

飛利浦為了克服這個問題,座落於荷蘭Eindhoven的實驗室,最終發展出I2C介面。由於容易使用,讓積體電路之間的控制更為有效率。此介面逐漸成為產業上一個泛用的標準。目前,該公司有超過1,000種以上的元件,諸如控制器等都內建了此介面。同時,I2C介面也授權給很多知名公司使用,好比說Xicor、ST Microelectronics、英飛凌、Intel、TI、Maxim、Atmel、Analog Devices等。

意思是說,只要在晶片上納入了I2C介面,元件之間就可以直接透過該介面來彼此溝通,尤其是設計數位控制電路的時候,這個介面或許可以幫您解決不少問題。

I2C匯流排的基本傳輸協定

從信號的實質面來看,I2C介面僅包含了兩條主動信號線以及一條地線,這兩條主動信號線分別是「SDA」與「SCL」,兩者皆是雙方向的傳輸信號線。

‧SDA=Serial DAta line

‧SCL=Serial CLock line

每一個連接到匯流排上的元件裝置,無論是MCU控制器、LCD驅動器或ASIC,都會擁有其唯一的位址,依據功能上的差異,每一個元件可以是傳送端或是接收端,比如說,LCD驅動器僅僅是接收端,而像一些記憶體晶片或是I/O晶片很可能是兩者具備。

正如同一般匯流排的慣例,啟動資料傳輸的一方稱之為主控端(Bus Master),非主控端的元件就是從屬端(Bus Slave),有趣的地方是,I2C介面可以是隸屬一個多重主控端(Multi-Master)的匯流排架構。

通常,微控制器MCU總是扮演著主控端的角色,如果微控制器要送資料到某一個從屬端,首先,微控制器會送出「起始」(Start)的狀態,有如告知所有連接元件的注意信號,介面上的元件就要留意有資料即將到來,接著,主控端送出要存取元件的位址,以及讀取或是寫入的資訊,若接收元件獲知是自己的位址,就必須回應認可(Acknowledge)信號,若是位址事不關己則不予理會。

一旦微控制器MCU接收到認可信號之後,才開始傳送接收資料,當完成資料傳輸之後,微控制器MCU送出「結束(Stop)」狀況,也就是表示將介面釋放出來,其他的元件可以起始新的動作。若是就介面的狀態來說,介面有起始狀態(Start)、位址狀態(Address)、認可狀態(ACK)、資料狀態與結束狀態(Stop)。

I2C匯流排的硬體結構

誠如前面所言,SDA與SCL皆是雙向的信號線,通常,這些信號採用開集極(Open Collector)或開源極(Open Drain)的技術。當介面處於閒置(Idle)狀態,介面信號線就呈現邏輯高(Logic HIGH)狀態,因為外部往往接一個拉高電阻,當驅動信號到介面時,晶片會驅動其輸出電晶體,將介面拉到邏輯低狀態。

不過,開集極的技巧也有一個缺點,假若介面長度太長時,因為長距離的介面在輸出驅動器上會呈現電容負載(Capacitive Load)的效應,速度會落下來(圖1)。因為,拉高電阻是被動式元件,與電容器C會產生RC常數,而影響到信號波形的外觀,當RC常數越大時,會影響到信號的迴轉率(Slew Rate),而將速度拉下來。當到了最壞的情況下時,介面上的積體電路甚至難以分別究竟是邏輯一還是邏輯零的信號狀態,信號動作自然出問題啦!

還有一個令人困擾的問題,就是當信號快速的時候,信號反射引起的負效應也是令人難以忍受的問題(圖2)。通常,IC的輸入端會用舒密特觸發(Schmitt Triggers)的電路型態,但是,嚴重的時候也難以克服這道難題,因此在電氣特性的規定就需要更為嚴謹。為了解決該問題,飛利浦半導體發展出主動式終端阻抗(Active Terminator)的方式(圖3),這種元件會包含有一對電荷幫浦(Charge Pump),您可以將其視為介面上的一個動態阻抗,如此措施的好處就是可以很快速地將寄生電容充電,一但電壓高過某個位階,高電流模式就會火速切斷輸出電流。

請仔細看圖3,只要介面維持在邏輯低的時候,電晶體C是開著,這時候由於電晶體B的柵極(Gate)也維持在低電位,因此電荷幫浦就會被關閉。

只要元件晶片釋放出匯流排,電晶體A與電晶體C就會關閉。電容將從四個電阻汲取電流開始充電,當電阻2的電壓降將會開啟電晶體B,將電阻3短路。由於電阻3的數值很小,電流上升。但很快地,電晶體B的柵極(Gate)與源極(Source)將不足夠維持開關開起,開關關閉之後,電流注入停止,這個時候就僅有外部的拉高電阻存在來克服介面上的漏電流(Leakage)問題。

I2C介面的使用仲裁議題

I2C介面是一個多重主控端的匯流排,也就是有機會多個元件會激發傳送,如果在系統上僅有一個主控端,並不會發生什麼資料毀損的風險,除非從屬元件發生了狀況,但是若有兩個以上微控制器存在的場合,情況就可能改觀了(圖4)。

就如圖4,首先當微控制器1送出起始狀態後並送出位址資訊,此時所有的從屬元件,包括微控制器2都在等候,只要位址並不是指向微控制器2,該元件就會抑制任何活動,直到介面匯流排在停止狀態後回到閒置(Idle)的狀態。

當然只要該兩個微控制器的介面監視機能電路做得好,對於介面上的活動瞭若指掌,基本上並不會有問題產生,但是畢竟這是指理想的情況下而說的,意外的人生也同樣會發生在介面上。我們就姑且假設某一個微控制器未察覺到起始狀態,因此它依然會以為介面是處於閒置狀態,而打算開始使用介面,此時,問題就可能跟著來了。

因為,基本的疑問就是您如何知道有其他元件正在介面上傳載資料。幸好,介面的結構是「Wired AND」的型態,也就是說,只要有一個元件驅使在邏輯低,信號線就會維持在邏輯低,因此,您可以測試介面是被佔用還是閒置狀態。

當某一個主控器改變了信號狀態到邏輯高的時候,它必須去檢查是否信號線真的跑到邏輯高,萬一信號線卻呈現在邏輯低的狀況,這就表示著介面是被佔據掉,有其他元件將信號線拉低。

因此,通用的經驗法則是如果主控器並不能確定信號線確實拉高,寧可先放棄(Back Off)等候,到看見停止狀態的出現才開始傳送。

接著,我們來談談資料崩毀(Data Corruption)到底是怎麼一回事。剛前所說是指主控器不能確定SCL或SDA信號線拉高時,會喪失了匯流排使用仲裁權,也指出了送出邏輯零的元件支配了介面。然而,此種放棄的方法,對於主控器不同時運作是可行的,但是,如果兩個主控器剛剛好同時進行時,有趣的問題就出現了(圖5)。

請對照圖5,兩個微控制器MCU正針對位址為「1111001」的從屬裝置進行資料寫入模式,兩個微控制器咸認為他們擁有匯流排的使用權。MCU1要傳送資料「0101.0101」給從屬端,而MCU2要傳送資料「0110.0110」給從屬端,這時候,資料線就衝突發生了,因此,需要妥協的辦法才能夠解決。以圖5為例,MCU2先行放棄,也就是途中色塊的部分,等候到看見停止狀態的出現,才另開始傳送。從此例我們就可以學到一課,那就是匯流排使用權仲裁(Arbitration)的機制,哪一個主控端先拉低,誰就贏得優先使用權。當然啦!仲裁輸的一方唯有等待介面出現停止狀態的出現,才開始傳送。

其次,來談時脈同步(Clock Synchronization)之道。我們明瞭所有的主控端會在SCL信號線上產生其自己的時脈(Clock)在I2C介面上載送訊息。依照規定,時脈信號在高電位時,資料才具有實效性,I2C介面對於SCL信號是採用了「Wired-AND」的連接形式,當SCL信號線從邏輯高轉換到邏輯低時,所有的元件會關心邏輯低的時間,如果時脈從低電位轉換到高電位並不等於SCL信號線一定會在邏輯高,因為,有可能其他的時脈尚在低電位。如果經過所有元件關心的低電位時間,時脈信號線將釋放到高電位,第一個完成高電位時脈週期的元件,會先拉低SCL信號線,因此,可以得知SCL信號的同步,低電位乃是取決於時脈低電位時間最長的元件,而時脈高電位則是取決於時脈高電位週期最短的元件。

如此般的時脈同步機制,就可以拿來作為信號交握(Handshake)的用途。比如說,慢速元件與快速元件或是在多個主控端的場合來使用,這裡所說的慢速元件是指元件內部執行時間,好比說,EEPROM元件需要耗一點時間去寫入資料。I2C介面的同步方式是由SCL信號線來擔當,當從屬端需要主控端來等待的場合,只需將SCL信號拉低,主控端就不會產生ACK的波形。

這種手段,坦白說是存在不少的缺點。第一個能夠想到的問題就是電路設計出了問題,SCL信號線陷入困境,所有的主控端也相對地掉入僵局。當然,可以用逾時(Timeout)的方法來打破僵持不下的停頓狀況,間接地說,就是會影響到速率。

1982年首個I2C規格出現,到了1992年,I2C規格增加了快速模式(Fast Mode)以及10位元的定址方式。對於快速模式來說,實體上介面參數諸如協定、介面位階、電容負載等並沒有變更,只是將資料傳送速率拉升到400Kbps的高水準,當然約束就比較嚴謹,尤其是時序上的考量。所有支援快速模式(Fast Mode)的元件,其輸入端必須納入舒密特觸發(Schmitt Triggers)的電氣特性,可以用來抑制雜訊。輸出端緩衝器要具備斜率控制的能力,能夠讓SDA與SCL信號產生漂亮的下沿,同時,支援快速模式的元件電源關閉之際,介面上的接腳信號也必須維持在漂浮(Floating)狀態,避免妨礙到介面的正常運作,且必須適應拉高電阻的使用。通常200pF的負載情況使用被動式的電阻元件就可以了,若是200~400pF的高負載,建議採用主動式的電流源。

好比USB介面的鳳凰傳奇,I2C介面的驚人之舉就是介面速度的大躍升,增加了高速模式(High Mode),將速率提升到3.4Mbps,而且依然可以與傳統標準模式或快速模式相容。

從原本7個位元的位址增加到10個位元的定址能力,稱之為延伸定址(Extended Addressing)。符合這個新標準的晶片理所當然需要兩個位址位元組,第一個位元組包含了位址的兩個MSB以及讀出/寫入位元,第二個位元組即是位址的8個LSB。在介面上產生任何資料交易(Transaction)之前都必須先發出起始狀態。意思是說該狀態是對所有的連接的元件扮演一個通知的信號,告知即將傳送資料,因此,介面上的所有元件都在等待。當交易完成之後,也必須送出結束的狀態,也就是釋放出匯流排的使用權,讓介面回到閒置的情況下(圖6)。

有一些小細節需要去在意,一筆單獨的訊息交易允許多個起始狀態的發生,而結束狀態不管發生在哪一個時間點,一定表示傳送交易的結束。

一旦主控端送出起始狀態後,就能夠傳送一個位元組給從屬端,在起始狀態之後的第一個位元組就是從屬端的位址。但前面有提到新規格追加了10位元位址延伸定址模式,勢必有第二個位元組,如果是不支援延伸定址的元件,什麼都不必作(圖7)。

如果從屬端支援10位元延伸定址模式,就必須在主控端送出的認可(ACK)狀態之後,作出回應。請留意,無論是傳統的定址模式還是10位元延伸定址模式,第一個位元組的位元零(Bit 0)一定是定義為從屬端的存取模式。

‧邏輯1=讀取(Read)模式

‧邏輯0=寫入(Write)模式

如果從屬端被定址也認可之後,若R/W位元設定為邏輯1,就可以接收從屬端送來的一個位元組,此時,主控端會先釋放SDA信號線,因為從屬端必須擁有該信號的控制權,但是,時脈信號SCL依然還是必須由主控端來產生(圖8)。主控端產生SCL的上沿(2),讀取SDA資訊(3),然後產生SCL的下沿(4),因此,從屬端在SCL邏輯高的時間內是不能改變資料的。在圖8步驟(1)與步驟(5)期間,從屬端可以更新資料。總之,以上的順序總共執行8次完成一個位元組的載送,而且是從MSB位元開始送,至於位元組各個位元的涵義,就必須檢視從屬端元件的資料規範了(圖9)。

當一個位元組(資料或位址)送往從屬端之後,從屬端也必須做出認可(ACK)的回應(圖10)。從屬端在接收第八個位元之後,立即將SDA信號拉低,也就是主控端拉低SCL(1)表示完成位元傳送,從屬端繼續拉低SDA信號線(2),主控端會在SCL信號產生一個脈衝(3),爾後,從屬端在時脈結束之際釋放出SDA信號線(4),這時候主控端可以使用介面繼續送資料產生結束狀態。

相同的道理,當接收到從屬端送來的位元組之後,主控端元件也必須做出認可(ACK)的回應。在這個情形下,SDA與SCL信號線的掌控權完全是在主控端手上(圖11)。

當從屬端送完最後一個位元之後(1),從屬端就會釋放出SDA信號線(2),而主控端卻會將該信號拉低(3),其次,主控端在SCL信號線上產生一個脈衝(4),完成脈衝後,主控端將釋出SDA信號線,此時,從屬端就再次獲得SDA信號線的控制權。如果主控端想要停止從屬端送過來的接收,它必須能夠送出停止的狀態。

有一種情況是當主控端送完第八個位元之後,從屬端並沒有將SDA信號拉低,這種情況被視為「No ACK」的事件,但它不是一種狀態,通常意味著從屬端不在那(如果是位址)、從屬端漏掉了脈衝,或介面被Down掉了。不論是何種狀況,主控端都要對介面送出停止狀態。讓介面回歸到正常動作。

常見問題解答

文章末了,將一些平常對於I2C介面的詢問做個條列式整理摘要,方便讀者們閱讀。

‧I2C介面的最長連接距離為何?這個問題的答案與介面上的負載相關聯,典型的應用約是9~12英尺左右。

‧若要延長I2C介面,有沒有類似中繼器(Repeater)解決方法?當然有,這是屬於電流放大器(Current Amplifier)的屬性(圖12),可以解決線長的電容負載。然而,傳送端以及接收端必須搭配使用,避免衍生困擾。

‧市面上有沒有存在獨立的I2C介面控制器?確實有,比如PCD8584或PCF8584等元件。

‧為何SCL信號線必須為雙向?理由很單純,當使用多個主控制的場合就需要了。

‧如何來追蹤I2C介面上的信號活動?市面上有一些廠商在販售監視裝置(Monitor)或是除錯工具(Debugger),可以上網查詢。

‧I2C介面與SMbus的差異究竟在哪裡?這是一個絕佳的好問題,兩者都是兩線式(2-Wire) 的介面,基本上是彼此相容的。然而,SMbus的動作速度僅有100KHz,I2C介面尚有400KHz與2MHz,因此,相容性是指有限度的相容性。

逾時(Timeout)以及最小的時脈速度,可以說是I2C介面與SMbus的最大差異。

‧I2C Bus=DC(no timeout)

‧SMBus=10kHz(35ms timeout)

其次,若仔細來觀察信號邏輯位階,兩者還是有所不同,請參閱圖13。同時,拉高電阻與電流位階(Current Level)也是個好問題,SMBus規定的沉入電流(Sink Current)為100uA~350uA,而I2C介面卻是3mA,也就間接決定了拉高電阻的可接受值。

 

2012/05/25

關於 Windows Driver 之 WDF(Windows Driver Foundation或Framework)架構

關於 Windows Driver.
———————————————————–
從 Windows Vista之後的平台,
開始使用WDF(Windows Driver Foundation或Framework)架構來寫Driver
在之前的平台主要是依照WDM來寫 (Windows Driver Modle)
且WDF可以相容於WDM

1 : Architecture of the Windows Driver Foundation
http://msdn.microsoft.com/en-us/windows/hardware/gg463314.aspx

2 : 此檔是大陸微軟的: Windows Vista 时代的驱动程序开发
這兩份檔案裡頭的圖是一樣的, 可以一起看
——————————————————————————————————–

2012/05/23

Yahoo站長工具關閉,並轉為Bing Webmaster Tools

“業界的變化是很大的”, 這句話也同樣印證在yahoo與microsoft的關係上,為什麼會這樣說呢? 因為之前Yahoo的Site Explorer明明就作得很不錯, 足以跟Google webmasters抗衡, 但是殺出個程咬金的大金主微軟,硬是讓yahoo與microsoft合作Bing Webmaster Tools


風光一時的ahoo Site Explorer

參考:
Yahoo Site Explorer关闭

2012/05/22

[windows]小畫家不見了, 怎麼辦?

通常如果電腦裡面的小畫家找不到, 可以用兩種方法處理
我也是找了一下資料:

通常小畫家不見了可能有兩種情況,一種是某天頭昏眼花不小心刪掉;另一種則是安裝作業系統時,就沒有安裝進去。

解決方式不會很難,前者可以去 C:\WINDOWS\system32\ 裡面找 mspaint.exe 這個檔案,按右鍵傳送到桌面當捷徑、或者拉到自己方便開啟的地方即可;至於後者需要作業系統安裝片才能解決,步驟如下:
01.進入「控制台」→打開「新增或移除程式」→點選「新增/移除 Windows 元件」
02.看跳出的「Windows 元件精靈」視窗中,將第一項 “Accessories and Utilities” 打勾
03.若有打勾則點選「詳細資料」→「附屬應用程式」的「詳細資料」
04.將「小畫家」勾選即開始安裝,記得要放進安裝片喔!

2012/05/21

windows底下,如何查詢USB的VID與PID?

方法一:可以使用ChipGenius
它是USB晶片製造商專門用來大量生產USB隨身碟的工具,只要用這個工具就能把同樣的USB晶片,客製化成各種不同用途的隨身碟,例如:內建開機碟區的開機隨身碟、一般儲存隨身碟、模擬成硬碟的USB-HDD…等。

[下載網址]

其實我只是單純要知道USB的VID與PID,
而不需要製作開機USB碟或是rebuild

但是ChipGenius功能滿強大的,
使用的話要注意一下, 資料先備份!


方法二: 裝置管理員
內容 => 詳細資料 => 硬體識別碼(Hardware Ids)

2012/05/16

Google / Facebook / Wiki 使用什麼程式語言作為技術架構

Google :
Python, JAVA, C++

http://blog.nccu.edu.tw/blog/yenlung/144
Python 是 Google 三大官方語言之一: 其他兩個是 JAVA, C++。另外, Google 的網路應用程式伺服器 Google App Engine, 第一個 (也是目前唯一的) 支援的就是 Python。

技術對談-看Google怎麼用Java
我們應用Interface Definition Language編譯程式,成為可以跨Java、Python及C++三種語言的系統。

facebook:
LAMP(Linux、Apache、MySQL、PHP), Python、Perl和Java, gcc和Boost, Subversion和git

Facebook使用LAMP(Linux、Apache、MySQL、PHP)作為技術架構。Facebook的一個技術架構工程師Steven Grimm在博客中提及到:幾乎我們所有的服務器都運行開源軟體。我們的Web服務器是Linux,Apache和PHP。我們數據庫是MySQL。我們使用memcached來保證網站的快速反應。一些後台應用Python、Perl和Java,以及一些gcc和Boost。程序員用Subversion和git來進行代碼管理。還有很多——像很多網站一樣,從頭到腳都是開源軟體。

wiki:
MediaWiki, php, Ubuntu Linux, Mysql

目前所用軟體稱作MediaWiki。MediaWiki採用PHP編程語言寫成,並可使用MySQL或PostgreSQL之一作為其關係資料庫管理系統。2008年10月之前,維基百科服務器的作業系統主要是採用紅帽Linux技術,但維基百科基金會於2008年10月9日宣布,旗下400多台伺服器陸續將改用Ubuntu Linux的方案。目前維基百科採用的網頁服務器軟體為Apache,資料庫是Mysql。

2012/05/14

MSDN除了官方文件之外, 也有Blog寫作以文章單一主題分享

MSND BLOG由許多blog組成
而這個網址會將大家發布的文章統整成一個時間流
http://blogs.msdn.com/

MSND BLOG的部落客們, 幾乎都是Microsoft員工
可能全球各部門都要負責將自己的部分, 寫出來當成產出吧

– The Ultimate Visual Studio Tips and Tricks Blog (分享visual studio使用小撇步)
http://blogs.msdn.com/b/zainnab/

– 開發者之魂 (微軟台灣)
http://blogs.msdn.com/b/ericsk/

2012/05/09

嵌入式系統Hardware開發注意事項

消費性電子產品的power系統很重要, 整體來說 hardwaree部份要先注意power系統
所謂所謂power順,則天下順~

電源的分電流, 可以看成大水管分流到各小水管
轉電通常是透過PWM或LDO來轉電!

線性穩壓IC (LDO)

LDO的由來:

LDO (Linear Regulator)中文名稱為線性穩壓IC, LDO 是 Low Drop Out Linear Regulator 的縮寫 ,十年前只要線性穩壓IC的Dropout Volatge 低於300~500mV 就可以稱為LDO( Low dropout Linear Regulator ), 隨著設計技術的進步, 大部份廠商的Linear Reguoator之 Dropout Voltage 都可做到300~500mV以下, 漸漸的 LDO 就跟Linear Regulator意思都一樣了。

LDO的架構:(以 LT1963為例)

LDO是所有電壓穩壓IC產品中最容易的一種, 只要一顆LDO IC加上兩顆電阻和兩三顆電容就可輕鬆的做到你想要的電壓.

LDO

LDO 的使用時機:

1. 希望得到一個很乾淨的電源, 如uV等級的電源.
2. 所需輸出電流小 通常用於10mA~1A. 1安培以上的也有, 但大部份1安培以上是要得到一個很乾淨的電源,
3. 輸入跟輸出的壓差很小, 如12V轉11V, 3.3V轉2.5V, 1.8V轉1.2V等.

LDO 的選用要領:

1. VIn 耐壓要夠 (LTC的LDO耐壓大致分為5V, 20V, 36V, 及80V等級)
2. IC 之輸出電流要夠(LTC的LDO電流大致為100mA~1.5A等級)
3. IC必須能承受降壓時所產生的溫升.(這點很重要)
4. 其他如Transient Response, Output Ripple, PSRR等就是比較細的規格, 如果你是用在跟RF有關的產品就要比較注意.

電壓也會逐步壓降壓降,
ACIN => 12 V => 5V
=> 3.3v
=> 1.8v

設計上不要一次轉換太大讓壓降太多
ex 由12v => 1.8v 公式: P=IV
因為有兩個缺點
1: 耗電
2: 產生熱能


設計上建議1.8v與3.3v的component數量要平衡

cpu =====I2C===== Sensor IC (可收3.3Vor5V最好用3.3v)
– cpu:規定i2C SPEC為3.3v
– Sensor IC : 可接受3.3v或5V, 但最好follow CPU SPEC的3.3V
– I2C:poll high也最好接同一條3.3v
(所以如果CPU i2c spec是5V,而sensor IC只接3V,則可能會level不夠高而不work)


硬體看IC需注意:
1: Power
2: BUS: i2c, smbus
3: clock
4: interupt (IC發出)
– 不需要interupt 是因為用polling 讀取

2012/05/07

更改小筆電解析度上限1024*600 就可以執行Win8 Metro

今天將小筆電EPC改安裝windows8 consumer preview版本
安裝後竟然metro apps無法使用,且win8作業系統也提示說是解析度的問題

一開始我的解析度是800*600
我立刻更新顯是驅動程式,於是上限改成1024*600
但是!!還是無法迎合metro apps的需求~

進一步要修改regedit (參考此網頁)

位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E 968-E325-11CE-BFC1-08002BE10318}\0000\Display1_DownScalingSupported

將原本的值從0改成1
設定完成之後,重開機。
開機重新進入之後就可以在螢幕解析度設定畫面中,找到1024×768(這是win8支援的最低解析度):
整體來說,Win8的運行效能比Win7要來的順暢很多,如果有觸控螢幕或平板,更值得一試。

2012/05/03

Roadmap是什麼呢? 你可以叫他作"產品規劃藍圖"

Roadmap是什麼呢? 在科技業上班的人一定常聽到這個單字
一般來說可以將Roadmap翻譯成“產品規劃藍圖”
這張圖表上面會記下時間點與該時間計畫推出的產品或服務


類似以下這張圖, 拿癮科技裡的文章當作範例
http://chinese.engadget.com/2011/07/06/qualcomm-snapdragon-roadmap-leaks-krait-slithering-on-the-scene/

2012/04/11

android reboot 很粗略流程說明啦~

android reboot的話
android_os_Power_reboot
在呼叫到kernel _reboot
然後就去控制硬體
會由PMIC將各components供電斷掉
然後系統再重啟

2012/03/28

無線網路失敗?!!

這個方法或許有用…

症狀:

『如 果 您 已 啟 用 另 外 的 程 式 來 管 理 這 個 無 線 連 線 ,請 使 用 該 軟 體 。
如 果 您 要 Windows 設 定 這 個 無 線 連 線 , 請 啟 動 Wireless Zero Configuration (WZC) 服 務 。 如 須 有 關 啟 動 WZC 服 務 的 資 訊 , 請 參 閱 microsoft.com 網 站 上 Microsoft 知 識 庫 ( Knowledge Base ) 中 的 871122 文 章 。』

方法:

http://tw.myblog.yahoo.com/jw!RwduGricHxbS5wePJgNshA–/article?mid=570&sc=1

※ 如果您無法開啟Windows XP的WZC,請由「開始」→「控制台」→「系統管理工具」,開啟「服務」,選擇「Wireless Zero Configuration」,按『啟動服務』工具;啟動WZC之後的無線網路,在其連線內容即會多出一個「無線網路」的窗格。

2012/03/21

0歐姆電阻的作用 / 焊接IC / 拆IC方法

0歐姆電阻的作用

大概有以下幾個功能:
① 做為跳線使用。這樣既美觀,安裝也方便。
② 在數位和類比等混合電路中,往往要求兩個地分開,並且單點連接。我們可以用一個0歐的電阻來連接這兩個地,而不是直接連在一起。這樣做的好處就是,地線被分成了兩個網路,在大面積鋪銅等處理時,就會方便得多。附帶提示一下,這樣的場合,有時也會用電感或者磁珠等來連接。
③ 做保險絲用。由於PCB上走線的熔斷電流較大,如果發生短路過流等故障時,很難熔斷,可能會帶來更大的事故。由於0歐電阻電流承受能力比較弱(其實0歐電阻也是有一定的電阻的,只是很小而已),過流時就先將0歐電阻熔斷了,從而將電路斷開,防止了更大事故的發生。有時也會用一些阻值為零點幾或者幾歐的小電阻來做保險絲。不過不太推薦這樣來用,但有些廠商為了節約成本,就用此將就了。
④ 為調試預留的位置。可以根據需要,決定是否安裝,或者其他的值。有時也會用*來標注,表示由調試時決定。
⑤ 作為配置電路使用。這個作用跟跳線或者指撥開關類似,但是通過焊接固定上去的,這樣就避免了普通用戶隨意修改配置。通過安裝不同位置的電阻,就可以更改電路的功能或者設置位址。

參考:
http://bbs.pigoo.com/thread-8534-1-1.html

焊接IC

拆IC方法

2012/03/20

網路上看到分享文-硬體研發工程師

網路上看到分享文

http://www.wretch.cc/blog/Ezra12/11242727


在A公司剛滿一年了,雖然最後選擇了離開,但我決定還是要把所見所學整理一下。在裡面看到的其實不只是在工作上而已,也包括不同人家庭、婚姻、理財、保險等等等,我嘗試一點一點在下面列出:

部門內的大環境:

我進入的部門是多媒體研發部內的TV Tuner團隊,這個部門最主要是在做顯示卡,大概站營收的90%,其餘才是TV tuner card,也就是電視卡。部門內硬體工程師加一位硬體課長只有六位,軟體工程師加上一位軟體課長共有九位,光是由軟硬體員工人數大概就可以知道,其實作產品來說軟體的effort是比硬體要大的。部門內出的產品又以OEM為多,最大宗客戶為HP,小部份才是作OBM,也就是掛自己的牌子賣。助理一位。PM(專案管理師)共有六位,四位負責OBM,只有兩位負責OEM,老實說這個人數比和營收比差距甚大。每一位工程師與PM除了向自己的課長負責之外,包括課長和全部的員工都要向部門的資深經理負責,每個星期開一到兩次會議。

硬體工程師的工作:

硬體工程師的工作簡單的說就是把產品從沒有做到有,把產品效能調整到最好,並且使之順利量產。其中大略有幾個步驟:

a. PM與Sales訂出市場策略,規劃出新產品的時程表與大致的規格,例如這次EEEPC在出貨之前,我們就必須把搭配EEEPC的USB電視卡做出來。

b. PM與工程師課長評估可行性,訂出詳細的產品規格與上游廠商(也就是產品內主要要用的晶片是哪一家的),並畫押schedule。在這個階段一定下來,馬上就會通知客戶,讓客戶知道我們大約什麼時候可以有他們或許會需要的產品。

c. 軟硬體工程師由課長指定接案,開始畫電路圖。案子一般來說又有分兩種,一種是由上游晶片廠做出來的公版(reference design),這種設計其實上游廠商已經把系統廠(也就是把消費者終端產品做出來的廠商,A公司就是)想要做的產品做出來了,從電路圖到電路板模型,從驅動程式到韌體一應俱全,此時硬體工程師一顆一顆的將電路圖近乎照抄完畢,把裡面的元件全部換成公司有現成的料件,有時會因為需要而加入自己的備用電路或元件,但通常會預留確認過沒問題的電路。另一種比較有挑戰性,就是要作一個沒有人作過的晶片組合,此時就要把不同晶片廠商的FAE(負責協助下游廠商設計的工程師)link起來,讓他們先討論,了解大致的連接之後,硬體工程師開始畫電路,遇到問題就找FAE討論,整個電路圖確定之後進到下一個設計步驟。

d. 使用軟體開始Placement,也就是零件擺放,要把電路圖上的每一顆元件按照一些設計的原則在電路板上擺在最適當的位置,這些位置非常重要,因為會直接影響下一個階段的結果,也就是走線。走線又叫做layout,這個部份我們會和大陸的layout工程師合作,首先先寫出layout rule,也就是寫出每一個零件之間的連線你想要怎麼連接,要走直線還是斜線?線寬要走多少距離?哪些線之間必須要走出一定的長度關係等等等,幾乎是把整張版子的每一個細節走法都寫出來讓layout工程師知道,之後layout工程師開使使用軟體走線,當然這當中需要不斷反覆的修改與溝通,畢竟對方是大陸人方式和台灣人不盡相同。Placement和Layout這兩個步驟是硬體工程師最精髓的地方,下功夫也就要先下在這,因為不同的線路走法會造成不同的產品效能,工程師的目標就是把效能最大化,進公司的前兩個月我都在讀這方面的書與資料。

e. Layout在硬體工程師確認完全ok之後,layout工程師會開始出圖作業,將版子的規劃圖送給PCB(印刷電路板)廠商去沖洗,也就是把他做出來,依照PCB層數的不同,最慢兩週內會洗出來,當中PCB廠也會和工程師確認當中的製作細節。接下來工程師要把版子當中的所有零件都確認好事哪一顆,公司內有沒有現成的?需不需要和其他廠商的業務拿sample?因為當版子洗出來,就要聯所有料件一起送往工廠製作產品sample。因此要先將料件備好,當中就會產生很多機會要和其他廠商業務碰面的機會。

f. 當sample版子還沒生出來之前,軟體工程師就應該先把驅動程式寫出來,sample一打出來就要測試,看看哪裡有問題。於是艱辛的debug之路就開始了,硬體工程師要分辨問題出在哪裡,作各種實驗來找答案,當中廠商FAE是最好的夥伴,常會需要他們的驗證及協助來找到問題。只要是硬體問題工程師都要自己想辦法解決,可能需要換料或是從新走線(就會回到上一個步驟重來一遍),若是驅動程式的問題則請軟體工程師或是上游廠商來作修改,一直做到產品在各樣測試下全部通過為止,其中包含基本效能測試、品質測試、高電壓防治測試、溫度測試、電磁防治測試等等。另外根據此產品要賣的國家不同,必須要去過當地的法規,每一項測試雖然都有其他的部門幫忙測試,但全部需要由硬體工程師準備、送件、壓時間、以及解bug,每一個bug若與一開始的設計有相關,無法以換零件解決的話,就必須回到走線的步驟作修改,從新打sample。如果產品是客戶要求,硬體工程師會將此ok的sample送到客戶那裡,附上自己寫的產品spec及測試結果,等客戶什麼時後有興趣看一看我們的產品。這部份必定是與其他家代工廠競爭的,因為如HP這樣的大公司必會先向許多廠商提出產品需求,看看誰做的最快最好最便宜,但通常決定的關鍵都是公司之間的”關係”。

g. 以上步驟先完成一部分時,就要開始準備產品的小量試產。A公司的產品都在蘇州生產,一般來說新產品都會先作200pcs的試產,看看在生產此產品時會不會遇到問題,硬體工程師透過email與電話監督,如果出現生產問題,要盡量想辦法在一天內提出解決方案,若沒有辦法,就必須要跑蘇州一趟了。試產當中所有的料件都需要由硬體工程師來準備,工廠PE(工廠端的工程師)會提出哪些料件不足,或是交期太長等,全都透過硬體工程師和廠商交涉來解決。如果順利,一次的試產就把生產問題都克服掉,那就準備第一次量產。也有許多狀況是必須有的二次試產,甚至第三次試產,想當然每一次試產都是成本,怎樣將次數降到最低就是關鍵了。

h. 配合sales需求開始量產。此時和上一步驟一樣,但是開始有其他單位幫忙備料、追料,工廠若出問題也必須由工廠扛較大責任,因為照理說生產問題應該在試產時就解決完畢。但是通常出問題硬體工程師還是要立即解決,不然就跑大陸。量產出問題是很嚴重的,因為會牽涉出貨時間,延遲客戶會立即反應,甚至要求賠償。

以上每一個步驟都是需要壓時間的,時間內東西沒有生出來就算失職,所以大部分RD的壓力都來自於時間不足,或是忽然有客戶很臨時的需求,於是乎加班變成常態。通常案子量產的機會不大,我做的十個案子中有一個走到量產,四個走到試產,而有五個夭折,另有胎死腹中的不計其數。這其實和markting方面有很大的關係,如果策略下的準其實不需要這麼多時間的浪費。

怎樣叫做厲害的硬體工程師?
這一點我是從我課長身上看到的,他的確在專業上卓越,更在扮演課長的角色上表現精悍。整理一下稍微可以分為幾點:

1. 基本專業上:細心是硬體工程師的必備條件,他必須對線路設計原則非常了解且堅持,工作當中會碰到一大堆人想和你在專業上妥協,甚至自己畫出一些可用的外加電路,使產品設計更加完整。同時從設計的一開始,就能針對效能問題、工廠生產問題、以及其他測試問題做出預測,直接就把解決方式設計進去,有些部門甚至要求RD不能作第二版sample,一定要一版ok,用以減少成本。對於晶片設計有不錯的認知,能加強debug速度。再厲害一些的工程師會很快幫助廠商釐清問題真相。

2. 專案管理上:我最多同時身上有七個案子在跑,每週都需要報告進度,所以如果我一天作一個那週末還得加班。厲害的工程師在專案上懂得爭取時間,包括和PM爭取,壓縮廠商時間等。為了要回家睡覺,工程師必須知道案子孰重孰輕,雖然每個案子的關係人同時都開口向你要進度,壓時間,你也必須以產品的銷售潛力當作排先後次序的原則。同時知道什麼問題要接,什麼問題要推,推不是不解決,而是推給晶片廠商去解問題而不自己解。同時要知道各家廠商的料況,避免使用交期太長的料,或是在很早之前就必須通知廠商備料。

3. 廠商關係上:厲害的硬體工程師和上游廠商關係良好,因為業務關係許多上游廠商的業務會不斷與工程師接洽,尋找切入的機會。關係良好的廠商會把最好的市場機會給你,盡全力解你的bug,以及以最快的速度提供你必要的元件。因此你不會在長官面前因為案子delay而丟臉,反而會因快速把料況問題解決而得到親睞。最後更不用說,好的廠商關係也是未來轉職莫大的幫助。廠商有百百種,三節送禮的有,聊天打屁的也有,應酬喝酒的更不佔少數。

4. 創意與提案:厲害的硬體工程師能夠向長官提案,一起討論並且建議。同時會去看其他的產品,藉以提出較具創意性的專案,不過這一項在我們部門內幾乎看不見。

2012/03/16

耗電與待機時間(battery life)換算

幾個公式:

W=PT (energy=power * time)
P=IV (power=Electric_current * Voltage)
W=IVT

通常電池的energy有兩種單位mAh與Wh

ex:
27Wh 且 7.4V
=> 套用公式P=IV => 27W/7.4V=3648mA
=> 所以27Wh約等於3648mA

—————————————
另外一例子:

電池資訊: 12.13wh, 3.7V
而總電流由41mA降到26mA

1: 先算電池總共energy
[P = IV => 12130mW = I * 3.7, I = 3278mA]
3278mAh

2: 原本電流的電池life time
(3278/41) * 1h = 79.95h

3: 降低之後電流的電池life time
(3278/26) * 1h = 126h

4: 所以增加多少時間 battery life
126h – 79.95h = 46.05h

2012/03/12

extern變數但還是undefined的處理方式

我遇到過很多次這種狀況, 但是我都沒記下來導致每每都要犯這問題
狀況是這樣的, 如果今天我們寫了兩個檔案需要透過變數傳遞訊息
ex: file1.c , file2.c
file1裡面宣告global 變數 g_state, 以記錄裝置狀態
而且 file2也需要知道此global 變數 g_state
這樣的話就會在
file1.c

int g_state = 0;

file2.c

extern int g_state;

通常這樣就OK了!
但是有時候就是會發生以下undefined狀況:

ERROR: “g_state” [drivers/net/wireless/bcm4329/bcm4329.ko] undefined!
make[2]: *** [__modpost] Error 1
make[1]: *** [modules] Error 2
make: *** [sub-make] Error 2

我google了一下
找到這個資訊 http://bbs.chinaunix.net/thread-1918580-1-1.html

原來解法很容易:
file2.c多加一行EXPORT_SYMBOL_GPL就可以

extern int g_state;
EXPORT_SYMBOL_GPL(g_state);

2012/03/08

C語言巨集macro: 將enum的integer變數 印出變成string

我記得之前有個同事有透過程式碼的撰寫
將enum的數字變數,轉成string
但是原始碼我後來忘記了
現在努力回想, 也在網路找一些資料
試圖拼湊回來

方法一

好像可以了..

#define STATE_STRLENGTH 32#define stringiz(arg) #arg   //將數字前面加# 就是字串化/* enum states for the power meter */typedef enum {	STATE_UNSET = 0,	STATE_INIT,		STATE_OPEN,	STATE_PROBE,	STATE_EARLYRESUME,	STATE_EARLYSUSPEND,	STATE_RESUME,	STATE_SUSPEND,	STATE_REMOVE,	STATE_SHUTDOWN,	STATE_CLOSE,	STATE_EXIT,	STATE_MAX,} Numbers;char num_str[STATE_MAX][STATE_STRLENGTH] = {	stringiz(STATE_UNSET),	stringiz(STATE_INIT),	stringiz(STATE_OPEN),	stringiz(STATE_PROBE),	stringiz(STATE_EARLYRESUME),	stringiz(STATE_EARLYSUSPEND),	stringiz(STATE_RESUME),	stringiz(STATE_SUSPEND),	stringiz(STATE_REMOVE),	stringiz(STATE_SHUTDOWN),	stringiz(STATE_CLOSE),	stringiz(STATE_EXIT),};

要用的時候

void main(){ int val = xxx; printf("%d:%s\n", val, num_str[val]);}

另外一種寫法

透過switch case來處理文字
而不是初始時就設定好文字

void state_stringiz(void) {	int i;		for(i = STATE_UNSET; i < STATE_MAX; i++){		switch(i) {			case STATE_UNSET:				strcpy(num_str[i],stringiz(STATE_UNSET));				break;				case STATE_INIT:				strcpy(num_str[i],stringiz(STATE_INIT));				break;				case STATE_OPEN:				strcpy(num_str[i],stringiz(STATE_OPEN));				break;			case STATE_PROBE:				strcpy(num_str[i],stringiz(STATE_PROBE));				break;						case STATE_EARLYRESUME:				strcpy(num_str[i],stringiz(STATE_EARLYRESUME));				break;			case STATE_EARLYSUSPEND:				strcpy(num_str[i],stringiz(STATE_EARLYSUSPEND));				break;			case STATE_RESUME:				strcpy(num_str[i],stringiz(STATE_RESUME));				break;			case STATE_SUSPEND:				strcpy(num_str[i],stringiz(STATE_SUSPEND));				break;			case STATE_REMOVE:				strcpy(num_str[i],stringiz(STATE_REMOVE));				break;			case STATE_SHUTDOWN:				strcpy(num_str[i],stringiz(STATE_SHUTDOWN));				break;			case STATE_CLOSE:				strcpy(num_str[i],stringiz(STATE_CLOSE));				break;			case STATE_EXIT:				strcpy(num_str[i],stringiz(STATE_EXIT));				break;		    default:		      	break; //no match		}  }}

2012/03/03

微軟 Microsoft Windows/Bing/IE

微軟這段日子的沉潛準備, 從前人們認為微軟老舊的大體制不可能被修改
只能日漸凋零,讓apple與google一吋吋侵襲的Microsoft
似乎開始改變了


[網路搜尋]
首先我認為第一步的成功改變是Bing搜尋引擎的成立
microsoft自從迎娶yahoo失敗後,自己跳下海作搜尋引擎並且獲得不錯的市場成績

 


[手持系統]
再來就是換掉爛透的winCE的手持作業系統
有用過這款作業系統的手機, 就可以體會有多爛
介面設計使用電腦的思維
使用者經驗也不足
觸控又差
現在換成新的Windows Phone 7 應該好很多


[瀏覽器方面]
由於之前由IE壟斷市場, 所以也沒必要一直求進步
導致更新速度緩慢! 更讓IE6.5還占市場大宗, 因為Windows XP就是預載IE6.5
後來firefox和chrome以飛快的速度更新與創新
讓IE市占越來越低,一直到出IE9力挽狂瀾

2012/03/02

git 怎麼新增branch到server?

其實不難啦! 作個紀錄吧~
主要就是在local本地端先自己開創一個branch後, 再push到remote遠端的server上

步驟:

  1. git checkout –b newbranch origin/master  (這是在本地端create一個新的branch)
  2. git add 欲上傳的檔案
  3. git commit –a
  4. git push origin newbranch    (這是把在local端的新create branch推上server)

一般的作法都是local先做再推
因為大部分的server是bare的

2012/02/15

Device Driver, firmware, middleware, Software ArchitectureSoftware Framework,

Device Driver
對下控制硬體,對上提供介面,讓上層軟體可藉此和硬體溝通。
舉例:printer driver、display driver。

Firmware
指的是控制硬體的低階軟體。
比起Device Driver,定義其實比較不精確。舉例來說,控制電視的軟體叫Firmware,但其實裡面又可以分AP、Middleware、Driver、RTOS。
舉例:PC的BIOS、控制電視的軟體。

(Embedded) Middleware
存在於上層AP與底層OS之間的軟體或韌體,提供服務給AP使用。
舉例:Remote Procedure Call、Database Access Engine。

Software Architecture
定義系統中的軟體元件,以及元件之間彼此的關連性。

Software Framework
把常用的功能包裝起來,提供給AP使用,讓AP不需要處理其中繁瑣的問題。
舉例:各種Application Framework。

Multimedia Framework
提供多媒體功能的Software Framework。
舉例:Linux GStreamer、Microsoft Windows DirectShow、Java Media Framework。

參考
http://murphymind.blogspot.com/2009/05/firmwaremiddlewaremultimedia-framework.html

2012/02/14

這個wordpress論壇外掛- simple:press

1: 請先上simple:press的網站的下載網頁

http://simple-press.com/download/

 

 

2: 像我是wordpress 3.3.1版, 所以對應下載 simple:press 4.5.1


– 請依照 1. 2. 3. 4 (其中3可以先跳過)
– 1) 下載程式壓縮擋到plugin底下, 再unzip
– 2) 可以下載skin擋到 /wp-content/plugins/simple-press/styles/skins/
– 4) 可以找出繁中版 解壓縮到 /wp-content/plugins/simple-forum/languages/
 

 

2012/02/13

wordpress 好用的圖片切換 pic slider外掛

 

 

給大家關鍵字

1. Meteor Slides

這個介面還滿簡潔的

而且有後台有獨立的控制區域

但不支援外連, 必須使用自己上傳的特色圖片是一個缺點

 

 

 

2. Promotion Slider

我要外連圖片所以使用這款

還不錯, 可以直接設定外連圖的網址

還可以直接設定目標連結網址

 

2012/02/01

android的 low power: LP0 LP1 LP2

下面這個commit就是tegra的Low power概念整合到Linux kernel
後來應該被修改很多次,
其中的註解將lower power狀態說的很清楚

ARM: tegra: Add suspend support
http://nv-tegra.nvidia.com/gitweb/?p=linux-2.6.git;a=commit;h=d9c01b3ce93ce4ab3bff842f726a1924ffdef860

Tegra supports three low power modes that involve powering down the CPU.

LP2 powers down both CPU cores and the GICs, but leaves the core
peripherals, including the memory controller and the legacy
interrupt controller, enabled. The legacy interrupt controller
is used as the wakeup source, and any interrupt can wake the device.
LP2 can be used in idle.

LP1 is the same as LP2, but in addition turns off the memory
controller and puts the DDR memory in self-refresh. Any interrupt
can wake the device. LP1 could be used in idle if no peripherals
are doing DMA.

LP0 turns off everything in the SoC except the RTC and a power
management controller, both of which run off a 32 kHz clock.
The power management controller has 32 wake sources, all other
interrupts can not be used to wake from LP0.

These low power modes power-gate the main CPU complex, requiring a
full processor state save and restore from a reset vector.

Platform-specific data (power good times, PMU capabilities, etc.) must be
specified when registering the suspend operations to ensure that platform
power sequencing restrictions are maintained.

In both LP0 and LP1, SDRAM is placed into self-refresh. in order to safely
perform this transition, the final shutdown procedure responsible for

* turning off the MMU and L1 data cache
* putting memory into self-refresh
* setting the DDR pads to the lowest power state
* and turning off PLLs

is copied into IRAM (at the address TEGRA_IRAM_BASE + SZ_4K) at the
start of the suspend process.

In LP1 mode (like LP2), the CPU is reset and executes the code specified
at the EVP reset vector. Since SDRAM is in self-refresh, this code must
also be located in IRAM, and it must re-enable DRAM before restoring the
full context. In this implementation, it enables the CPU on PLLP, enables
PLLC and PLLM, restores the SCLK burst policy, and jumps to the LP2 reset
vector to restore the rest of the system (MMU, PLLX, coresite, etc.). The
LP2 reset vector is expected to be found in PMC_SCRATCH1, and is
initialized during system-bootup.

In LP0 mode, the core voltage domain is also shutoff. As a result, all
of the volatile state in the core voltage domain (e.g., pinmux registers,
clock registers, etc.) must be saved to memory so that it can be restored
after the system resumes. A limited set of wakeups are available from LP0,
and the correct levels for the wakeups must be programmed into the PMC
wakepad configuration register prior to system shutdown. On resume, the
system resets into the boot ROM,
and the boot ROM restores SDRAM and other
system state using values saved during kernel initialization in the PMC
scratch registers.

Resuming from LP0 requires the boot ROM to supply a signed recovery codeblob
to the kernel;
the kernel expects that the length and address of this blob
is supplied with the lp0_vec= command line argument; if not present, suspend-
to-LP0 will be disabled

For simplicity, the outer cache is shutdown for both LP0 and LP1; it
is possible to optimize the LP1 routine to bypass outer cache shutdown
and restart.

Includes fixes from:
Scott Williams
Aleksandr Frid
Vik Kasivajhula
Bharat Nihalani
James Wylder
Allen Martin

2012/01/31

擷取螢幕方便小軟體 PicPick

有時候鍵盤上的prtSrn會失效
這時候可以試看看 alt + prtSrn

如果還會失效
有可能有些檔案有防擷取功能

可以試看看PicPick

PicPick一個免費又好用的螢幕擷取軟體,它可以抓取全螢幕或是局部的畫面,而且操作也很簡單,還具備了一般最常用到的基本圖像處理功能。
軟體名稱:PicPick 3.0.7 免安裝版
軟體版本: 3.0.7
語言界面: 繁體中文
官方網頁:http://picpick.wiziple.net/
檔案下載:Download

2012/01/17

windows 8 : 兼具方塊磚與傳統介面

看到這台 lenovo未來概念機
結合平板與筆電的windows8系統
滿接近我會買的程度了

首先雖然 android已經有平板+鍵盤的概念
但是android本來就是設計給touch 手指滑動的介面
如果透過滑鼠或是實體鍵盤, 還是怪怪的
這是我個人觀感啦, 畢竟asus 變形平板還是賣得不錯, 但是我很少看到有人操作它的鍵盤呀….

轉頭看 windows 8
雖然只是介面多了metro的平板touch
也保留原本傳統介面
不知道是技術問題, 還是包袱太大無法甩開
但也是windows的價值- 使用者熟悉的操作介面

如果我買了這樣一台windows8 平板+鍵盤
最好是可拆式的
這樣我就可以外出的時候,
只需要帶著window8平板, 透過touch螢幕去控制
一回到家,
只需要把平板裝上實體鍵盤和滑鼠, 就變成一般筆電

當然CPU效能雖不用太好, 但是也不能太差
為什麼說不用太好, 因為之後就是雲端運算了
大多數的儲存裝置與運算都是上網就可以操作
為什麼說也不能太差,
因為雖然我不玩重度3D影像遊戲
但我也是會看影片, 玩玩基本的遊戲
所以CPU不可以太慢…

期待未來這樣的產品上市

http://chinese.engadget.com/2012/01/09/lenovos-ideapad-yoga-convertible-tablet-runs-windows-8-is-set/

2012/01/10

android 使用 linux LED driver 來控制GPIO 的LED行為

Linux Kernel’s LED driver
一般embedded system廠商控制LED都是透過GPIO的high/low操作
所以不會使用linux kernel內的預設LED功能, 而是自己寫獨立的driver
但是因為正統方式應該要配合Linux Kernel會比較有系統
kernel/drivers/leds


先到kernel作make menuconfig
將LED功能打開

+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_GPIO_PLATFORM=y
+CONFIG_LEDS_TRIGGERS=y


去kernel/driver/led底下
作出客製化的修改

Makefile

# LED Platform Drivers
+#++
+obj-y += leds-xxxx.o
+#–

從led-gpio.c 改寫成另一份檔案 led-xxxx.c

1: 可以改寫 led_dat->platform_gpio_blink_set = blink_set;
2: 改寫 gpio_led_work()
反正就是接到led的driver的API, 如led_on(), led_off()

Access介面node:

ledtrig-timer.c:78: static DEVICE_ATTR(delay_on, 0644, led_delay_on_show, led_delay_on_store);

順便提到, led-class: always implement blinking

在2010年時候, kernel/driver/leds
Johannes Berg 新增一個功能 led-class: always implement blinking
led-class: always implement blinking


Currently, blinking LEDs can be awkward because it is not guaranteed that
all LEDs implement blinking. The trigger that wants it to blink then
needs to implement its own timer solution.

Rather than require that, add led_blink_set() API that triggers can use.
This function will attempt to use hw blinking, but if that fails
implements a timer for it. To stop blinking again, brightness_set() also
needs to be wrapped into API that will stop the software blink.

As a result of this, the timer trigger becomes a very trivial one, and
hopefully we can finally see triggers using blinking as well because it’s
always easy to use.

Signed-off-by: Johannes Berg
Acked-by: Richard Purdie
Signed-off-by: Andrew Morton
Signed-off-by: Linus Torvalds

這是近年來 kernel/driver/leds 比較大的修改


如何注册gpio-led平台设备:
(如果是android系統, 應該是寫在 kernel/arch/arm/mach-tegra/board-xxxxx.c)

例子如下:
#define GPIO_LED3 138
#define GPIO_LED4 139

static struct gpio_led gpio_leds[] = {
{
.name = “led3”,
.default_trigger = “heartbeat”,
.gpio = GPIO_LED3,
.active_low = 1,
.default_state = LEDS_GPIO_DEFSTATE_OFF,
},
{
.name = “led4”,
.gpio = GPIO_LED4,
.active_low = 1,
.default_state = LEDS_GPIO_DEFSTATE_OFF,
},
};

static struct gpio_led_platform_data gpio_led_info = {
.leds = gpio_leds,
.num_leds = ARRAY_SIZE(gpio_leds),
};

static struct platform_device leds_gpio = {
.name = “leds-gpio”,
.id = -1,
.dev = {
.platform_data = &gpio_led_info,
},
};
最后调用platform_device_register(&leds_gpio)将LED设备注册到内核中。注册之前一定要保证编号为138和139的两个端口是可用的。
成功注册之后,系统中便会出现名为led3和led4的两个led_classdev了。由于是用gpio模拟led,所以对gpio-led设置的亮度,只要不是0就是全亮(gpio只有两个状态)。
对于可能睡眠的gpio,gpio-led会借助于工作队列去设置亮度,所以不用担心会被阻塞。


做完了以上的kernel部分
想要往上讓android系統可以控制光的話, 要使用android光系統

修改:
device/nvidia/common/liblights/lights.c 裡面的
open_lights() 和改寫 set_light_backlight()變成控制LED

修改:
frameworks/base/services/java/com/android/server/BatteryService.java 裡面的
updateLightsLocked()


參考:
led子系统
http://blog.csdn.net/yuanlulu/article/details/6438841

内核中led触发器实例
http://blog.csdn.net/yuanlulu/article/details/6438847

2012/01/04

Linux程式設計教學手冊 Beginning Linux Programming (第四版)


這本書的英文原文版在網路上可以下載 (自己google一下吧)

看了書本內容後
覺得這一本可以推薦給初學linux或是想更扎實linux基本功的人使用
不像一般的作業系統(OS)書本那樣理論, 這本書Linux程式設計教學手冊以linux作業系統的實例方式
讓讀者可以更快更精準的進入linux為平台的開發世界

據說原文版已經到第五版了 …

英文簡介:
introduce you to developing programs for Linux and other UIX-style operating systems. It discusses thoroughly all you need to be a good Linux programmer. The book. written by N Matthew and R Stones. encompasses a gamut of topics including both the basics of compiling programs. linking to libraries. terminal input and output. to more advanced topics like writing applications for the GNOME and KDE. data storing using MySQL, debugging etc. It tells you how to make the most of the standard Linux development tools and how to build graphical user interfaces for the X Windows system. The authors introduce appropriate programming theories for each topic with many practical examples and illustrations.
This is a good book for programmers and developers who want to enhance their skills in Linux to be able to create custom applications.

目錄:

第 一 章 Linux介紹
第 二 章 Shell程式設計
第 三 章 檔案處理
第 四 章 Linux的環境
第 五 章 終端機(terminal)
第 六 章 使用curses管理文字視窗
第 七 章 資料管理
第 八 章 MySQL
第 九 章 開發工具
第 十 章 除錯
第十一章 處理程序(process)和信號(signal)
第十二章 POSIX執行緒(thread)
第十三章 處理程序間的通訊:管線(pipe)
第十四章 號誌(semaphore)、共享記憶體(shared memory)、
第十五章 訊息佇列(message queue)
第十六章 網路程式設計:socket
第十七章 使用GTK+設計GNOME視窗程式
第十八章 使用QT設計KDE視窗程式
第十九章 標準化的Linux

博客來的書本介紹:

 基於前三版的成功經驗,第四版仍然延續教學的方式,一步步地引領讀者,讓讀者可以迅速在Linux和Unix相關的作業系統下開發程式。作者本身是相當有經驗的Linux程式設計員,所以讓此書可以涵蓋廣泛的主題,讓讀者暸解Linux的資源,讓讀者可以迅速開發程式。

  讀者將從基本的主題(編譯程式、聯結函式庫、處理終端機的輸出輸入),最後近入進階主題(設計GNOME和KDE的應用程式、使用MySQL儲存資料和除錯等)。在每個主題中,作者都會先介紹理論,隨即利用真實的程式範例,一步步的說明,引導讀者如何應用和實際開發程式。相信Linux的新鮮人也可以快速地開發出Linux的程式。

從本書您將學到什麼:

*使用標準的Linux C函式庫和其它工具。
*編譯標準的Linux開發工具。
*基本的系統呼叫(system calls)、檔案輸出與輸入、處理程序間通訊(interprocess communication)和shell設計。
*使用GTK+或Qt工具,設計圖形化的使用者介面。
*利用sockets,設計TCP/IP網路程式。
*設計相容於不同Linux發行版本的程式。

2012/01/03

nvidia 針對 I2C arbitration lost 提出作法 (android / tegra)

一種I2C會發生的issue, arbitration lost的中文可以稱作”仲裁損失”

若是發生這種狀態的話, 有一種workaround的方式處理, 就是將此I2C切換為GPIO 啟用/關閉後, I2C就變正常了

nvidia 也針對這個issue提出作法, 且以GPL授權發布在網路上

 

/* * arch/arm/mach-tegra/i2c_error_recovery.c * * Copyright (c) 2011, NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. */

 

arm: tegra: cardhu: Added I2C arbitration lost recovery mechanism

連結

Added the code for arbitration lost recovery mechanism for i2c
driver and Initialize gpio number for i2c clock and data as
part of platform data.

用 git cherry-pick 處理專案 push/pull request

A-B-C-D-E-F              (master)
………………….\
……………………G          (topic)

1: 先切出一個另外的branch (ex: topic)
2: 在這個branch (ex: topic)上做修改與撰寫程式碼
3: 在這個branch (ex: topic)上作: git add / git commit
4: 切回master 作: git cherry-pick xxxxxxxxxx / git push

 

 

 

git cherry-pick 321d76f # 只合併特定其中一個 commit。如果要合併多個,可以加上 -n 指令就不會先幫你 commit,這樣可以多 pick幾個要合併的 commit,最後再 git commit 即可。

2012/01/02

電子電路: VCC, VDD, VSS 定義與區分

在電子電路中,常可以看到VCC、VDD和VSS三種不同的符號,它們有什麼區別呢?

一、解釋

VCC:C=circuit 表示電路的意思, 即接入電路的電壓;

VDD:D=device 表示器件的意思, 即器件內部的工作電壓;

VSS:S=series 表示公共連接的意思,通常指電路公共接地端電壓。

二、說明

1、對於數字電路來說,VCC是電路的供電電壓,VDD是芯片的工作電壓(通常Vcc&gt;Vdd),VSS是接地點。

2、有些IC既有VDD引腳又有VCC引腳,說明這種器件自身帶有電壓轉換功能。

3、在場效應管(或COMS器件)中,VDD為漏極,VSS為源極,VDD和VSS指的是元件引腳,而不表示供電電壓。