<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6684638057132206873</id><updated>2012-02-17T09:41:41.870+08:00</updated><category term='ARM Architecture'/><category term='python template'/><category term='Linux SPI Driver'/><category term='install ubuntu apt'/><category term='Linux Driver'/><category term='udev device node 屬性 hotplug  rule udevinfo'/><category term='qemu; qcow2; qcow; mount;'/><category term='Linux PCM 轉檔  covnert wav'/><category term='EMT 過度換氣'/><title type='text'>Ziv's Blog</title><subtitle type='html'>Share my experience, life...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-7956445677467390269</id><published>2011-11-03T10:55:00.002+08:00</published><updated>2011-11-03T13:16:12.989+08:00</updated><title type='text'>Which process try to use 5223 port in your MAC</title><content type='html'>while [ 1 ] ; do sudo lsof -i -P| grep 5223; sleep 2; done&lt;br /&gt;while [ 1 ] ; do sudo lsof -nP| grep "17.149"; sleep 2; done&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-7956445677467390269?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/7956445677467390269/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=7956445677467390269' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/7956445677467390269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/7956445677467390269'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2011/11/which-process-try-to-use-5223-port-in.html' title='Which process try to use 5223 port in your MAC'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-5779318297680525624</id><published>2011-10-26T13:29:00.003+08:00</published><updated>2011-10-26T13:29:57.139+08:00</updated><title type='text'>如何mount有partition的image</title><content type='html'>Mounting a hard disk image including partitions using Linux&lt;br /&gt;http://www.andremiller.net/content/mounting-hard-disk-image-including-partitions-using-linux&lt;br /&gt;&lt;br /&gt;parted&lt;br /&gt;&lt;br /&gt;(parted) unit&lt;br /&gt;Unit? &amp;nbsp;[compact]? B&lt;br /&gt;(parted) print&lt;br /&gt;(parted) quit&lt;br /&gt;&lt;br /&gt;#mount -o loop,ro,offset=1184440320 test2 /mnt/rabbit&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-5779318297680525624?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/5779318297680525624/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=5779318297680525624' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/5779318297680525624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/5779318297680525624'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2011/10/mountpartitionimage.html' title='如何mount有partition的image'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-562370097804836082</id><published>2011-10-21T00:09:00.001+08:00</published><updated>2011-10-21T00:09:38.381+08:00</updated><title type='text'>CPR and AED</title><content type='html'>&lt;div id="__ss_9795815" style="width: 425px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/ZivChang/cpr-and-aed" target="_blank" title="CPR and AED"&gt;CPR and AED&lt;/a&gt;&lt;/strong&gt; &lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/9795815" width="425"&gt;&lt;/iframe&gt; &lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/ZivChang" target="_blank"&gt;Li-Chung Chang&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-562370097804836082?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/562370097804836082/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=562370097804836082' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/562370097804836082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/562370097804836082'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2011/10/cpr-and-aed.html' title='CPR and AED'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-5962640797914986389</id><published>2011-10-19T10:16:00.000+08:00</published><updated>2011-10-19T10:16:49.942+08:00</updated><title type='text'>第二課：救護技術員管理辦法</title><content type='html'>&lt;br /&gt;第二課：&lt;a href="http://law.moj.gov.tw/LawClass/LawAll.aspx?PCode=L0020141"&gt;救護技術員管理辦法&lt;/a&gt;&lt;br /&gt;"全國法規資料庫"裡有全文&lt;br /&gt;常常會考的地方&lt;br /&gt;ex:&lt;br /&gt;&lt;br /&gt;1. 申請參加各級救護技術員資格？&lt;br /&gt;&lt;br /&gt;2. 各級救護員之訓練課程時數？&lt;br /&gt;&lt;br /&gt;3. 何者機關（構）或團體得辦理初級、中級救護員訓練或繼續教育課程？&lt;br /&gt;&lt;br /&gt;4. 各級救護員證書效期為？&lt;br /&gt;&lt;br /&gt;5. 繼續教育課程者時數？&lt;br /&gt;&lt;br /&gt;6. 各級救護員得施行之救護項目？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;請從下列找答案&lt;br /&gt;&lt;br /&gt;第 2 條 &lt;br /&gt;申請參加各級救護技術員（以下稱救護員）訓練，應具下列資格：&lt;br /&gt;一、初級救護員：相當初級中等以上學校畢業或具同等學力。&lt;br /&gt;二、中級救護員：高級中等以上學校畢業或具同等學力，並領有初級救護&lt;br /&gt;員合格證書（以下稱證書）。&lt;br /&gt;高級救護員：領有中級救護員證書四年以上或專科以上學校畢業，領有中&lt;br /&gt;級救護員證書。&lt;br /&gt;&lt;br /&gt;第 3 條 &lt;br /&gt;前條各級救護員之訓練課程基準如附表一至附表三&lt;br /&gt;(40/280/1280)&lt;br /&gt;第 4 條 &lt;br /&gt;下列機關（構）或團體得辦理初級、中級救護員訓練或繼續教育課程：&lt;br /&gt;一、各級衛生、消防主管機關。&lt;br /&gt;二、設有醫療、衛生、消防等相關科系之專科以上學校。&lt;br /&gt;三、其他經中央衛生主管機關許可之機關（構）或團體。&lt;br /&gt;機關（構）或團體辦理高級救護員訓練或繼續教育課程，應先向中央衛生&lt;br /&gt;主管機關申請許可。&lt;br /&gt;第一項第三款及前項之許可，應於辦理前三個月檢具計畫書申請。&lt;br /&gt;前項計畫書內容應包含實施日期、級別名稱、課程大綱、時數及師資、場&lt;br /&gt;所、設備、收費方式等事項。&lt;br /&gt;&lt;br /&gt;第 6 條 &lt;br /&gt;各級救護員證書格式如附表四至附表六，其效期為三年。&lt;br /&gt;機關（構）或團體應於發給證書後一個月內，依附表七格式造冊報中央衛&lt;br /&gt;生主管機關備查。&lt;br /&gt;&lt;br /&gt;第 7 條 &lt;br /&gt;各級救護員於證書效期三年內，完成下列繼續教育課程者，得由第四條第&lt;br /&gt;一項及第五條第二項所定之機關（構）或團體辦理各該級別救護員證書效&lt;br /&gt;期之展延，並報中央衛生主管機關備查。&lt;br /&gt;一、初級救護員：完成附表一所列科目達二十四小時以上，且其中十二小&lt;br /&gt;時以上為模組二、四、六之科目。&lt;br /&gt;二、中級救護員：完成附表二所列科目達七十二小時以上，且其中三十六&lt;br /&gt;小時以上為模組二、五、七之科目。&lt;br /&gt;三、高級救護員：完成附表三所列科目，每年達二十四小時以上，三年累&lt;br /&gt;計達九十六小時以上，且其中四十八小時以上為模組二、四、五之科&lt;br /&gt;目。&lt;br /&gt;前項效期之展延，一次以三年為限。未於規定期限內完成相當級別之繼續&lt;br /&gt;教育課程達規定時數，但達較低級別救護員繼續教育課程規定時數者，得&lt;br /&gt;發給該較低級別救護員證書。&lt;br /&gt;&lt;br /&gt;第 9 條 &lt;br /&gt;初級救護員得施行之救護項目如下：&lt;br /&gt;一、檢傷分類及傷病檢視。&lt;br /&gt;二、病患生命徵象評估、血氧濃度監測。&lt;br /&gt;三、基本心肺復甦術及清除呼吸道異物。&lt;br /&gt;四、使用口咽、鼻咽人工呼吸道。&lt;br /&gt;五、給予氧氣。&lt;br /&gt;六、止血、包紮。&lt;br /&gt;七、病患姿勢選定及體溫維持。&lt;br /&gt;八、骨折固定。&lt;br /&gt;九、現場傷患救出及搬運。&lt;br /&gt;十、送醫照護。&lt;br /&gt;十一、急產接生。&lt;br /&gt;十二、心理支持。&lt;br /&gt;十三、使用自動心臟電擊器。&lt;br /&gt;&lt;br /&gt;第 10 條 &lt;br /&gt;中級救護員得施行之救護項目如下：&lt;br /&gt;一、初級救護員得施行之救護項目。&lt;br /&gt;二、血糖監測。&lt;br /&gt;三、灌洗眼睛。&lt;br /&gt;四、給予口服葡萄糖。&lt;br /&gt;五、周邊血管路徑之設置及維持。&lt;br /&gt;六、給予葡萄糖（水）、乳酸林格氏液或生理食鹽水。&lt;br /&gt;七、使用喉罩呼吸道。&lt;br /&gt;八、協助使用吸入支氣管擴張劑或硝化甘油舌下含片。&lt;br /&gt;&lt;br /&gt;第 12 條 &lt;br /&gt;救護員施行救護，應佩帶救護員證書。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-5962640797914986389?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/5962640797914986389/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=5962640797914986389' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/5962640797914986389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/5962640797914986389'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2011/10/ex-1.html' title='第二課：救護技術員管理辦法'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-3914932788139138235</id><published>2011-10-19T10:12:00.000+08:00</published><updated>2011-10-19T10:12:47.924+08:00</updated><title type='text'>第一課：緊急醫療救護法</title><content type='html'>第一課：&lt;a href="http://law.moj.gov.tw/LawClass/LawAll.aspx?PCode=L0020045"&gt;緊急醫療救護法&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"全國法規資料庫"裡有全文&lt;br /&gt;常常會考的地方&lt;br /&gt;&lt;br /&gt;ex:&lt;br /&gt;&lt;br /&gt;1. 法律上"醫療救護人員"有誰？&lt;br /&gt;&lt;br /&gt;2. 消防分隊要有多少台救護車？一台要多少人？其中專職要有多少人？&lt;br /&gt;&lt;br /&gt;3. 一般型救護車出勤要有多人人？加護型還有什麼限制？&lt;br /&gt;&lt;br /&gt;4. 救護技術員在哪些地點才能救護？&lt;br /&gt;&lt;br /&gt;5. 救護技術員沒有遵照SOP要罰多少錢？&lt;br /&gt;&lt;br /&gt;6. 救護紀錄表保存幾年？&lt;br /&gt;&lt;br /&gt;7. 洩漏因業務而知悉或持有他人之秘密，要罰多少錢？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;請從底下找答案！！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;第 4 條&lt;br /&gt;本法所稱緊急醫療救護人員（以下簡稱救護人員），指醫師、護理人員、&lt;br /&gt;救護技術員。&lt;br /&gt;第 14 條 &lt;br /&gt;前條救護隊或消防分隊，每隊至少應配置救護車一輛及救護人員七名，其&lt;br /&gt;中專職人員不得少於半數。&lt;br /&gt;第 18 條 &lt;br /&gt;救護車於救護傷病患及運送病人時，應有救護人員二名以上出勤；加護救&lt;br /&gt;護車出勤之救護人員，至少應有一名為醫師、護理人員或中級以上救護技&lt;br /&gt;術員。&lt;br /&gt;(第四十一條第三項 .... 三、違反第十八條規定。...處新臺幣十萬元以上五十萬元)&lt;br /&gt;&lt;br /&gt;第 24 條 &lt;br /&gt;救護技術員分為初級、中級及高級三類。&lt;br /&gt;前項各級救護技術員之受訓資格、訓練、繼續教育、得施行之救護項目、&lt;br /&gt;應配合措施及其他應遵行事項之辦法，由中央衛生主管機關定之。&lt;br /&gt;&lt;br /&gt;第 26 條 &lt;br /&gt;救護技術員施行緊急救護，以下列地點為限：&lt;br /&gt;一、緊急傷病或大量傷病患之現場。&lt;br /&gt;二、送醫或轉診途中。&lt;br /&gt;三、抵達送醫目的醫療機構而醫護人員尚未處置前。&lt;br /&gt;(違反 處新臺幣一萬元以上五萬元)&lt;br /&gt;&lt;br /&gt;第 27 條 &lt;br /&gt;救護技術員應依緊急傷病患救護作業程序，施行救護。 (違反 處新臺幣一萬元以上五萬元)&lt;br /&gt;前項緊急傷病患救護作業程序，由直轄市、縣（市）衛生主管機關定之。&lt;br /&gt;&lt;br /&gt;第 29 條 &lt;br /&gt;救護人員應依救災救護指揮中心指示前往現場急救，並將緊急傷病患送達&lt;br /&gt;就近適當醫療機構。&lt;br /&gt;(違反 處新臺幣一萬元以上五萬元)&lt;br /&gt;&lt;br /&gt;第 33 條 &lt;br /&gt;遇大量傷病患，參與現場急救救護人員及救護車設置機關（構），均應依&lt;br /&gt;現場指揮協調系統之指揮，施行救護。&lt;br /&gt;(違反 處新臺幣一萬元以上五萬元)&lt;br /&gt;&lt;br /&gt;第 34 條 &lt;br /&gt;救護人員施行救護，應填具救護紀錄表，分別交由該救護車設置機關（構）&lt;br /&gt;及應診之醫療機構保存至少七年。&lt;br /&gt;(違反 救護車設置機關（構）處新臺幣六萬元以上三十萬元以下&lt;br /&gt;救護人員 處新臺幣五千元以上二萬五千元)&lt;br /&gt;前項醫療機構應將救護紀錄表併病歷保存。&lt;br /&gt;(處新臺幣一萬元以上五萬元)&lt;br /&gt;&lt;br /&gt;第 35 條 &lt;br /&gt;救護技術員及其他參與緊急醫療救護業務之機關（構）所屬人員，因業務&lt;br /&gt;而知悉或持有他人之秘密，不得無故洩漏。&lt;br /&gt;(違反 處新臺幣一萬元以上五萬元)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-3914932788139138235?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/3914932788139138235/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=3914932788139138235' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/3914932788139138235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/3914932788139138235'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2011/10/blog-post.html' title='第一課：緊急醫療救護法'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-9072095731836945696</id><published>2011-10-19T10:03:00.004+08:00</published><updated>2011-10-19T10:19:44.652+08:00</updated><title type='text'>2011 EMT筆試複習</title><content type='html'>又要一年一度的筆試了，範圍很大，我就根據我看的重點跟大&lt;wbr&gt;&lt;span class="word_break"&gt;&lt;/span&gt;家一起分享吧&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://clc168.blogspot.com/2011/10/blog-post.html"&gt;第一課：緊急醫療救護法&lt;/a&gt;&lt;br /&gt;&lt;a href="http://clc168.blogspot.com/2011/10/ex-1.html"&gt;第二課：救護技術員管理辦法&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-9072095731836945696?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/9072095731836945696/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=9072095731836945696' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/9072095731836945696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/9072095731836945696'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2011/10/2011-emt.html' title='2011 EMT筆試複習'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-6865776542948311274</id><published>2011-10-05T15:24:00.000+08:00</published><updated>2011-10-11T11:36:25.612+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='qemu; qcow2; qcow; mount;'/><title type='text'>[QEMU] HowTo mount your QCOW2 on Ubuntu</title><content type='html'>&lt;blockquote&gt;Since the qcow2 format is not a simple linear block format like disks and raw files, it is necessary to use the network block device tool that's part of the qemu toolkit.....&lt;/blockquote&gt;from &lt;a href="http://en.wikipedia.org/wiki/Qcow"&gt;qcow&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I list the procedure I did for the memory..&lt;br /&gt;&lt;br /&gt;Console 1:&lt;br /&gt;/* run a nbd server */&lt;br /&gt;$ qemu-nbd xxx.qcow2&lt;br /&gt;&lt;br /&gt;Console 2:&lt;br /&gt;/* check the network state, port 10809 is listening ... */&lt;br /&gt;$ netstat -atnp |grep qemu-nbd&lt;br /&gt;tcp 0 0 0.0.0.0:10809 0.0.0.0:* LISTEN 30075/qemu-nbd&lt;br /&gt;&lt;br /&gt;/* connect to a server running nbd-server */&lt;br /&gt;$ sudo nbd-client localhost 10809 /dev/nbd0&lt;br /&gt;&lt;br /&gt;/* mount NBD0 to /mnt */&lt;br /&gt;$ sudo mount /dev/nbd0 -o loop /mnt/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-6865776542948311274?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/6865776542948311274/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=6865776542948311274' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/6865776542948311274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/6865776542948311274'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2011/10/qemu-howto-mount-your-qcow2-on-ubuntu.html' title='[QEMU] HowTo mount your QCOW2 on Ubuntu'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-451748729267484158</id><published>2011-05-17T15:18:00.002+08:00</published><updated>2011-05-17T15:18:31.371+08:00</updated><title type='text'>呼吸</title><content type='html'>&lt;div style="width:425px" id="__ss_7990616"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/ZivChang/ss-7990616" title="呼吸"&gt;呼吸&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse7990616" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-110517021423-phpapp02&amp;stripped_title=ss-7990616&amp;userName=ZivChang" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse7990616" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-110517021423-phpapp02&amp;stripped_title=ss-7990616&amp;userName=ZivChang" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/ZivChang"&gt;Li-Chung Chang&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-451748729267484158?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/451748729267484158/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=451748729267484158' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/451748729267484158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/451748729267484158'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2011/05/blog-post.html' title='呼吸'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-1078581320199896121</id><published>2010-01-05T10:57:00.003+08:00</published><updated>2010-01-05T11:22:09.355+08:00</updated><title type='text'>安裝Gstreamer</title><content type='html'>&lt;a href="http://moblin.org/documentation/test-drive-moblin/using-moblin-live-image#comment-1485"&gt;using-moblin-live-image&lt;/a&gt;&lt;br /&gt;Submitted by barky&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's what you need to do...&lt;br /&gt;&lt;br /&gt;Build gstreamer modules&lt;br /&gt;-----------------------&lt;br /&gt;&lt;br /&gt;get the gstreamer packages: from http://gstreamer.freedesktop.org/src/&lt;br /&gt;&lt;br /&gt;from the gst-ffmpeg directory get gst-ffmpeg-0.10.9.tar.bz2 extract to Download directory&lt;br /&gt;from the gst-plugins-bad directory get gst-plugins-bad-0.10.16.tar.bz2 extract to Download directory&lt;br /&gt;from the gst-plugins-base directory get gst-plugins-base-0.10.25.tar.bz2 extract to Download directory&lt;br /&gt;from the gst-plugins-good directory get gst-plugins-good-0.10.16.tar.bz2 extract to Download directory&lt;br /&gt;from the gst-plugins-ugly directory get gst-plugins-ugly-0.10.13.tar.bz2 extract to Download directory&lt;br /&gt;from the gstreamer directory get gstreamer-0.10.25.tar.bz2 extract to Download directory&lt;br /&gt;&lt;br /&gt;Install build dependent packages:&lt;br /&gt;&lt;br /&gt;yum install gcc bison flex *glib* *diff* liboil*dev*&lt;br /&gt;&lt;br /&gt;Build the modules in this order:&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#d1d1d1;background:#000000;'&gt;cd &lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;gstreamer&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;&lt;span style='color:#009797; '&gt;0.10.25&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;configure &lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;prefix&lt;span style='color:#d2cd86; '&gt;=&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;usr &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; make &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; sudo make install&lt;br /&gt;&lt;br /&gt;cd &lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;gst&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;plugins&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;base&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;&lt;span style='color:#009797; '&gt;0.10.25&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;configure &lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;prefix&lt;span style='color:#d2cd86; '&gt;=&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;usr &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; make &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; sudo make install&lt;br /&gt;&lt;br /&gt;cd &lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;gst&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;plugins&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;good&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;&lt;span style='color:#009797; '&gt;0.10.17&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;configure &lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;prefix&lt;span style='color:#d2cd86; '&gt;=&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;usr &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; make &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; sudo make install&lt;br /&gt;&lt;br /&gt;cd &lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;gst&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;plugins&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;bad&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;&lt;span style='color:#009797; '&gt;0.10.17&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;configure &lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;prefix&lt;span style='color:#d2cd86; '&gt;=&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;usr &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; make &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; sudo make install&lt;br /&gt;&lt;br /&gt;cd &lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;gst&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;plugins&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;ugly&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;&lt;span style='color:#009797; '&gt;0.10.13&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;configure &lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;prefix&lt;span style='color:#d2cd86; '&gt;=&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;usr &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; make &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; sudo make install&lt;br /&gt;&lt;br /&gt;cd &lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;gst&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;ffmpeg&lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;&lt;span style='color:#00a800; '&gt;0.10&lt;/span&gt;&lt;span style='color:#00a800; '&gt;.9&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;configure &lt;span style='color:#d2cd86; '&gt;-&lt;/span&gt;prefix&lt;span style='color:#d2cd86; '&gt;=&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;/&lt;/span&gt;usr &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; make &lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;&amp;amp;&lt;/span&gt; sudo make install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;reboot just to be safe!&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-1078581320199896121?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/1078581320199896121/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=1078581320199896121' title='40 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1078581320199896121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1078581320199896121'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2010/01/gstreamer.html' title='安裝Gstreamer'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>40</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-7620391635843161636</id><published>2009-10-08T10:20:00.001+08:00</published><updated>2009-10-08T10:20:54.835+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python template'/><title type='text'>python basic template</title><content type='html'>The following is python basic template:&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#d1d1d1;background:#000000;'&gt;&lt;span style='color:#9999a9; '&gt;#! /usr/bin/env python&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#e66170; font-weight:bold; '&gt;import&lt;/span&gt; os&lt;br /&gt;&lt;span style='color:#e66170; font-weight:bold; '&gt;import&lt;/span&gt; sys&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#e66170; font-weight:bold; '&gt;def&lt;/span&gt; main&lt;span style='color:#d2cd86; '&gt;(&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;*&lt;/span&gt;argv&lt;span style='color:#d2cd86; '&gt;)&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;:&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#e66170; font-weight:bold; '&gt;print&lt;/span&gt; &lt;span style='color:#00c4c4; '&gt;"hello"&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;,&lt;/span&gt; argv&lt;span style='color:#d2cd86; '&gt;[&lt;/span&gt;&lt;span style='color:#008c00; '&gt;0&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#e66170; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#e34adc; '&gt;__name__&lt;/span&gt; &lt;span style='color:#d2cd86; '&gt;=&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;=&lt;/span&gt; &lt;span style='color:#00c4c4; '&gt;"__man__"&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;:&lt;/span&gt;&lt;br /&gt;        sys&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;&lt;span style='color:#e34adc; '&gt;exit&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;(&lt;/span&gt;main&lt;span style='color:#d2cd86; '&gt;(&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;*&lt;/span&gt;sys&lt;span style='color:#d2cd86; '&gt;.&lt;/span&gt;argv&lt;span style='color:#d2cd86; '&gt;)&lt;/span&gt;&lt;span style='color:#d2cd86; '&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-7620391635843161636?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/7620391635843161636/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=7620391635843161636' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/7620391635843161636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/7620391635843161636'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2009/10/python-basic-template.html' title='python basic template'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-4818194869854937562</id><published>2009-03-24T10:58:00.000+08:00</published><updated>2009-03-24T10:59:09.439+08:00</updated><title type='text'>diff的使用小筆記</title><content type='html'>diff -urN -x ".svn" a_dir b_dir &gt; ab.diff&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-4818194869854937562?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/4818194869854937562/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=4818194869854937562' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/4818194869854937562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/4818194869854937562'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2009/03/diff.html' title='diff的使用小筆記'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-2471237381980037338</id><published>2009-03-20T11:22:00.003+08:00</published><updated>2009-03-20T11:27:04.103+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='udev device node 屬性 hotplug  rule udevinfo'/><title type='text'>udev操作 如何從udevinfo udevmonitor的觀察來寫udev rule</title><content type='html'>udev&lt;br /&gt;&lt;div id=":vl" class="ii gt"&gt;userspace device management&lt;br /&gt;目的是允許使用者動態的管理device node&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#===============&lt;br /&gt;# 緣起&lt;br /&gt;#===============&lt;br /&gt;1.&lt;br /&gt;device node是Linux系統user space跟hardware device溝通的介面&lt;br /&gt;$ ls -al /dev&lt;br /&gt;...&lt;br /&gt;crw-rw----  1 root   audio    14,  12 2009-03-18 08:54 adsp     //ALSA audio&lt;br /&gt;crw-rw----  1 root   dialout 188,   0 2009-03-18 17:05 ttyUSB0  //usb serial port&lt;br /&gt;brw-rw----  1 root   disk      8,   1 2009-03-18 08:54 sda1     //HD&lt;br /&gt;brw-rw----  1 root   disk      1,   0 2009-03-18 08:54 ram0     //ram&lt;br /&gt;crw-rw----  1 root   audio    10, 135 2009-03-18 08:54 rtc      //real time clock&lt;br /&gt;...&lt;br /&gt;P.S.&lt;br /&gt;c: character device, b: block device&lt;br /&gt;&lt;br /&gt;2.&lt;br /&gt;傳統使用者自己手動device node，&lt;br /&gt;後來有devfs可以自動建立device node，但有缺點是建立的規則是寫在driver內，&lt;wbr&gt;無法在user space決定node的名字屬性等等[2]&lt;br /&gt;&lt;br /&gt;3.&lt;br /&gt;sysfs是一個在2.6 kernel新出的檔案系統，由kernel本身管理，&lt;wbr&gt;當device plug進系統時，會顯示基本的device資訊，&lt;wbr&gt;udev會利用這個資訊，以及設定的rule條件，來建立&lt;br /&gt;或是執行一些額外的程式&lt;br /&gt;&lt;br /&gt;#===============&lt;br /&gt;# 提供的功能&lt;br /&gt;#===============&lt;br /&gt;1. Rename a device node from the default name to something else&lt;br /&gt;   (自己可以device node名字)&lt;br /&gt;2. Provide an alternative/persistent name for a device node by creating a symbolic link to the default device node&lt;br /&gt;   (可以建立device node別名-symbolic link)&lt;br /&gt;3. Name a device node based on the output of a program&lt;br /&gt;   (名字的決定還可以呼叫外部程式)&lt;br /&gt;4. Change permissions and ownership of a device node&lt;br /&gt;   (預設建立的device node權限可以改變)&lt;br /&gt;   (例如usb device預設建立出來0660，&lt;wbr&gt;可以改變一建立就是0666)&lt;br /&gt;5. Launch a script when a device node is created or deleted (typically when a device is attached or unplugged)&lt;br /&gt;   (可以在device node建立或是刪除時執行外部script)&lt;br /&gt;6. Rename network interfaces&lt;br /&gt;   (network interface也可以改名)&lt;br /&gt;[1]&lt;br /&gt;&lt;br /&gt;#===============&lt;br /&gt;# rules的範例&lt;br /&gt;#===============&lt;br /&gt;+-----------------------------&lt;wbr&gt;------------------------------&lt;wbr&gt;------------------------------&lt;wbr&gt;-------&lt;br /&gt;Q1. Change permissions and ownership of a device node&lt;br /&gt;&lt;br /&gt;dnwOTG USB driver是一個根據drivers/usb/usb-&lt;wbr&gt;skeleton.c的usb driver&lt;br /&gt;當VENDOR_ID和PRODUCT_&lt;wbr&gt;ID符合的裝置plug之後，會主動建立/dev/&lt;wbr&gt;dnwOTG這device node&lt;br /&gt;但是他的權限是0660 root root所以變成一般使用者無法直接read/write&lt;br /&gt;一般情況&lt;br /&gt;$ ll /dev/dnwOTG -al&lt;br /&gt;crw-rw---- 1 root root 180, 192 2009-03-18 18:36 /dev/dnwOTG&lt;br /&gt;&lt;br /&gt;如何加入規則希望變成這樣&lt;br /&gt;$ ll /dev/dnwOTG -al&lt;br /&gt;crw-rw-rw- 1 root root 180, 192 2009-03-18 18:35 /dev/dnwOTG&lt;br /&gt;&lt;br /&gt;Answer:&lt;br /&gt;1. 使用工具程式udevmonitor&lt;br /&gt;$ udevmonitor --udev&lt;br /&gt;(執行dnw c2000000, 使得usb device出現，會觀察到)&lt;br /&gt;&lt;br /&gt;UDEV  [1237372815.218233] add      /devices/pci0000:00/0000:00:&lt;wbr&gt;1d.7/usb5/5-3 (usb)&lt;br /&gt;UDEV  [1237372815.218391] add      /class/usb_endpoint/usbdev5.&lt;wbr&gt;118_ep00 (usb_endpoint)&lt;br /&gt;UDEV  [1237372815.255269] add      /devices/pci0000:00/0000:00:&lt;wbr&gt;1d.7/usb5/5-3/5-3:1.0 (usb)&lt;br /&gt;UDEV  [1237372815.255379] add      /class/usb/dnwOTG (usb)&lt;br /&gt;                              &lt;wbr&gt;    ^^^^^^^^^^^^^^^^^^^^&lt;br /&gt;UDEV  [1237372815.255465] add      /class/usb_endpoint/usbdev5.&lt;wbr&gt;118_ep81 (usb_endpoint)&lt;br /&gt;UDEV  [1237372815.255550] add      /class/usb_endpoint/usbdev5.&lt;wbr&gt;118_ep02 (usb_endpoint)&lt;br /&gt;UDEV  [1237372815.278249] add      /class/usb_device/usbdev5.118 (usb_device)&lt;br /&gt;&lt;br /&gt;得知有這一udev event&lt;br /&gt;&lt;br /&gt;2. 使用工具程式udevinfo&lt;br /&gt;$ udevinfo -a -p /class/usb/dnwOTG&lt;br /&gt;...&lt;br /&gt;  looking at device '/class/usb/dnwOTG':&lt;br /&gt;    KERNEL=="dnwOTG"&lt;br /&gt;    SUBSYSTEM=="usb"&lt;br /&gt;    DRIVER==""&lt;br /&gt;    ATTR{dev}=="180:192"&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;3. 加入規則改變mode&lt;br /&gt;sudo vi /etc/udev/rules.d/40-&lt;wbr&gt;permissions.rules&lt;br /&gt;最後一行加入&lt;br /&gt;KERNEL=="dnwOTG",           MODE="0666"&lt;br /&gt;&lt;br /&gt;+-----------------------------&lt;wbr&gt;------------------------------&lt;wbr&gt;------------------------------&lt;wbr&gt;-------&lt;br /&gt;Q2. 希望能當mvp kernel開完，OTG ready同時在host PC自己建立好network usb0 (不用在ifdown usb0;ifup usb0)&lt;br /&gt;&lt;br /&gt;Answer:&lt;br /&gt;1. 使用工具程式udevmonitor&lt;br /&gt;$ udevmonitor --udev&lt;br /&gt;...&lt;br /&gt;UDEV  [1237373325.456422] add      /class/usb_endpoint/usbdev5.&lt;wbr&gt;122_ep01 (usb_endpoint)&lt;br /&gt;UDEV  [1237373325.462935] add      /class/usb_device/usbdev5.122 (usb_device)&lt;br /&gt;UDEV  [1237373325.632610] add      /class/net/usb0 (net)&lt;br /&gt;                              &lt;wbr&gt;    ^^^^^^^^^^^^^^^^^&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;得知有這一udev event&lt;br /&gt;&lt;br /&gt;2. 使用工具程式udevinfo&lt;br /&gt;$ udevinfo -a -p /class/net/usb0&lt;br /&gt;...&lt;br /&gt;  looking at device '/class/net/usb0':&lt;br /&gt;    KERNEL=="usb0"&lt;br /&gt;    SUBSYSTEM=="net"&lt;br /&gt;    DRIVER==""&lt;br /&gt;    ATTR{weight}=="0"&lt;br /&gt;    ATTR{tx_queue_len}=="1000"&lt;br /&gt;    ATTR{flags}=="0x1003"&lt;br /&gt;    ATTR{mtu}=="1500"&lt;br /&gt;    ATTR{operstate}=="unknown"&lt;br /&gt;    ATTR{dormant}=="0"&lt;br /&gt;    ATTR{carrier}=="1"&lt;br /&gt;    ATTR{broadcast}=="ff:ff:ff:ff:&lt;wbr&gt;ff:ff"&lt;br /&gt;    ATTR{address}=="42:f9:d6:bf:&lt;wbr&gt;97:10"&lt;br /&gt;    ATTR{link_mode}=="0"&lt;br /&gt;    ATTR{type}=="1"&lt;br /&gt;    ATTR{features}=="0x0"&lt;br /&gt;    ATTR{ifindex}=="31"&lt;br /&gt;    ATTR{iflink}=="31"&lt;br /&gt;    ATTR{addr_len}=="6"&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;3. 加入規則&lt;br /&gt;sudo vi /etc/udev/rules.d/80-programs.&lt;wbr&gt;rules&lt;br /&gt;最後加入&lt;br /&gt;# 當usb0進來且條件是SUBSYSTEM=="net", ACTION=="add" 執行/lib/udev/usb0nic的程式&lt;br /&gt;KERNEL=="usb0", SUBSYSTEM=="net", ACTION=="add", \&lt;br /&gt;    RUN+="usb0nic on"&lt;br /&gt;&lt;br /&gt;# 當usb0進來且條件是SUBSYSTEM=="net", ACTION=="remove" 執行/lib/udev/usb0nic的程式&lt;br /&gt;KERNEL=="usb0", SUBSYSTEM=="net", ACTION=="remove", \&lt;br /&gt;    RUN+="usb0nic off"&lt;br /&gt;&lt;br /&gt;4. 編輯usb0nic&lt;br /&gt;$ sudo vi /lib/udev/usb0nic&lt;br /&gt;#! /bin/sh&lt;br /&gt;if test -z "$1"&lt;br /&gt;then&lt;br /&gt;    exit&lt;br /&gt;else&lt;br /&gt;    if [ $1 == "on" ];then&lt;br /&gt;        usb_exist=`ifconfig | awk '/usb0/{print $1}'`&lt;br /&gt;        if [ $usb_exist == "usb0" ]; then&lt;br /&gt;           ifdown usb0&lt;br /&gt;        fi&lt;br /&gt;        ifup usb0&lt;br /&gt;    fi&lt;br /&gt;    if [ $1 == "off" ];then&lt;br /&gt;        ifdown usb0&lt;br /&gt;    fi&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;$ sudo chmod +x /lib/udev/usb0nic&lt;br /&gt;&lt;br /&gt;#===============&lt;br /&gt;# 參考資料&lt;br /&gt;#===============&lt;br /&gt;1. [Writing udev rules,version 0.74], Daniel Drake (dsd), &lt;a href="http://reactivated.net/writing_udev_rules.html" target="_blank"&gt;http://reactivated.net/&lt;wbr&gt;writing_udev_rules.html&lt;/a&gt;&lt;br /&gt;詳細說明如何寫udev rules，使用實際範例說明，淺顯易懂&lt;br /&gt;2. [udev and devfs - The final word], Greg Kroah-Hartman, &lt;a href="http://kernel.org/pub/linux/utils/kernel/hotplug/udev_vs_devfs" target="_blank"&gt;http://kernel.org/pub/linux/&lt;wbr&gt;utils/kernel/hotplug/udev_vs_&lt;wbr&gt;devfs&lt;/a&gt;&lt;br /&gt;udev的創始者說明udev跟devfs的差異和比較&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-2471237381980037338?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/2471237381980037338/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=2471237381980037338' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/2471237381980037338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/2471237381980037338'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2009/03/udev-udevinfo-udevmonitorudev-rule.html' title='udev操作 如何從udevinfo udevmonitor的觀察來寫udev rule'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-488193562066273960</id><published>2009-01-22T16:59:00.003+08:00</published><updated>2009-01-22T17:14:14.801+08:00</updated><title type='text'>Xorg的筆記</title><content type='html'>#開啟新的xterm(xclent)到:1(xserver)&lt;br /&gt;xinit `which xterm` -- :1&lt;br /&gt;#此xterm不能被關掉不能整個xclent都關掉了&lt;br /&gt;在此xterm下&lt;br /&gt;/etc/X11/Xsession &amp;amp;&lt;br /&gt;Xnest :2 -geometry 480x800&lt;br /&gt;export DISPLAY=:2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;感謝Levi大大&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-488193562066273960?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/488193562066273960/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=488193562066273960' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/488193562066273960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/488193562066273960'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2009/01/xorg.html' title='Xorg的筆記'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-2175498353715962527</id><published>2008-10-24T16:52:00.000+08:00</published><updated>2008-10-24T16:58:14.245+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux PCM 轉檔  covnert wav'/><title type='text'>轉檔PCM</title><content type='html'>&lt;h3 class="post-title entry-title"&gt;這真是太珍貴的資訊了&lt;/h3&gt;http://ryancx.blogspot.com/search?q=pcm&lt;br /&gt;感謝RYAN&lt;br /&gt;&lt;br /&gt;&lt;h3 class="post-title entry-title"&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 class="post-title entry-title"&gt; &lt;a href="http://ryancx.blogspot.com/2008/06/covnert-wma-to-mp3.html"&gt;轉檔：Covnert wma to mp3&lt;/a&gt; &lt;/h3&gt;   #先轉至pcm&lt;br /&gt;mplayer Samba.wma -ao pcm:file=test.pcm&lt;br /&gt;#再編成MP3&lt;br /&gt;lame -ms test.pcm -o Samba.mp3&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-2175498353715962527?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/2175498353715962527/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=2175498353715962527' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/2175498353715962527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/2175498353715962527'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2008/10/pcm.html' title='轉檔PCM'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-7902438007379994642</id><published>2008-10-20T13:58:00.004+08:00</published><updated>2008-12-05T14:32:14.804+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install ubuntu apt'/><title type='text'>安裝Ubuntu</title><content type='html'>當安裝完Ubuntu後，還需安裝套件的筆記&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;1. 安裝nfs&lt;/span&gt;&lt;br /&gt;$ sudo apt-get install nfs-common nfs-kernel-server&lt;br /&gt;$ sudo vi /etc/exports&lt;br /&gt;/work/MVP  192.168.*.*(rw,no_root_squash,nohide,insecure,no_subtree_check,async)&lt;br /&gt;/etc/init.d/nfs-kernel-server restart&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;2. 安裝tftp&lt;/span&gt;&lt;br /&gt;sudo apt-get install xinetd tftp-hpa tftpd-hpa&lt;br /&gt;vi  /etc/xinetd.d/tftp&lt;br /&gt;service tftp&lt;br /&gt;{&lt;br /&gt;      socket_type     = dgram&lt;br /&gt;      protocol        = udp&lt;br /&gt;      wait            = yes&lt;br /&gt;      user            = root&lt;br /&gt;      server          = /usr/sbin/in.tftpd&lt;br /&gt;      server_args     = -s /var/lib/tftpboot&lt;br /&gt;      disable         = no&lt;br /&gt;      per_source      = 11&lt;br /&gt;      cps             =       100 2&lt;br /&gt;      flags           = IPv4&lt;br /&gt;}&lt;br /&gt;sudo /etc/init.d/xinetd restart&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;3. 安裝inputrc&lt;/span&gt;&lt;br /&gt;cp .inputrc ~/&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;4. 安裝samba&lt;/span&gt;&lt;br /&gt;$ sudo apt-get install samba smbfs&lt;br /&gt;$ sudo smbpasswd -a lucky&lt;br /&gt;$ sudo vi /etc/samba/smb.conf&lt;br /&gt;[FIRST]&lt;br /&gt;  comment = Lucky NB&lt;br /&gt;  path = /&lt;br /&gt;  available = yes&lt;br /&gt;  browsable = yes&lt;br /&gt;  public = yes&lt;br /&gt;  writable = yes&lt;br /&gt;$ sudo /etc/init.d/samba restart&lt;br /&gt;&lt;br /&gt;5. apt&lt;br /&gt;sudo apt-get install&lt;br /&gt;vim mc ctags cscope global gcc-4.1 linux-source libncurses5-dev denyhosts&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-7902438007379994642?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/7902438007379994642/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=7902438007379994642' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/7902438007379994642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/7902438007379994642'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2008/10/ubuntu.html' title='安裝Ubuntu'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-1245386888017490239</id><published>2008-07-25T15:58:00.000+08:00</published><updated>2008-07-25T15:59:43.019+08:00</updated><title type='text'>筆記-12對腦神經</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;12&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;對腦神經&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: 新細明體;"&gt;口訣&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: 新細明體;"&gt;一嗅二視三動眼&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;四滑五叉六外旋&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: 新細明體;"&gt;七顏八聽九舌咽&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;十來迷走副舌下&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;1&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;嗅神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;olfactory&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;嗅神經屬感覺神經，受器位於鼻腔黏膜，主司嗅覺。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;2&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;視神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;optic&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;視神經屬感覺神經，受氣位於眼睛的視網膜，主司視覺。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;動眼神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;oculomotor&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;動眼神經屬運動神經，支配眼球轉動及瞳孔收縮。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;4&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;滑車神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;trochlear&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;滑車神經屬運動神經，支配眼睛的上斜肌。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;5&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;三叉神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;trigeminal&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;三叉神經屬混合神經，感覺神經傳送臉部皮膚和黏膜的感覺，運動神經支配咀嚼肌及嘴巴底部的肌肉。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;6&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;外旋神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;abducens&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;屬運動神經，支配眼外質肌。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;7&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;顏面神經&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;（&lt;/span&gt;&lt;span lang="EN-US"&gt;facial&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;　屬混合神經，運動神經支配顏面肌，感覺神經傳送舌前部的味覺，另有自主神經調節唾液。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;8&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;聽神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;vestibulocochlear&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;屬感覺神經，分為兩部份：一是耳蝸神經，傳送聽覺訊息﹔一是前庭神經，主司平衡。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;9&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;舌咽神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;glossopharyngeal&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;屬混合神經，其運動神經支配咽部肌肉，感覺神經傳送舌後味覺及咽部的感覺。並與迷走神經一起調節動脈壓和心跳。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;迷走神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;vagus&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;屬混合神經，運動神經支配咽部肌肉及聲門。感覺神經傳送內耳道及內臟黏膜的訊息。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;11&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;副神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;accessory&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）&lt;/span&gt; &lt;span style="font-family: 新細明體;"&gt;屬運動神經，支配頸部肌肉。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br /&gt;12&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;舌下神經（&lt;/span&gt;&lt;span lang="EN-US"&gt;hypoglossal&lt;/span&gt;&lt;span style="font-family: 新細明體;"&gt;）屬混合神經，支配舌肌與傳送其的感覺。&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-1245386888017490239?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/1245386888017490239/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=1245386888017490239' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1245386888017490239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1245386888017490239'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2008/07/12.html' title='筆記-12對腦神經'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-1505730261344351017</id><published>2008-04-03T08:53:00.001+08:00</published><updated>2008-04-03T08:54:44.276+08:00</updated><title type='text'>如何移植Bluetooth到ARM Embedded Linux</title><content type='html'>&lt;span class="postbody"&gt;Bluetooth in ARM Linux&lt;br /&gt; - 使用BlueZ架構下，編譯移植 Linux Kernel, bluez-libs, bluez-utils, dbus, libxml2, openobex, libiconv, sobexsrv的&gt;過程&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;內容如下&lt;/span&gt;&lt;br /&gt;1. Bluetooth簡介&lt;br /&gt;2. 硬體方面簡介&lt;br /&gt;2. 軟體架構簡介&lt;br /&gt;3. 移植過程&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 18px; line-height: normal;"&gt;1. Bluetooth簡介 - 摘錄Linux unwired - Chapter 7[2]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;wireless技術.&lt;br /&gt;使用2.4GHz頻率.&lt;br /&gt;最快速度(單向)720 Kbps.&lt;br /&gt;雖然跟WiFi 802.11同是使用頻率2.4GHz, 比較上802.11傳輸速度快但硬體設備相對耗電, 兩者應用範圍不太一致, bluetooth在於&lt;br /&gt;讓兩個設備有連結能力的一個低成本低耗電的方法.&lt;br /&gt;Linux kernel支援Bluetooth已經成熟.&lt;br /&gt;Bluetooth由Special Interest Group(SIG)提出，最早的版本是在1999年. 1.1版在2001年公佈. 1.2版在2003年公佈&lt;br /&gt;&lt;br /&gt;Some layers of the BLuetooth specification&lt;br /&gt;&lt;br /&gt;---------- ------- -------&lt;br /&gt;| RFCOMM | | SDP | |     |&lt;br /&gt;---------- ------- | SCO |&lt;br /&gt;------------------ |     |&lt;br /&gt;|     L2CAP      | |     |&lt;br /&gt;------------------ -------&lt;br /&gt;--------------------------&lt;br /&gt;|          HCI           |&lt;br /&gt;--------------------------&lt;br /&gt;--------------------------&lt;br /&gt;|    Radio transport     |&lt;br /&gt;--------------------------&lt;br /&gt;RFCOMM: Radio Frequency Communication. Serial emulation&lt;br /&gt;SDP: Service Discovery Protocol&lt;br /&gt;L2CAP: Logical Linck Control and Adaptation Protocol&lt;br /&gt;SCO: for audio&lt;br /&gt;HCI: Host controller interface&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;Bluetooth可以用來做什麼？&lt;/span&gt;&lt;br /&gt;Serial port, Object exchange(OBEX), Synchronization, Networking, Input devices, Audio&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;Bluetooth Conceputs-&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bluetooth Address:&lt;/span&gt;&lt;br /&gt;簡稱 BDADDR, 類似Ethernet上的MAC address, 每個Bluetooth設備都有獨一無二的號碼&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bluetooth Protocols:&lt;/span&gt;&lt;br /&gt;規範了許多protocol但並不是每個device都要支援所有的protocol. 列舉一些Protocols.&lt;br /&gt;Link Manager Protocol(LMP), Logical Link Control and Adaptation Protocol(L2CAP), Radio Frequency Communication(RFCOMM), Object Exchange(OBEX), Bluetooth Network Encapsulation Protocol(BNEP), Service Discovery Protocol(SDP), Telephony Control Protocol Specification(TCS)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bluetooth Profiles:&lt;/span&gt;&lt;br /&gt;Profile的意思就是 - 實作一個或一個以上protocols來達到特定應用服務&lt;br /&gt;常見的有&lt;br /&gt;Service Discovery Access Profile(SDAP), Serial Port Profile(SPP), Hardcopy Cable Replacement(HCRP), Dial-up Networking Profile(DUN), LAN Access Profile(LAP), Headset Profile(HS), Generic Object Exchange Profile(GOEP), File Transfer Profile(FTP), Synchronization Profile(SP), Human Interface Device Profile(HID), Personal Area Networking(PAN), Basic Printing Profile(BPP)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bonding:&lt;/span&gt;&lt;br /&gt;Bonding又叫pairing.一個建立兩個Bluetooth device的過程.使用者需要輸入Personal Identification numbers(PINs)來驗證. &gt;通常PIN都是4個數字, 只能提供很低的安全性. 但當兩者設備Bonding完畢. 兩者會產生一組Link key來保障傳遞時的安全性&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Discoverability:&lt;/span&gt;&lt;br /&gt;當其他Bluetooth設備可以探訪到這台Bluetooth設備，就是代表有discovery的能力&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Device classes:&lt;/span&gt;&lt;br /&gt;因為Bluetooth device有很多方面的功能, 快速的指出這個device主要的功能就是靠class&lt;br /&gt;class code是24-bit number組成&lt;br /&gt;&lt;br /&gt;bit 12-8&lt;br /&gt;00000 Miscellaneous&lt;br /&gt;00001 Computer(from desktop to PDA)&lt;br /&gt;00010 Telephone(cell phone, payphone, cordless phone)&lt;br /&gt;00011 Network access point&lt;br /&gt;00100 Audio/Video device(headset, speakers)&lt;br /&gt;00101 Peripheral(Keyboard, mouse, joystick)&lt;br /&gt;00110 Imaging(printer, camera, scanner)&lt;br /&gt;11111 Uncategorized&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bit 16 Position(location information, e.g. GPS_&lt;br /&gt;Bit 17 Networking&lt;br /&gt;Bit 18 Rendering(printer, speakers)&lt;br /&gt;Bit 19 Capturing(scanner, microphone)&lt;br /&gt;Bit 20 Object transfer&lt;br /&gt;Bit 21 Audio(speaker, microphone, headset)&lt;br /&gt;Bit 22 Telephone(modem, cordless telephone, headset)&lt;br /&gt;Bit 23 Information(web server)&lt;br /&gt;&lt;br /&gt;ex: 如果class = 0x3e0100&lt;br /&gt;代表的就是 0011 1110 0000 0001 0000 0000&lt;br /&gt;             - Audio(speaker, microphone, headset)&lt;br /&gt;              - Object transfer&lt;br /&gt;                - Capturing(scanner, microphone)&lt;br /&gt;                 - Rendering(printer, speakers)&lt;br /&gt;                  -  Networking&lt;br /&gt;                             - Computer(from desktop to PDA)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 18px; line-height: normal;"&gt;2. 硬體&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;CSR的USB Bluetooth dongle，售價大概台幣NT150左右&lt;br /&gt;拿來插入工作的主機USB port後，先用一些hci相關指令查看一些詳細的資訊&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;$ hciconfig -a&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;...&lt;br /&gt;hci1:   Type: USB&lt;br /&gt;        BD Address: 00:02:5B:01:CD:FF ACL MTU: 384:8 SCO MTU: 64:8&lt;br /&gt;        UP RUNNING PSCAN ISCAN&lt;br /&gt;        RX bytes:1339 acl:0 sco:0 events:41 errors:0&lt;br /&gt;        TX bytes:393 acl:0 sco:0 commands:30 errors:0&lt;br /&gt;        Features: 0xff 0xff 0x8f 0xfe 0x9b 0xf9 0x00 0x80&lt;br /&gt;        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3&lt;br /&gt;        Link policy: RSWITCH HOLD SNIFF PARK&lt;br /&gt;        Link mode: SLAVE ACCEPT&lt;br /&gt;        Name: 'clc-HP-1'&lt;br /&gt;        Class: 0x08010c&lt;br /&gt;        Service Classes: Capturing&lt;br /&gt;        Device Class: Computer, Laptop&lt;br /&gt;        HCI Ver: 1.2 (0x2) HCI Rev: 0x7a6 LMP Ver: 1.2 (0x2) LMP Subver: 0x7a6&lt;br /&gt;        Manufacturer: Cambridge Silicon Radio (10)&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在根據BD Address&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;$ sudo hcitool info 00:02:5B:01:CD:FF&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;Requesting information ...&lt;br /&gt;        BD Address:  00:02:5B:01:CD:FF&lt;br /&gt;        Device Name: clc-HP-1&lt;br /&gt;        LMP Version: 2.0 (0x3) LMP Subversion: 0x7a6&lt;br /&gt;        Manufacturer: Cambridge Silicon Radio (10)&lt;br /&gt;        Features: 0xff 0xff 0x8f 0xfe 0x9b 0xf9 0x00 0x80&lt;br /&gt;                &lt;3-slot&gt; &lt;5-slot&gt; &lt;encryption&gt; &lt;slot&gt;&lt;br /&gt;                &lt;timing&gt; &lt;role&gt; &lt;hold&gt; &lt;sniff&gt;&lt;br /&gt;                &lt;park&gt; &lt;rssi&gt; &lt;channel&gt; &lt;sco&gt; &lt;hv2&gt;&lt;br /&gt;                &lt;hv3&gt; &lt;u-law&gt; &lt;a-law&gt; &lt;cvsd&gt; &lt;paging&gt;&lt;br /&gt;                &lt;power&gt; &lt;transparent&gt; &lt;broadcast&gt;&lt;br /&gt;                &lt;edr&gt; &lt;edr&gt; &lt;enhanced&gt;&lt;br /&gt;                &lt;interlaced&gt; &lt;interlaced&gt; &lt;inquiry&gt;&lt;br /&gt;                &lt;extended&gt; &lt;ev4&gt; &lt;ev5&gt; &lt;afh&gt;&lt;br /&gt;                &lt;afh&gt; &lt;3-slot&gt; &lt;5-slot&gt;&lt;br /&gt;                &lt;afh&gt; &lt;afh&gt; &lt;edr&gt;&lt;br /&gt;                &lt;edr&gt; &lt;3-slot&gt; &lt;extended&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 18px; line-height: normal;"&gt;3. 移植過程&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;# bluez-utils : bluez-libs, dbus,&lt;br /&gt;# dbus : libxml2&lt;br /&gt;# sobexsrv : openobex, libiconv&lt;br /&gt;&lt;br /&gt;==============================================================================================================&lt;br /&gt;#bluez-libs-3.24&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;tar zxvf bluez-libs-3.24.tar.gz&lt;br /&gt;cd bluez-libs-3.24&lt;br /&gt;./configure --prefix=/work/msq/test/blue_dir --target=arm-linux CC=arm-linux-gcc --build=i686 --host=arm-linux&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;==============================================================================================================&lt;br /&gt;#libxml2-2.6.31&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;tar zxvf libxml2-2.6.31.tar.gz&lt;br /&gt;cd libxml2-2.6.31&lt;br /&gt;./configure --prefix=/work/msq/test/blue_dir --target=arm-linux CC=arm-linux-gcc --build=i686 --host=arm-linux&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;==============================================================================================================&lt;br /&gt;#dbus-1.0.2&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;tar zxvf dbus-1.0.2.tar.gz&lt;br /&gt;cd dbus-1.0.2&lt;br /&gt;export ac_cv_have_abstract_sockets=yes&lt;br /&gt;export PKG_CONFIG_PATH=/work/msq/test/blue_dir/lib/pkgconfig&lt;br /&gt;./configure --prefix=/work/msq/test/blue_dir --target=arm-linux CC=arm-linux-gcc --build=i686 --host=arm-linux --with-x=no&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;==============================================================================================================&lt;br /&gt;#bluez-utils-3.24&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;tar zxvf bluez-utils-3.24.tar.gz&lt;br /&gt;cd bluez-utils-3.24&lt;br /&gt;export PKG_CONFIG_PATH=/work/msq/test/blue_dir/lib/pkgconfig&lt;br /&gt;./configure --prefix=/work/msq/test/blue_dir --target=arm-linux CC="arm-linux-gcc -I/work/msq/test/blue_dir/include -L/work/msq/test/blue_dir/lib" --build=i686 --host=arm-linux&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;有一些問題&lt;br /&gt;1.&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;arm-linux-gcc -I/work/msq/test/blue_dir/include -I/work/msq/test/blue_dir/include -I/work/msq/test/blue_dir/include -I/usr/local/include -I/work/msq/test/blue_dir/include/dbus-1.0 -I/work/msq/test/blue_dir/lib/dbus-1.0/include -I../eglib -Wall -O2 -D_FORTIFY_SOURCE=2 -o bluetoothd-service-transfer main.o server.o session.o process.o  -L/work/msq/test/blue_dir/lib ../common/libhelper.a ../eglib/.libs/libeglib.a /work/msq/test/blue_dir/lib/libdbus-1.so -L/usr/local/lib /usr/local/lib/libopenobex.so /work/msq/test/blue_dir/lib/libbluetooth.so   -Wl,--rpath -Wl,/work/msq/test/blue_dir/lib -Wl,--rpath -Wl,/work/msq/test/blue_dir/lib&lt;br /&gt;/usr/local/lib/libopenobex.so: could not read symbols: File in wrong format&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;make[2]: *** [bluetoothd-service-transfer] Error 1&lt;br /&gt;make[2]: Leaving directory `/work/msq/test/bluez/bluez-utils-3.24/transfer'&lt;br /&gt;make[1]: *** [all-recursive] Error 1&lt;br /&gt;make[1]: Leaving directory `/work/msq/test/bluez/bluez-utils-3.24'&lt;br /&gt;make: *** [all] Error 2&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;#ANS&lt;br /&gt;cd transfer&lt;br /&gt;#去掉 /usr/local/lib/libopenobex.so&lt;br /&gt;arm-linux-gcc -I/work/msq/test/blue_dir/include -I/work/msq/test/blue_dir/include -I/work/msq/test/blue_dir/include -I/usr/local/include -I/work/msq/test/blue_dir/include/dbus-1.0 -I/work/msq/test/blue_dir/lib/dbus-1.0/include -I../eglib -Wall -O2 -D_FORTIFY_SOURCE=2 -o bluetoothd-service-transfer main.o server.o session.o process.o -L/work/msq/test/blue_dir/lib ../common/libhelper.a ../eglib/.libs/libeglib.a /work/msq/test/blue_dir/lib/libdbus-1.so -L/usr/local/lib /work/msq/test/blue_dir/lib/libbluetooth.so -Wl,--rpath -Wl,/work/msq/test/blue_dir/lib -Wl,--rpath -Wl,/work/msq/test/blue_dir/lib&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;arm-linux-gcc -I/work/msq/test/blue_dir/include -L/work/msq/test/blue_dir/lib -DHAVE_CONFIG_H -I. -I.. -I../common   -I/work/msq/test/blue_dir/include    -Wall -O2 -D_FORTIFY_SOURCE=2 -MT hciattach.o -MD -MP -MF .deps/hciattach.Tpo -c -o hciattach.o hciattach.c&lt;br /&gt;hciattach.c: In function 'uart_speed':&lt;br /&gt;hciattach.c:108: error: 'B230400' undeclared (first use in this function)&lt;br /&gt;hciattach.c:108: error: (Each undeclared identifier is reported only once&lt;br /&gt;hciattach.c:108: error: for each function it appears in.)&lt;br /&gt;hciattach.c:110: error: 'B460800' undeclared (first use in this function)&lt;br /&gt;hciattach.c:112: error: 'B500000' undeclared (first use in this function)&lt;br /&gt;hciattach.c:114: error: 'B576000' undeclared (first use in this function)&lt;br /&gt;hciattach.c:116: error: 'B921600' undeclared (first use in this function)&lt;br /&gt;hciattach.c:118: error: 'B1000000' undeclared (first use in this function)&lt;br /&gt;hciattach.c:120: error: 'B1152000' undeclared (first use in this function)&lt;br /&gt;hciattach.c:122: error: 'B1500000' undeclared (first use in this function)&lt;br /&gt;hciattach.c:124: error: 'B2000000' undeclared (first use in this function)&lt;br /&gt;hciattach.c:126: error: 'B2500000' undeclared (first use in this function)&lt;br /&gt;hciattach.c:128: error: 'B3000000' undeclared (first use in this function)&lt;br /&gt;hciattach.c:130: error: 'B3500000' undeclared (first use in this function)&lt;br /&gt;hciattach.c:132: error: 'B4000000' undeclared (first use in this function)&lt;br /&gt;make[2]: *** [hciattach.o] Error 1&lt;br /&gt;make[2]: Leaving directory `/work/msq/test/bluez/bluez-utils-3.24/tools'&lt;br /&gt;make[1]: *** [all-recursive] Error 1&lt;br /&gt;make[1]: Leaving directory `/work/msq/test/bluez/bluez-utils-3.24'&lt;br /&gt;make: *** [all] Error 2&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;#ANS&lt;br /&gt;cd tools&lt;br /&gt;vi hciattach.c&lt;br /&gt;註解108-132行&lt;br /&gt;&lt;br /&gt;==============================================================================================================&lt;br /&gt;#openobex-1.3&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;tar zxvf openobex-1.3.tar.gz&lt;br /&gt;cd openobex-1.3&lt;br /&gt;./configure --prefix=/work/msq/test/blue_dir --target=arm-linux CC="arm-linux-gcc -I/work/msq/test/blue_dir/include -L/work/msq/test/blue_dir/lib" --build=i686 --host=arm-linux&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;==============================================================================================================&lt;br /&gt;#libiconv-1.12&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;tar zxvf libiconv-1.12.tar.gz&lt;br /&gt;cd libiconv-1.12&lt;br /&gt;./configure --prefix=/work/msq/test/blue_dir --target=arm-linux CC=arm-linux-gcc --build=i686 --host=arm-linux&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;==============================================================================================================&lt;br /&gt;#sobexsrv-1.0.1&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;tar zxvf sobexsrv-1.0.1.tar.gz&lt;br /&gt;cd sobexsrv-1.0.1&lt;br /&gt;make CC="arm-linux-gcc -I/work/msq/test/blue_dir/include -L/work/msq/test/blue_dir/lib -liconv" DESTDIR=/work/msq/test/blue_dir install&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;==============================================================================================================&lt;br /&gt;#bluez-hcidump-1.41&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;tar zxvf bluez-hcidump-1.41.tar.gz&lt;br /&gt;cd bluez-hcidump-1.41&lt;br /&gt;./configure --prefix=/work/msq/test/blue_dir --target=arm-linux CC="arm-linux-gcc -I/work/msq/test/blue_dir/include -L/work/msq/test/blue_dir/lib" --build=i686 --host=arm-linux&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;======in target board========&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;dbus-daemon --system&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;dbus-daemon: can't load library 'libxml2.so.2'&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;cd /lib&lt;br /&gt;cp /work/msq/test/blue_dir/lib/libxml2.so.2.6.31 .&lt;br /&gt;ln -s libxml2.so.2.6.31 libxml2.so.2&lt;br /&gt;ln -s libxml2.so.2.6.31 libxml2.so&lt;br /&gt;&lt;br /&gt;cp /work/msq/test/blue_dir/lib/libbluetooth.so.2.9.4 /lib&lt;br /&gt;ln -s libbluetooth.so.2.9.4 libbluetooth.so.2&lt;br /&gt;ln -s libbluetooth.s&lt;br /&gt;o.2.9.4 libbluetooth.so&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;參考：&lt;br /&gt;1. bluez官網; &lt;a href="http://www.bluez.org/" target="_blank" class="postlink"&gt;http://www.bluez.org/&lt;/a&gt;; 找參考資料,下載原始碼一定都會來的地方&lt;br /&gt;2. Linux Unwired - Chapter 7. Bluetooth, oreilly; By Roger Weeks, Edd Dumbill, Brian Jepson; 簡介Bluetooth觀念, 介&lt;br /&gt;紹BlueZ這個Linux上最流行的Bluetooth protocol stack, 以及一些如何在Linux上安裝BlueZ的步驟&lt;br /&gt;3. bluetooth study; &lt;a href="http://tw.myblog.yahoo.com/lecheel/article?mid=136" target="_blank" class="postlink"&gt;http://tw.myblog.yahoo.com/lecheel/article?mid=136&lt;/a&gt;; By Lecheel; 移植Bluez到ARM Linux板子上的筆&lt;br /&gt;記&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-1505730261344351017?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/1505730261344351017/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=1505730261344351017' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1505730261344351017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1505730261344351017'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2008/04/bluetootharm-embedded-linux.html' title='如何移植Bluetooth到ARM Embedded Linux'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-7549814182008238075</id><published>2008-04-03T08:16:00.002+08:00</published><updated>2008-04-03T08:27:21.464+08:00</updated><title type='text'>如何在ARM Embedded Linux實作automount功能</title><content type='html'>&lt;span class="postbody"&gt;&lt;span style="font-weight: bold;"&gt;目的：&lt;/span&gt;支援automount function&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;關鍵字：&lt;/span&gt;&lt;span style="color: blue;"&gt;hotplug, mdev, automount, Embedded Linux, busybox, ARM&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;一般來說，目前我們桌上電腦當插入USB DISK，系統是使用udev來達成automount&lt;br /&gt;在Embedded Linux中，我們並沒有跑udev這麼大的service，而是使用busybox的mdev&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;原理大概如下&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;Linux Kernel的hotplug -&gt; 收到USB DISK insert/delete event -&gt; 根據/proc/sys/kernel/hotplug指名的程式&lt;br /&gt;-&gt; 呼叫mdev -&gt; mdev在根據/etc/mdev.conf設定檔指定batch file -&gt; 執行相對應的/sbin/automount.sh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;實作部份&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Linux Kernel部份&lt;br /&gt;================&lt;br /&gt;在.config&lt;br /&gt;將hotplug function打開&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;CONFIG_HOTPLUG=y&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;如果proc file system和sysfs file system沒打開的話也要記得打開(應該很少人會這個不開吧)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;CONFIG_PROC_FS=y&lt;br /&gt;CONFIG_SYSFS=y&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;重新編譯kernel&lt;br /&gt;&lt;br /&gt;Busybox部份&lt;br /&gt;===========&lt;br /&gt;很遺憾的Busybox 1.2版的mdev有bug，我是在Busybox 1.9版mdev source code發現已經fix這個bug了&lt;br /&gt;Busybox的make menuconfig&lt;br /&gt;請把mdev打開&lt;br /&gt;P.S.&lt;br /&gt;因為等下還有batch 需要grep 如果busybox沒開的話也要打開&lt;br /&gt;&lt;br /&gt;target board file system部份&lt;br /&gt;============================&lt;br /&gt;vi /etc/inittab&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;ttyRI0::sysinit:/bin/mount -t sysfs sysfs /sys&lt;br /&gt;ttyRI0::sysinit:/sbin/mdev -s&lt;br /&gt;ttyRI0::sysinit:/bin/echo /sbin/mdev &gt; /proc/sys/kernel/hotplug&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;掛載sysfs, 執行mdev, 並將mdev設為當系統收到hotplug event會去呼叫的程式&lt;br /&gt;&lt;br /&gt;當然file system裡面要有/sys&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;mkdir /sys&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;vi /etc/mdev.conf&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;sda1 0:0 0660 @mount /dev/sda1 /mnt&lt;br /&gt;sd.* 0:0 0660 @/sbin/automount.sh $MDEV&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;br /&gt;vi /sbin/automount.sh&lt;br /&gt;&lt;/span&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;span class="genmed"&gt;&lt;b&gt;代碼:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;   &lt;td class="code"&gt;#! /bin/sh&lt;br /&gt;if [ "$1" == "" ]; then&lt;br /&gt;        echo "parameter is none" &gt; /tmp/error.txt&lt;br /&gt;        exit 1&lt;br /&gt;fi&lt;br /&gt;mounted=`mount | grep $1 | wc -l`&lt;br /&gt;&lt;br /&gt;# mounted, assume we umount&lt;br /&gt;if [ $mounted -ge 1 ]; then&lt;br /&gt;    echo "R/media/$1" &gt;&gt; /tmp/usbmnt.log&lt;br /&gt;    echo "R/media/$1" &gt; /tmp/fifo.1&lt;br /&gt;        if ! umount "/media/$1"; then&lt;br /&gt;                exit 1&lt;br /&gt;        fi&lt;br /&gt;&lt;br /&gt;        if ! rmdir "/media/$1"; then&lt;br /&gt;                exit 1&lt;br /&gt;        fi&lt;br /&gt;# not mounted, lets mount under /media&lt;br /&gt;else&lt;br /&gt;        if ! mkdir -p "/media/$1"; then&lt;br /&gt;                exit 1&lt;br /&gt;        fi&lt;br /&gt;&lt;br /&gt;        if ! mount "/dev/$1" "/media/$1"; then&lt;br /&gt;                # failed to mount, clean up mountpoint&lt;br /&gt;                if ! rmdir "/media/$1"; then&lt;br /&gt;                        exit 1&lt;br /&gt;                fi&lt;br /&gt;                exit 1&lt;br /&gt;        fi&lt;br /&gt;    echo "A/media/$1" &gt;&gt; /tmp/usbmnt.log&lt;br /&gt;    echo "A/media/$1" &gt; /tmp/fifo.1&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;exit 0&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;span class="gensmall"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-7549814182008238075?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/7549814182008238075/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=7549814182008238075' title='6 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/7549814182008238075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/7549814182008238075'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2008/04/arm-embedded-linuxautomount.html' title='如何在ARM Embedded Linux實作automount功能'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-4822908848237267431</id><published>2008-01-22T19:05:00.000+08:00</published><updated>2008-01-22T19:13:20.133+08:00</updated><title type='text'>當只有jffs2的image要如何mount起來看看內容呢?</title><content type='html'>做出jffs2的image後，當發生問題想mount起來看看怎麼辦?&lt;br /&gt;1. 尤其是少掉init這種東西 Linux連開都開不起來的kernel panic&lt;br /&gt;2. 尤其是這個jffs2的image是廠商toolchain一連串make後的結果&lt;br /&gt;&lt;br /&gt;同事推薦一個好方法&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:Verdana;"&gt;#在pc上製作jffs2 image及mount jffs2在loop back上&lt;/span&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Verdana;"&gt;1.製作jffs2  image&lt;br /&gt;請確認有mkfs.jffs2指令或事先安裝mtd-tools套件&lt;br /&gt;假設 /jffs2 目錄製作成 jffs2.img  如下&lt;br /&gt;#mkfs.jffs2 -d /jffs2 -o /jffs2.img -l iVU&lt;br /&gt;&lt;br /&gt;P.S&lt;br /&gt;apt-get install mtd-tools&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:Verdana;"&gt;2.mount jffs2.img在loopback上&lt;br /&gt;請載入以下modules&lt;br /&gt;modprobe  mtdcore   //這各好像可以不用&lt;br /&gt;modprobe jffs2&lt;br /&gt;modprobe mtdram&lt;br /&gt;modprobe mtdchar&lt;br /&gt;modprobe  mtdblock&lt;br /&gt;確認以上modules會產生/dev/mtd0 及/mtd/mtdblock0檔案&lt;br /&gt;dd if=/jffs2.img  of=/dev/mtd0&lt;br /&gt;mount /dev/mtdblock0 /mnt&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-4822908848237267431?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/4822908848237267431/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=4822908848237267431' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/4822908848237267431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/4822908848237267431'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2008/01/jffs2imagemount.html' title='當只有jffs2的image要如何mount起來看看內容呢?'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-1252021576229467317</id><published>2007-12-24T10:14:00.000+08:00</published><updated>2007-12-24T10:20:34.272+08:00</updated><title type='text'>如何找出Linux Kernel中的parameter</title><content type='html'>&lt;h3 class="entry-header"&gt;如何找出Linux Kernel中的parameter?&lt;/h3&gt;請參考Martin's blog的這篇 http://martin-yang.blogspot.com/2005_12_01_archive.html&lt;br /&gt;&lt;br /&gt;find . -name \*.[Sch] -exec grep -nH -a1B1 "__setup(" {} \;&lt;br /&gt;&lt;br /&gt;or __earily_param&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-1252021576229467317?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/1252021576229467317/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=1252021576229467317' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1252021576229467317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1252021576229467317'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/12/linux-kernelparameter.html' title='如何找出Linux Kernel中的parameter'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-5351944825457889898</id><published>2007-11-20T15:49:00.000+08:00</published><updated>2007-11-20T15:52:28.794+08:00</updated><title type='text'>ubuntu編譯大程式缺的一些東東</title><content type='html'>dpkg -l | grep gcc&lt;br /&gt;apt-get build-dep gcc-4.1&lt;br /&gt;apt-get build-dep binutils&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-5351944825457889898?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/5351944825457889898/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=5351944825457889898' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/5351944825457889898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/5351944825457889898'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/11/ubuntu.html' title='ubuntu編譯大程式缺的一些東東'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-3813049427282326538</id><published>2007-10-30T14:53:00.000+08:00</published><updated>2007-10-30T18:07:36.785+08:00</updated><title type='text'>ARM GCC inline assembler</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;span style="color: rgb(102, 0, 204);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;緣起：&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;有關在ARM的平台上開發embedded system，在trace UBoot或是Linux Kernel，在C的程式碼中總是會嵌入一些assembly code，舉例如下&lt;br /&gt;&lt;br /&gt;&lt;textarea name="code" class="c"&gt;&lt;br /&gt;__asm__ __volatile__("": : :"memory");&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;廣布UBoot source中，也不知道這是幹嗎的&lt;br /&gt;&lt;br /&gt;&lt;textarea name="code" class="c"&gt;&lt;br /&gt;__asm__ __volatile__("nop;nop;nop;nop;nop;nop;nop");&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;隨便再去找個例子，不過這段code就很好猜，基本上就是delay幾個machine cycle&lt;br /&gt;&lt;br /&gt;&lt;textarea name="code" class="c"&gt;&lt;br /&gt;static inline void __raw_spin_lock(raw_spinlock_t *lock)&lt;br /&gt;{&lt;br /&gt;        unsigned long tmp;&lt;br /&gt;&lt;br /&gt;        __asm__ __volatile__(&lt;br /&gt;"1:     ldrex   %0, [%1]\n"&lt;br /&gt;"       teq     %0, #0\n"&lt;br /&gt;#ifdef CONFIG_CPU_32v6K&lt;br /&gt;"       wfene\n"&lt;br /&gt;#endif&lt;br /&gt;"       strexeq %0, %2, [%1]\n"&lt;br /&gt;"       teqeq   %0, #0\n"&lt;br /&gt;"       bne     1b"&lt;br /&gt;        : "=&amp;amp;r" (tmp)&lt;br /&gt;        : "r" (&amp;amp;lock-&gt;lock), "r" (1)&lt;br /&gt;        : "cc");&lt;br /&gt;&lt;br /&gt;        smp_mb();&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;include/asm-arm/spinlock.h&lt;br /&gt;這是Linux Kernel 中 spinlock的程式碼&lt;br /&gt;&lt;br /&gt;原本想偷懶，就大概看看猜猜意思就好，但是發現了還真怪，跟標準ARM的assembly language有一些差距，舉例如下%0, %1, %2到底是啥register，ARM不就是R1~R15 PC這些嗎？還有第一個例子，還真的很不懂他的意義&lt;br /&gt;&lt;br /&gt;後來根據上課的講義中的參考網站&lt;br /&gt;&lt;a href="http://www.ethernut.de/en/documents/arm-inline-asm.html"&gt;ARM GCC Inline Assembler Cookbook&lt;/a&gt;&lt;br /&gt;這真是好網站啊....&lt;br /&gt;以下為那篇的簡單心得&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;心得：&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1. 為什麼要在GNU C compiler提供內嵌式assembly code？&lt;/span&gt;&lt;br /&gt;ANS:因為可以自行最佳化critical部份的code，有些想做的事很難用C語言來寫，用assembly language卻事半功倍(例如delay幾個machine cycle)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;2. GCC ASM statement&lt;/span&gt;&lt;br /&gt;分成4部分&lt;br /&gt;1. The assembler instruction&lt;br /&gt;2. output operands&lt;br /&gt;3. input operands&lt;br /&gt;4. Clobbered(打倒毀壞..) register  ....(P.S. 描述哪些register或是記憶體被assembly code破壞掉了 請compiler要特別處理後面的code)&lt;br /&gt;&lt;br /&gt;拿幾個例子&lt;br /&gt;&lt;textarea name="code" class="c"&gt;&lt;br /&gt;asm("mov %0, %1, ror #1" : "=r" (result) : "r" (value));&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;四個部份用冒號(:)來區分&lt;br /&gt;"mov %0, %1, ror #1"是assembly instruction部份&lt;br /&gt;"=r" (result) 是output operands&lt;br /&gt;"r" (value)是input operands&lt;br /&gt;此範例沒有clobber list所以就直接省略掉&lt;br /&gt;&lt;br /&gt;這範例的意思&lt;br /&gt;將value 向右rotate 1 bit然後存到 result&lt;br /&gt;&lt;br /&gt;GNU C compiler處理後可能會編成&lt;br /&gt;&lt;textarea name="code" class="c"&gt;&lt;br /&gt;ldr   r3, [sp, #0]&lt;br /&gt;mov   r3, r3, ror #1&lt;br /&gt;str   r3, [sp, #4]&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;3. 甚麼是%0, %1, %2 ....？有甚麼好處？&lt;/span&gt;&lt;br /&gt;ANS:從output operands 到 input operands一路編號從%0, %1 .... %n&lt;br /&gt;剛剛的範例GNU C compiler可以自由的拿r3來使用，他會根據compile到這行取用compiler覺得最好的register，因為我們並不在意到底是r1還是r2 or r3，就讓compiler做吧&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4. volatile關鍵字？&lt;/span&gt;&lt;br /&gt;&lt;textarea name="code" class="c"&gt;&lt;br /&gt;asm volatile("mov %0, %1, ror #1" : "=r" (result) : "r" (value));&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;告訴compiler別optimize這段程式，不然可能會跟據最佳化法則直接不編譯&lt;br /&gt;&lt;br /&gt;這樣一來這些例子就都看得懂囉&lt;br /&gt;&lt;textarea name="code" class="c"&gt;&lt;br /&gt;asm volatile("mov r0, r0");&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;tiny delay&lt;br /&gt;&lt;br /&gt;&lt;textarea name="code" class="c"&gt;&lt;br /&gt;asm volatile("":::"memory");&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;只有第四部份 clobber part說明memory可能被更動了，之後compiler要視為memory有更動，任何需要載入register處理都要真的做ldr的動作，不能直接拿暫存的register來用(如果之前已經在register中了)&lt;br /&gt;這很適合用到memory mapping I/O才會真正把一些Hardware狀態取出&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;5. Input/Output Operands的修飾子&lt;/span&gt;&lt;br /&gt;r是代表general register&lt;br /&gt;"r", "=r", "=&amp;amp;r" 在r前面不加東西或是加= or &amp;amp;&lt;br /&gt;不加代表此register是read-only&lt;br /&gt;=為write-only&lt;br /&gt;&amp;amp;代表Register shoud be used for output only&lt;br /&gt;&lt;br /&gt;所以很簡單的在output operads 都會有"=" 如果只有output only就可以在多加"&amp;amp;"&lt;br /&gt;input operand的都不用加&lt;br /&gt;&lt;br /&gt;至於既是input又是output則有特別作法&lt;br /&gt;舉個範例&lt;br /&gt;asm volatile("mov %0, %0, ror #1" : "=r" (value) : "0" (value));&lt;br /&gt;就用"0"來代表&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6. Clobber list&lt;/span&gt;&lt;br /&gt;剛剛已經看過一個範例了(有關在控制Hardware memory mapping IO)&lt;br /&gt;另外&lt;br /&gt;asm ("":::"cc", "r3");&lt;br /&gt;則是說明我們在asembly language已經破壞r3，請compiler在進來前跟出去後要自己保證r3的正確性&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;7.__asm__,  __volatile__?&lt;/span&gt;&lt;br /&gt;為什麼會用__asm__取代asm，用__volatile__取代volatile&lt;br /&gt;這些有底線的都是因為我們通常會define成macro，但如果直接用asm or volatile會在strict ANSI compile下會出現warning所以使用加底線的版本，但其實是一樣的&lt;br /&gt;(這部份其實我並不是很了解啊)WHY&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-3813049427282326538?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/3813049427282326538/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=3813049427282326538' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/3813049427282326538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/3813049427282326538'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/10/arm-gcc-inline-assembler.html' title='ARM GCC inline assembler'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-6543642821497270967</id><published>2007-09-13T00:26:00.000+08:00</published><updated>2007-10-02T23:35:00.590+08:00</updated><title type='text'>ING路跑挑戰</title><content type='html'>安伯Q說要不要一起去跑ING路跑，想說那參加9KM的好了，因為當兵的時候跑3000公尺都快喘的半死，工作三年又變胖5公斤(73-&gt;78)，又半年沒運動了，但被激說9KM是給小朋友跑的，後來就很豪氣的說要跑22KM。&lt;br /&gt;&lt;br /&gt;反正～只能豁出去了～雖然覺得～這真的是不可能的任務&lt;br /&gt;&lt;br /&gt;以下是所有練習的紀錄&lt;br /&gt;&lt;br /&gt;DAY 1：2007-09-12(三)&lt;br /&gt;快步走5.6公里，約56分鐘&lt;br /&gt;&lt;br /&gt;DAY2：2007-09-13(四)&lt;br /&gt;快步走7公里，約66分鐘&lt;br /&gt;&lt;br /&gt;DAY3：2007-10-02(二)&lt;br /&gt;對～不用懷疑 中間都沒有練習&lt;br /&gt;雖然中間有去馬來西亞的沙巴五日遊:P&lt;br /&gt;今天練習開始跑步(不然好像有點來不及)&lt;br /&gt;慢慢跑20分鐘，約2.8公里&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-6543642821497270967?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/6543642821497270967/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=6543642821497270967' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/6543642821497270967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/6543642821497270967'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/09/ing.html' title='ING路跑挑戰'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-3817806675414343874</id><published>2007-08-28T19:29:00.000+08:00</published><updated>2007-08-28T21:03:28.697+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux SPI Driver'/><title type='text'>Linux SPI driver Part 1</title><content type='html'>[目的]：&lt;br /&gt;如何在Linux下，使用Kernel support的SPI driver&lt;br /&gt;&lt;br /&gt;[註記]：&lt;br /&gt;紀錄Porting SPI driver從開始到結束，因為目前還未成功，就先紀錄一下，等到完成時在修補不對的地方&lt;br /&gt;&lt;br /&gt;[環境]：&lt;br /&gt;硬體：使用SOC上的四根GPIO(不需要特定的SPI hardware)&lt;br /&gt;軟體：最終是要porting在Linux 2.6.18.x，但2.6.22.x才開始有spidev(SPI device讓user problem 可使用open() read() write() ioctl() close() API有限制性的half-duplex去存取SPI device) 所以過程中需要把一些2.6.22.x跟spidev相關的程式也搬到2.6.18.x下&lt;br /&gt;&lt;br /&gt;[第一部：Study]：&lt;br /&gt;&lt;br /&gt;1. ~/Documentation/spi/spi-summary&lt;br /&gt;&lt;br /&gt;- 如果沒有特定SPI controller存在，GPIO可以用來建立一個low speed "bitbanging" adapter&lt;br /&gt;&lt;br /&gt;- &lt;linux spi="" h=""&gt;包含了kerneldoc和一些source code請務必要看&lt;br /&gt;&lt;br /&gt;- &lt;span style="color: rgb(102, 0, 204);"&gt;SPI request是I/O quenes的方式FIFO的順序依序執行，基本上使用asynchronously機制，等執行完畢呼叫相對應的callback function，但也有簡單的wrapper將它包裝成synchronously&lt;/span&gt;，例如最常見包裝成"wirte a command and read its response"&lt;br /&gt;&lt;br /&gt;-有兩類別的SPI driver&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;Controller drivers&lt;/span&gt;：會直接接觸到Hardware，本篇會使用的為四根一般用的GPIO，也就是bitbang方式&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;Protocol drivers&lt;/span&gt;：pass messages，透過Controller driver去做SPI的動作&lt;br /&gt;&lt;br /&gt;-&lt;span style="color: rgb(102, 0, 204);"&gt;struct spi_device&lt;/span&gt;：在Controller driver &amp; Protocol driver二者之間的master-side interface&lt;br /&gt;&lt;br /&gt;-架構中會有幾個node&lt;br /&gt;/sys/class/spi_master/spiB：&lt;span style="color: rgb(102, 0, 204);"&gt;class device&lt;/span&gt; for controller managing bus "B"，因為在bus B上可以共用SCLK, MOSI, MISO (除了每顆slave需要自己的CS)&lt;br /&gt;/sys/bus/spi/devices/spiB.C：symlink, spi_device for on bus "B" &amp; chipselect "C"&lt;br /&gt;/sys/bus/spi/drivers/&lt;span style="color: rgb(102, 0, 204);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;D：&lt;/span&gt;driver&lt;/span&gt; for one or more spi*.* devices&lt;br /&gt;&lt;br /&gt;-How does board-specific init code declare SPI devices?&lt;br /&gt;&lt;br /&gt;DECLARE CONTROLLERS&lt;br /&gt;首先要宣告SPI controllers exist，在SOC based board下通常為platform devices，然後需要一些platform_data來讓他操作正常，這邊就是要宣告有個GPIO方式&lt;br /&gt;最後會呼叫到這個register_platform_device()&lt;br /&gt;&lt;br /&gt;DECLARE SLAVE DEVICES&lt;br /&gt;列出存在在版子上的SPI slave devices&lt;br /&gt;static struct spi_board_info spi_board_info[] __initdata = {&lt;br /&gt;   {&lt;br /&gt;       .modalias        = "CHIP",&lt;br /&gt;       .platform_data    = &amp;CHIP_info,&lt;br /&gt;       .mode                = SPI_MODE_3,&lt;br /&gt;   },&lt;br /&gt;};&lt;br /&gt;最後會呼叫到這個spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info))&lt;br /&gt;&lt;br /&gt;-How do I write an "SPI Protocol Driver"&lt;br /&gt;static struct spi_driver CHIP_driver = {&lt;br /&gt;   .driver = {&lt;br /&gt;       .name    =        "CHIP",&lt;br /&gt;       .bus        =       &amp;spi_bus_type,&lt;br /&gt;       .owner   =        THIS_MODULE,&lt;br /&gt;   },&lt;br /&gt;   .probe                = CHIP_probe&lt;br /&gt;   .remove            = __devexit_p(CHIP_remove),&lt;br /&gt;   .suspend            = CHIP_suspend,&lt;br /&gt;   .resume            = CHIP_resume,&lt;br /&gt;};&lt;br /&gt;這driver core會自動試著去bind this driver到任何device 當board_info中modalias為"CHIP"&lt;br /&gt;&lt;br /&gt;static int __devinit CHIP_probe(struct spi_device *spi) {&lt;br /&gt;   struct CHIP                                    *chip;&lt;br /&gt;   sturct CHIP_platform_data            *pdata;&lt;br /&gt;   pdata = &amp;spi-&gt;dev.platform_data;&lt;br /&gt;   chip = kzalloc(sizeof *chip, GFP_KERNEL);&lt;br /&gt;   dev_set_drvdata(&amp;spi-&gt;dev, chip);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;本篇會用到wrapper, spi_write_then_read() function, spi_w8r16()&lt;br /&gt;&lt;br /&gt;-spi_device的下為driver，上為sysfs/input layer/ALSA/networking/MTD/character device or other Linux subsystems&lt;br /&gt;&lt;br /&gt;-兩種memory使用方式&lt;br /&gt;I/O buffer使用一般Linux rules, allocate them from heap or free page pool(類似local var)&lt;br /&gt;spi_transfer static, 需要zero-init (類似global var.)&lt;br /&gt;&lt;br /&gt;-How do I write an "SPI Master Controller Driver"&lt;br /&gt;一個SPI controller會被registered到platform_bus，寫一個driver去bind這個device&lt;br /&gt;&lt;br /&gt;spi_master使用spi_alloc_master()去allocate一個spi master&lt;br /&gt;然後使用class_get_devdata()去拿到driver-private data allocated for that device&lt;br /&gt;&lt;br /&gt;struct spi_master        *master;&lt;br /&gt;sturct CONTROLLER    *c;&lt;br /&gt;master = spi_alloc_master(dev, sizeof *c);&lt;br /&gt;if( !master)&lt;br /&gt;   return -ENODEV;&lt;br /&gt;c = class_get_devdata(&amp;master-&gt;cdev);&lt;br /&gt;&lt;br /&gt;此driver會init spi_master的欄位 包括bus number通常等於platform device ID以及跟SPI core和SPI protocol driver互動的方法&lt;br /&gt;完成init, spi_register_master去放到system上&lt;/linux&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-3817806675414343874?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/3817806675414343874/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=3817806675414343874' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/3817806675414343874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/3817806675414343874'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/08/linux-spi-driver-part-1.html' title='Linux SPI driver Part 1'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-4556707742334988259</id><published>2007-08-14T00:28:00.000+08:00</published><updated>2007-08-28T20:57:54.693+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EMT 過度換氣'/><title type='text'>過度換氣症候群</title><content type='html'>&lt;span style="font-family: arial;font-size:100%;" &gt;「過度換氣症候群」一般是指病因不明所導致的過度換氣現象&lt;br /&gt;過度換氣會導致血中二氧化碳降低，酸鹼值因而升高，醫學上稱為「呼吸性鹼中毒」，並引起全身性的反應與症狀，其中較常見的包括血管收縮及血鈣降低&lt;br /&gt;&lt;br /&gt;「慢性過度換氣症」的診斷必須排除生理性的疾病，因此肺功能、心電圖、胸部X光及抽血等基本檢查是必要的，以免延誤病人潛在的疾病。確定診斷可以動脈血液氣體分析，查驗出病人確實有二氧化碳過低的現象。&lt;br /&gt;所以要詳問病史 ：心臟疾病(心肌梗塞 心絞痛) 肺臟疾病(氣喘 肺氣腫 肺栓塞)&lt;br /&gt;用藥史：剛剛有吃甚麼藥 (藥物中毒...)&lt;br /&gt;剛剛發生什麼事：吵架 緊張 考試 比賽 密閉空間 壓力&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: arial;font-size:100%;" &gt;治療首先要讓病人瞭解症狀發生的機轉，讓病人練習腹式呼吸，並做一些放鬆及減低壓力的治療&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: arial;font-size:100%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;請參考消防署的這篇&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-size:100%;" &gt;有驚無險的喘息&lt;/span&gt;&lt;span lang="EN-US"  style="font-size:100%;"&gt;-&lt;/span&gt;&lt;span style=";font-size:100%;" &gt;「過度換氣症候群」&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;http://enews.nfa.gov.tw/issue/931223/images/health.htm&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-4556707742334988259?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/4556707742334988259/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=4556707742334988259' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/4556707742334988259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/4556707742334988259'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/08/blog-post.html' title='過度換氣症候群'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-1289446286491039519</id><published>2007-08-10T18:06:00.000+08:00</published><updated>2007-08-10T18:14:04.496+08:00</updated><title type='text'>如何在compiler程式時檢查GCC版本?利用gcc的preprocessor</title><content type='html'>有些程式想要保證要被某版本以上gcc才能被編譯&lt;br /&gt;寫在程式中 不是寫在configure檔&lt;br /&gt;&lt;br /&gt;利用gcc前置處理器preprocessor&lt;br /&gt;看參數 __GNUC__ , __GNUC_MINOR__ , GNU_PATCHLEVEL__&lt;br /&gt;&lt;br /&gt;範例如下&lt;br /&gt;hello.c&lt;br /&gt;================================================&lt;br /&gt;#include&lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;&lt;br /&gt;        // Check GCC version (&gt;=2.9.x)&lt;br /&gt;#if ( __GNUC__ &gt;= 3 ) \&lt;br /&gt;        || ( __GNUC__ &gt;= 2 &amp;&amp;amp; __GNUC_MINOR__ &gt;= 9 )&lt;br /&gt;#warning "Your GCC is good( need &gt;=2.9.x )"&lt;br /&gt;#else&lt;br /&gt;#error "Your GCC Version is wrong( need &gt;=2.9 )"&lt;br /&gt;#endif&lt;br /&gt;       &lt;br /&gt;        //show GCC version&lt;br /&gt;        printf("You are using GCC:%d.%d.%d\n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);&lt;br /&gt;&lt;br /&gt;        return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;================================================&lt;br /&gt;&lt;br /&gt;gcc -o hello hello.c&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-1289446286491039519?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/1289446286491039519/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=1289446286491039519' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1289446286491039519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1289446286491039519'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/08/compilergccgccpreprocessor.html' title='如何在compiler程式時檢查GCC版本?利用gcc的preprocessor'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-1380138710041460518</id><published>2007-08-01T11:12:00.000+08:00</published><updated>2007-08-01T19:59:48.455+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ARM Architecture'/><title type='text'>ARM Programming model</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;Programming Model&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Outline&lt;br /&gt;1. Data operand size(word, halfword, byte...)&lt;br /&gt;2. Endianness(little, big)&lt;br /&gt;3. Processor mode(supervisor, user, FIQ, IRQ, abort, undefined, system)&lt;br /&gt;4. Register(在不同的Processor的mode下 擁有不同bank的register set)&lt;br /&gt;5. Program status register&lt;br /&gt;6. &lt;span style="color: rgb(255, 0, 0);"&gt;Exceptions&lt;/span&gt;&lt;br /&gt;7. ARM Instruction Set(Conditional execution...)&lt;br /&gt;&lt;br /&gt;===================================================&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204); font-weight: bold;"&gt;1. Data operand size&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Word: 32bits&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;nature operand size &lt;/span&gt;in a machine, ARM為32bit的處理器&lt;br /&gt;&lt;span dragover="true" style="color: rgb(102, 0, 204);"&gt;(Hint: 因為每個處理器的nature size都不一定 所以使&lt;/span&gt;&lt;span dragover="true" style="color: rgb(102, 0, 204);"&gt;用typedef, 增加未來的移植性)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Halfword: 16bits&lt;br /&gt;Byte: 8 bits&lt;br /&gt;&lt;br /&gt;Load/Store指令可以使用byte, halfword, word 三種size&lt;br /&gt;在Load時候可以使用zero-extending or sign-extending(P.S. store指令沒有必要extending)&lt;br /&gt;&lt;br /&gt;===================================================&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;2. Endianness&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ARM support little/big endian&lt;br /&gt;&lt;br /&gt;Why這麼麻煩兩種都support?&lt;br /&gt;IBM使用Big Endian且當初網路封包的spec很多是IBM制訂&lt;br /&gt;Intel使用little Endian&lt;br /&gt;所以此顆ARM最後是要用來當網通設備，選擇Big Endian在先天就會贏別人&lt;br /&gt;但一般應用可以使用little endian(跟intel同樣架構的程式就會比較好porting過來)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;little endian&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iFJRq_TrVbo/RrAeouInSsI/AAAAAAAAAAU/KPQRdr4bAII/s1600-h/little+endian.jpg"&gt;&lt;img dragover="true" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_iFJRq_TrVbo/RrAeouInSsI/AAAAAAAAAAU/KPQRdr4bAII/s320/little+endian.jpg" alt="" id="BLOGGER_PHOTO_ID_5093604863483792066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;big endian&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iFJRq_TrVbo/RrAfMOInStI/AAAAAAAAAAc/nei5-3n-1vo/s1600-h/big+endian.jpg"&gt;&lt;img dragover="true" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_iFJRq_TrVbo/RrAfMOInStI/AAAAAAAAAAc/nei5-3n-1vo/s320/big+endian.jpg" alt="" id="BLOGGER_PHOTO_ID_5093605473369148114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;ARM指令中並沒有直接可以選擇Endianness&lt;br /&gt;===================================================&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;3. Processor mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;分成User, FIQ, IRQ, Supervisor, Abort, Undefined, System七種&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;User:&lt;br /&gt;Normal program execute mode&lt;br /&gt;&lt;br /&gt;FIQ:&lt;br /&gt;Support a High-speed data transfer or channel process&lt;br /&gt;快速的原因 更多個 banked register(R8~R12)可以直接使用.....&lt;br /&gt;&lt;br /&gt;IRQ:&lt;br /&gt;Use for general-purpose interrupt handling&lt;br /&gt;&lt;br /&gt;Supervisor:&lt;br /&gt;A protected mode for the OS&lt;br /&gt;&lt;br /&gt;Abort:&lt;br /&gt;data abort or prefetch abort後會進來, implement virtual memory and memory protection&lt;br /&gt;&lt;br /&gt;Undefined:&lt;br /&gt;Support software emulation of hardware coprocessors&lt;br /&gt;例如沒有support VFD的CPU可以把軟體emulate寫在這邊來處理 或是 外部接一個coprocess指令&lt;br /&gt;&lt;br /&gt;System:&lt;br /&gt;可以執行privileged指令&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;Why要分這麼多種？&lt;/span&gt;&lt;br /&gt;1. Support modern OS(User Space V.S. Kernel Space)&lt;br /&gt;2. Control privileged instruction(Coprocessor instruction, memory access, MMU/Cache control, I/O control)&lt;br /&gt;3. 指出目前CPU在特定的狀態下(Interrupt發生, unknown instruction, memory access abort...)&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;Reset時default mode?&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Supervisor mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;How to change mode&lt;/span&gt;&lt;br /&gt;software control&lt;br /&gt;external interrupt or exception(FIQ, IRQ, Supervisor, Abort, Undefined)&lt;br /&gt;&lt;br /&gt;P.S.&lt;br /&gt;除了user mode其他都是privileged mode(就是所有recource都可以使用)&lt;br /&gt;&lt;br /&gt;===================================================&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204); font-weight: bold;"&gt;4. Register&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iFJRq_TrVbo/RrBOoOInSuI/AAAAAAAAAAk/AWq_8DbZA4k/s1600-h/ARM+Register.jpg"&gt;&lt;img dragover="true" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_iFJRq_TrVbo/RrBOoOInSuI/AAAAAAAAAAk/AWq_8DbZA4k/s400/ARM+Register.jpg" alt="" id="BLOGGER_PHOTO_ID_5093657631451990754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;1. system mode跟user mode 用的register bank其實是一樣的, 只是system mode是privileged Mode&lt;br /&gt;2. 其他mode R13,R14 &amp; SPSR都是各個mode都有自己一組(不同bank register)&lt;br /&gt;3. FIQ和多了R8~R12是進入FIQ mode自己特有的&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;===================================================&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;5. Program status register&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;NZCV Q J IF T mode&lt;br /&gt;&lt;br /&gt;N: Negative&lt;br /&gt;Z: Zero&lt;br /&gt;C: Carried out&lt;br /&gt;V: Overflow&lt;br /&gt;&lt;br /&gt;Q: Sticky Overflow flag ????&lt;br /&gt;&lt;br /&gt;J: Processor in Jazelle state&lt;br /&gt;&lt;br /&gt;I: Disable IRQ&lt;br /&gt;F: Disable FIQ&lt;br /&gt;&lt;br /&gt;T: 0-&gt;ARM mode 1-&gt;Thumb mode&lt;br /&gt;&lt;br /&gt;mode:&lt;br /&gt;USER, FIQ, IRQ, SVC, ABORT, UNDEF, SYSTEM&lt;br /&gt;&lt;br /&gt;===================================================&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;6.&lt;/span&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;Exceptions&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;內部的trap (system call,SWI) 或是外部的Interrupt都算是exception&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;基本發生exeception會發生以下事情(這些事情以軟體的角度上是atomic)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1. R14&lt;exception_mode&gt; = return link //save return address&lt;/exception_mode&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;2. SPSR&lt;exception_mode&gt; = CPSR //save CPSR&lt;/exception_mode&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;3. CPSR[4:0] = exception mode number&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4. CPSR[5] = 0 //set ARM state&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;5. if&lt;exception_mode&gt; == reset or FIQ then CPSR[6] =1 //當reset or FIQ才會把FIQ disable&lt;/exception_mode&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6. CPSR[7] = 1 //disable IRQ&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;7. PC = exception vector address //branch to vector address&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;所以一般Enter/Exit軟體要做的是&lt;/span&gt;&lt;br /&gt;Enter:&lt;br /&gt;先把R14給存起來(調整真正回去位置, 也許這個指令要重新執行-4 or -8)&lt;br /&gt;save 一些會用的register&lt;br /&gt;ex:&lt;br /&gt;SUB R14, R14, #4&lt;br /&gt;STMFD SP!, {R1-R4, R12, R14}&lt;br /&gt;&lt;br /&gt;Exit:&lt;br /&gt;把這些pop到相對應的位置&lt;br /&gt;ex:&lt;br /&gt;LDMFD SP!, {R1-R4, R12, PC}^&lt;br /&gt;^: the SPSR is copied into the CPSR. This is for returning from exception handles.&lt;br /&gt;這個只能用到返回exception handler&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;(1)Reset (Priority: 1 Highest)&lt;/span&gt;&lt;br /&gt;進入supervisor mode&lt;br /&gt;&lt;br /&gt;Enter:&lt;br /&gt;R14_svc = unpredictable value(反正reset後並沒有要返回哪個位置, 因為他就是reset啊)&lt;br /&gt;SPSR_svc = unpredictable value(反正也不會在利用之前的PSR值)&lt;br /&gt;CPSR[4:0] = 0b10011 //Supervisor mode&lt;br /&gt;CPSR[5] = 0 //set ARM state&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;CPSR[6] = 1 //Disable fast interrupt&lt;/span&gt;&lt;br /&gt;CPSR[7] = 1 //Disable IRQ&lt;br /&gt;PC = 0x00000000 or 0xFFFF0000&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;(2)Data Abort (Priority: 2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;為什麼Priority這麼高? 因為不快點處理Data Abort所有的pipeline都會卡住&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enter:&lt;br /&gt;R14_abt = address of the abort instruction &lt;span style="color: rgb(255, 0, 0);"&gt;+ 8&lt;/span&gt; //當初ARM設計為三層pipeline, 而發生data abort是在第三state所以PC值已經前進+8&lt;br /&gt;SPSR_abt = CPSR&lt;br /&gt;CPSR[4:0] = 0b10111 //Abort mode&lt;br /&gt;CPSR[5] = 0 //set ARM state&lt;br /&gt;CPSR[7] = 1 //Disable IRQ&lt;br /&gt;PC = 0x00000010 or 0xFFFF0010&lt;br /&gt;Exit:&lt;br /&gt;SUBS PC, R14, #8&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;(3)FIQ (Priority: 3)&lt;/span&gt;&lt;br /&gt;Enter:&lt;br /&gt;R14_fiq = address of the next instruction to be executed &lt;span style="color: rgb(255, 0, 0);"&gt;+ 4&lt;/span&gt;&lt;br /&gt;SPSR_fiq = CPSR&lt;br /&gt;CPSR[4:0] = 0b10000 //FIQ mode&lt;br /&gt;CPSR[5] = 0 //set ARM state&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;CPSR[6] = 1 //Disable fast interrupt&lt;/span&gt;&lt;br /&gt;CPSR[7] = 1 //Disable IRQ&lt;br /&gt;PC = 0x0000001C or 0xFFFF001C&lt;br /&gt;Exit:&lt;br /&gt;SUBS PC,R14,#4&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;(4)IRQ (Priority: 4)&lt;/span&gt;&lt;br /&gt;Enter:&lt;br /&gt;R14_irq = address of the next instruction to be executed &lt;span style="color: rgb(255, 0, 0);"&gt;+ 4&lt;/span&gt;&lt;br /&gt;SPSR_irq = CPSR&lt;br /&gt;CPSR[4:0] = 0b10010 //IRQ mode&lt;br /&gt; CPSR[5] = 0 //set ARM state&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;br /&gt; CPSR[7] = 1 //Disable IRQ&lt;br /&gt; PC = 0x00000018 or 0xFFFF0018&lt;br /&gt;Exit:&lt;br /&gt;SUBS PC,R14,#4&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;(5)Prefetch Abort (Priority: 5)&lt;/span&gt;&lt;br /&gt;Enter:&lt;br /&gt;R14_abt = address of the abort instruction &lt;span style="color: rgb(255, 0, 0);"&gt;+ 4&lt;/span&gt;&lt;br /&gt;SPSR_abt = CPSR&lt;br /&gt;CPSR[4:0] = 0b10111 //Abort mode&lt;br /&gt;  CPSR[5] = 0 //set ARM state&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;br /&gt;  CPSR[7] = 1 //Disable IRQ&lt;br /&gt;  PC = 0x0000000C or 0xFFFF000C&lt;br /&gt;Exit:&lt;br /&gt;SUBS PC,R14,#4&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;(6)Undefined instruction (Priority: 6)&lt;/span&gt;&lt;br /&gt;Enter:&lt;br /&gt;R14_und = address of next instruction after the undefined instruction//這個指令做完也不需要重作 就直接做一個指令即可&lt;br /&gt;SPSR_und = CPSR&lt;br /&gt;CPSR[4:0] = 0b11011 //Undefined mode&lt;br /&gt;   CPSR[5] = 0 //set ARM state&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;br /&gt;   CPSR[7] = 1 //Disable IRQ&lt;br /&gt;   PC = 0x00000004 or 0xFFFF0004&lt;br /&gt;Exit:&lt;br /&gt; MOVS PC, R14&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;(7)SWI (Priority: 6)&lt;/span&gt;&lt;br /&gt;Enter:&lt;br /&gt;R14_svc = address of next instruction after the SWI instruction//這個指令做完也不需要重作 就直接做一個指令即可&lt;br /&gt; SPSR_svc = CPSR&lt;br /&gt; CPSR[4:0] = 0b10011 //SWI mode&lt;br /&gt;    CPSR[5] = 0 //set ARM state&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;br /&gt;    CPSR[7] = 1 //Disable IRQ&lt;br /&gt;    PC = 0x00000008 or 0xFFFF0008&lt;br /&gt; Exit:&lt;br /&gt;  MOVS PC, R14&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;===================================================&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;7. ARM Instruction Set&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ARM state: 32 bit fix length(需要aligned)&lt;br /&gt;Thumb state: 16 bit fix length&lt;br /&gt;Load/Store架構(跟memory要東西只能靠Load/Store指令)&lt;br /&gt;&lt;br /&gt;分成branch, Data-processing, Load/Store, Status register transfer, Coprocessor, Exception-generating 這幾大類&lt;br /&gt;&lt;br /&gt;Conditional Execution&lt;br /&gt;Add an S suffix to an ARM data processing instruction to make it update the ALU status flags in the CPSR&lt;br /&gt;ex:&lt;br /&gt;ADDS r0, r1, r2&lt;br /&gt;&lt;br /&gt;Do not use the S suffix with CMP, CMN, TST, TEQ. These comparison instructions always update the flags&lt;br /&gt;&lt;br /&gt;最大公因數&lt;br /&gt;while( r1 != r2 ) {&lt;br /&gt;    if( r1 &gt; r2 )&lt;br /&gt;        r1 = r1 - r2;&lt;br /&gt;    else&lt;br /&gt;       r2 = r2 - r1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;gcd:&lt;br /&gt;    CMP   r1, r2&lt;br /&gt;    SUBGT    r1, r1, r2&lt;br /&gt;    SUBLT    r2, r2, r1&lt;br /&gt;    BNE    gcd&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-1380138710041460518?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/1380138710041460518/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=1380138710041460518' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1380138710041460518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1380138710041460518'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/08/arm-programming-model.html' title='ARM Programming model'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_iFJRq_TrVbo/RrAeouInSsI/AAAAAAAAAAU/KPQRdr4bAII/s72-c/little+endian.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-1109916667573133392</id><published>2007-07-31T18:30:00.000+08:00</published><updated>2007-07-31T18:48:25.838+08:00</updated><title type='text'>如何了解一顆microprocessor</title><content type='html'>要如何了解一顆微處理器？如何選擇適合的處理器呢？&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204); font-weight: bold;"&gt;對內：&lt;/span&gt;&lt;br /&gt;就是REGISTER。有哪些register，各有怎樣的功用，是屬於通用型(general)還是只有某些特定register才可以做特殊的operation&lt;br /&gt;常見的有status register, address register(PC, SP, ...), data register, index register, general register&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;對外：&lt;/span&gt;&lt;br /&gt;這顆microprocessor外部可以接甚麼？&lt;br /&gt;Bus, I/O, Interrupt, memory subsystem, co-processor&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;RESET：&lt;/span&gt;&lt;br /&gt;當此處理器RESET時的系統內外狀態。Register的初始值，對外的Connection是否預設就會通了還是要設定，要怎麼設定....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;Instruction Set Architecture：&lt;/span&gt;&lt;br /&gt;1. 這些指令集哪些是設計用來存取"內"(Register)?&lt;br /&gt;2. 這些指令集哪些是設計用來存取"外"(bus, memory, I/O, co-processor)?&lt;br /&gt;3. 這些指令集哪些是設計用來"arithmetic operation"（+-*/)?&lt;br /&gt;4. 這些指令集哪些是設計用來control flow(beq, function call)?&lt;br /&gt;5. 這些指令集哪些是設計用來支援"high-level language"(Array, struct, global var., local var.)?&lt;br /&gt;6. 這些指令集哪些是設計用來支援"OS"(atomic function, cache, MMU)?&lt;br /&gt;7. 其他, 特殊指令support 浮點運算, DSP指令&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.S.&lt;br /&gt;這些是最近跑去上課的整理與心得&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-1109916667573133392?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/1109916667573133392/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=1109916667573133392' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1109916667573133392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/1109916667573133392'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/07/microprocessor.html' title='如何了解一顆microprocessor'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-4990791602251342263</id><published>2007-07-29T23:35:00.000+08:00</published><updated>2007-07-31T10:18:26.271+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux Driver'/><title type='text'>Linux Device Driver 1</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;要如何控制硬體裝置呢？&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;應用程式觀點：&lt;br /&gt;應用程式透過一組標準化的呼叫就可以來間接操作硬體&lt;br /&gt;ex: open("/dev/Lucky1", ....) , read(), write() ioctl()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iFJRq_TrVbo/Rq6bBeInSrI/AAAAAAAAAAM/XdNLEId6EnY/s1600-h/LinuxDriver1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_iFJRq_TrVbo/Rq6bBeInSrI/AAAAAAAAAAM/XdNLEId6EnY/s400/LinuxDriver1.jpg" alt="" id="BLOGGER_PHOTO_ID_5093178678173977266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Example:&lt;br /&gt; strace cat /dev/input/mice&lt;br /&gt; (strace可以看到system call)&lt;br /&gt;&lt;br /&gt;===============================================&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;Device Driver扮演的角色：&lt;/span&gt;&lt;br /&gt;以實際的硬體動作來實現"系統呼叫"所定義的功能&lt;br /&gt;模組化：驅動程式跟核心分開製作, 且再有需要時, 才在執行期將驅動程式"insert"到核心裡&lt;br /&gt;&lt;br /&gt;===============================================&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;機制 Mechanism &amp;  法則 Policy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;機制：要提供甚麼能力？&lt;br /&gt;法則：如何只用這個能力？&lt;br /&gt;&lt;br /&gt;留下 How to use it?(Policy) 的問題給application&lt;br /&gt;Policy-free的驅動程式, 盡量徹底發揮硬體能力(Sync, Async, Multiple opened, ....)&lt;br /&gt;&lt;br /&gt;===============================================&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;分類：&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Character Device&lt;br /&gt; 有device node&lt;br /&gt; "Direct Data Channel" to H/W&lt;br /&gt;  Device node可以直接被讀寫&lt;br /&gt;  ex: /dev/tty1&lt;br /&gt;&lt;br /&gt;Block Device&lt;br /&gt; 有device node&lt;br /&gt; Transfer Blocks data =&gt; 可以適合拿來high speed H/W&lt;br /&gt; "No Direct channel"所以不可以直接access&lt;br /&gt; ex: /dev/sda 要以File System來存取&lt;br /&gt;&lt;br /&gt;Network Interface&lt;br /&gt; 沒有device node&lt;br /&gt; 沒有read/write operation,使用packet transmission fuction&lt;br /&gt; 系統會自行負責packet&lt;br /&gt;&lt;br /&gt;===============================================&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;來掛載最簡單的Driver吧～&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------------------------------------------&lt;br /&gt;hello.c&lt;br /&gt;&lt;br /&gt;#include &lt;linux h=""&gt;&lt;br /&gt;#include &lt;linux h=""&gt;&lt;br /&gt;MODULE_LICENSE("Dual BSD/GPL");&lt;br /&gt;MODULE_AUTHOR("Lucky Chang");&lt;br /&gt;&lt;br /&gt;static char* name="Quanta";&lt;br /&gt;module_param(name, charp, 0);&lt;br /&gt;&lt;br /&gt;static int __init hello_init(void) {&lt;br /&gt;     printk(KERN_ALERT "Hello, %s\n",name);&lt;br /&gt;     return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void __exit hello_exit(void) {&lt;br /&gt;     printk(KERN_ALERT "Bye\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;module_init(hello_init);&lt;br /&gt;module_exit(hello_exit);&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------------------------------------------&lt;br /&gt;P.S.&lt;br /&gt;&lt;br /&gt;function前面加static?&lt;br /&gt; 此function只有此file看的到 (OOP的 private 觀念)&lt;br /&gt;&lt;br /&gt;__init ?&lt;br /&gt; 讓kernel知道該函式僅用於初始期間, 當module被順利載入, 模組裝載器會丟掉初始函式, 將記憶體空出來做其他用途&lt;br /&gt;&lt;br /&gt;__exit ?&lt;br /&gt; 讓kernel知道該函式僅用於卸載期間, 如果這個模組要直接嵌在核心裡, 或核心設定不容許卸載, 則標示__exit的函式就可以丟掉了&lt;br /&gt;&lt;br /&gt;printk() ?&lt;br /&gt; 當執行到driver時, 以進入kernel mode, 並無法使用標準C函式庫的library&lt;br /&gt; printk()函式定義在Linux核心內, 再沒有C函式庫的協助下, 自己執行自己&lt;br /&gt; KERN_ALERT代表訊息優先度&lt;br /&gt;&lt;br /&gt;寫Driver一定會用到的Macros&lt;br /&gt; module_init( init_func );&lt;br /&gt; module_exit(  clean_func );&lt;br /&gt;&lt;br /&gt; module_param(name, type, perm)&lt;br /&gt; type: byte, short, ushort, int, uint, long, ulong, charp, bool&lt;br /&gt; ex:&lt;br /&gt;  static char* name="Quanta"&lt;br /&gt;  module_param(name, charp, 0:&lt;br /&gt;  static int address=0;&lt;br /&gt;  module_param(address, int, 0);&lt;br /&gt;&lt;br /&gt; EXPORT_SYMBOL( name ); //加到kernel Symbol Table, 以後其他Driver or 誰就可以用到了&lt;br /&gt;&lt;br /&gt; MODULE_LICENSE()&lt;br /&gt; MODULE_AUTHOR( name ) //才能把自己的名字藏進去啊&lt;br /&gt;&lt;br /&gt; Makefile&lt;br /&gt;-----------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;# Comment/uncomment the following line to disable/enable debugging&lt;br /&gt;#DEBUG = y&lt;br /&gt;&lt;br /&gt;# Add your debugging flag (or not) to CFLAGS&lt;br /&gt;ifeq ($(DEBUG),y)&lt;br /&gt;    DEBFLAGS = -O -g # "-O" is needed to expand inlines&lt;br /&gt;else&lt;br /&gt;    DEBFLAGS = -O2&lt;br /&gt;endif&lt;br /&gt;&lt;br /&gt;CFLAGS += $(DEBFLAGS) -I$(LDDINCDIR)&lt;br /&gt;&lt;br /&gt;ifneq ($(KERNELRELEASE),)&lt;br /&gt;# call from kernel build system&lt;br /&gt;&lt;br /&gt;obj-m   := hello.o&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;KERNELDIR ?= /lib/modules/$(shell uname -r)/build&lt;br /&gt;PWD       := $(shell pwd)&lt;br /&gt;&lt;br /&gt;default:&lt;br /&gt;    $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINCDIR=$(PWD)/../include modules&lt;br /&gt;&lt;br /&gt;endif&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt;    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions&lt;br /&gt;&lt;br /&gt;depend .depend dep:&lt;br /&gt;    $(CC) $(CFLAGS) -M *.c &gt; .depend&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ifeq (.depend,$(wildcard .depend))&lt;br /&gt;include .depend&lt;br /&gt;endif&lt;br /&gt;-----------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt; 如何執行？&lt;br /&gt; make&lt;br /&gt; modinfo hello.ko&lt;br /&gt; insmod hello.ko name="Lucky"&lt;br /&gt; dmesg&lt;br /&gt; rmmod hello&lt;br /&gt; dmesg&lt;br /&gt;&lt;br /&gt; 加新功能 多一個數字參數&lt;br /&gt; insmod hello.ko name="Lucky" count=5&lt;br /&gt;&lt;br /&gt;===============================================&lt;/linux&gt;&lt;/linux&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-4990791602251342263?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/4990791602251342263/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=4990791602251342263' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/4990791602251342263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/4990791602251342263'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/07/linux-device-driver.html' title='Linux Device Driver 1'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_iFJRq_TrVbo/Rq6bBeInSrI/AAAAAAAAAAM/XdNLEId6EnY/s72-c/LinuxDriver1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-6131611379574267205</id><published>2007-07-23T12:02:00.000+08:00</published><updated>2007-07-23T12:10:44.620+08:00</updated><title type='text'>博大精深的Ubuntu 7.04 SHELL</title><content type='html'>搞了四五天 make一直不出來&lt;br /&gt;&lt;br /&gt;原來預設的/bin/bash 從 bash 改成 dash&lt;br /&gt;&lt;br /&gt;感謝馬丁大哥花一小時找的～(給你放煙火！！！)&lt;br /&gt;至少搞出來了 開心～～&lt;br /&gt;&lt;br /&gt;請參考&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;a href="http://fourdollars.blogspot.com/2007/06/ubuntu-bindash.html"&gt;喵的勒... 被 ubuntu 的 /bin/dash 錶到了... &gt;"&lt;&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-6131611379574267205?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/6131611379574267205/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=6131611379574267205' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/6131611379574267205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/6131611379574267205'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/07/ubuntu-704-shell.html' title='博大精深的Ubuntu 7.04 SHELL'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-8291117117784827064</id><published>2007-07-19T07:58:00.000+08:00</published><updated>2007-07-19T09:13:46.242+08:00</updated><title type='text'>Linux I2C driver</title><content type='html'>&lt;span style="font-size:100%;"&gt;目的：&lt;br /&gt;紀錄Linux I2C driver架構, porting步驟與心得&lt;br /&gt;&lt;br /&gt;大綱：&lt;br /&gt;1. 簡介I2C protocol(包含SMBus)&lt;br /&gt;2. Linux I2C driver架構&lt;br /&gt;3. Porting步驟與心得&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;內文：&lt;br /&gt;1.簡介I2C protocol(包含SMBus)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;缺...&gt;&lt;br /&gt;&lt;br /&gt;2. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Linux I2C driver架構&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://219.133.31.204:81/gate/big5/www.guangdongdz.com/special_column/techimages/20073311132736230.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://219.133.31.204:81/gate/big5/www.guangdongdz.com/special_column/techimages/20073311132736230.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;可分成三個層次來看&lt;br /&gt;(1). I2C core框架：&lt;br /&gt;提供核心的data structure的define和操作這些data structure的相關介面function, 用來實現i2c adapter和device的註冊/註銷管理,以及I2C通信方法上層與H/W adapter無關的代碼, 為系統中每個I2C bus增加相應的read/write method&lt;br /&gt;&lt;br /&gt;(2). I2C bus adapter driver：&lt;br /&gt;定義描述具體I2C bus adapter的i2c_adapter structure. 實現在實體I2C adapter上的I2C bus通信方法, 並由i2c_algorithm來描述&lt;br /&gt;為系統每個I2C bus增加相對應的讀寫方法, 等待device driver的呼叫&lt;br /&gt;在系統開機時, 首先裝載的是I2C bus driver, 一個bus driver support一特定的I2C bus的讀寫, 一個bus driver通常需要2個module-  struct i2c_adapter,   struct i2c_algorithm&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="border: 1pt solid windowtext; padding: 1pt 4pt; margin-left: 36pt; margin-right: 0cm;"&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;static struct i2c_adapter pb1550_board_adapter = {&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;  name:              "pb1550 adapter",&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;  id:                I2C_HW_AU1550_PSC,&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;  algo:              NULL,&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;  algo_data:         &amp;pb1550_i2c_info,&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;  inc_use:           pb1550_inc_use,&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;  dec_use:           pb1550_dec_use,&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;  client_register:   pb1550_reg,&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;  client_unregister: pb1550_unreg,&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;  client_count:      0,&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;pre style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;};&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;这个样例挂接了一个叫做“&lt;span lang="EN-US"&gt;pb1550 adapter&lt;/span&gt;”的驱动。但这个模块并未提供读写函数，具体的读写方法由第二个模块，&lt;span lang="EN-US"&gt;struct i2c_algorithm&lt;/span&gt;提&lt;tt&gt;&lt;span style="font-size: 9pt;"&gt;供。&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;&lt;div style="border: 1pt solid windowtext; padding: 1pt 4pt; margin-left: 36pt; margin-right: 0cm;"&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;static struct i2c_algorithm au1550_algo = {&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; .name         = "Au1550 algorithm",&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; .id      = I2C_ALGO_AU1550,&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; .master_xfer  = au1550_xfer,&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; .functionality     = au1550_func,&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;};&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; &lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;i2c_adap-&gt;algo = &amp;au1550_algo;&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;/div&gt;    &lt;br /&gt; &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;这个样例给上述总线驱动增加了读写“算法”。通常情况下每个&lt;span lang="EN-US"&gt;I2C&lt;/span&gt;总线驱动都定义一个自己的读写算法，但鉴于有些总线使用相同的算法，因而可以共用同一套读写函数。本例中的驱动定义了自己的读写算法模块，起名叫“&lt;span lang="EN-US"&gt;Au1550 algorithm&lt;/span&gt;”。&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;全部填妥后，通过调用：&lt;/p&gt;  &lt;div style="border: 1pt solid windowtext; padding: 1pt 4pt; margin-left: 36pt; margin-right: 0cm;"&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt;i2c_add_adapter(i2c_adap);&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:100%;"&gt;               &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(3). I2C device driver：&lt;br /&gt;定義描述描述具體設備i2c_client(ex: 某一個thernal sensor)和可能的私有data structure, 使用I2C core提供的function interface在kernel 中 register, 並實現具體功能(read, write, ioctl....)&lt;br /&gt;device driver則是與掛在I2C bus上的實體的設備通訊的driver&lt;br /&gt;bus driver只是提供對一條bus的讀寫機制, 本身不做通信, 通信是由I2C device driver來做, device driver透過i2c bus實體的設備進行通訊Device driver有兩個module-  struct i2c_driver,   struct i2c_client&lt;br /&gt;當系統開機 i2c bus driver裝載完畢, 就可以裝載device driver&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="border: 1pt solid windowtext; padding: 1pt 4pt; margin-left: 36pt; margin-right: 0cm;"&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt;static struct i2c_driver driver = {&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt;        .name           = "i2c TV tuner driver",&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt;        .id             = I2C_DRIVERID_TUNER,&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt;        .flags          = I2C_DF_NOTIFY,&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt;        .attach_adapter = tuner_probe,&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt;        .detach_client  = tuner_detach,&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt;        .command        = tuner_command,&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt;};&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;span lang="EN-US"&gt;i2c_add_driver(&amp;driver);&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;这个&lt;span lang="EN-US"&gt;i2c_driver&lt;/span&gt;一旦装入完成，其中的&lt;span lang="EN-US"&gt;attach_adapter&lt;/span&gt;函数就会被调用。在其中可以遍历系统中的每个&lt;span lang="EN-US"&gt;i2c&lt;/span&gt;总线驱动，探测想要访问的设备：&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 1pt solid windowtext; padding: 1pt 4pt; margin-left: 36pt; margin-right: 0cm;"&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;static int tuner_probe(struct i2c_adapter *adap) &lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;{&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; return i2c_probe(adap, &amp;addr_data, tuner_attach); &lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;}&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;注意探测可能会找到多个设备，因而不仅一个&lt;span lang="EN-US"&gt;I2C&lt;/span&gt;总线可以挂多个不同类型的设备，一个设备驱动也可以同时为挂在多个不同&lt;span lang="EN-US"&gt;I2C&lt;/span&gt;总线上的设备服务。&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;每当设备驱动探测到了一个它能支持的设备，它就创建一个&lt;span lang="EN-US"&gt;struct i2c_client&lt;/span&gt;来标识这个设备：&lt;/p&gt;  &lt;div style="border: 1pt solid windowtext; padding: 1pt 4pt; margin-left: 36pt; margin-right: 0cm;"&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;new_client-&gt;addr = address;&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;new_client-&gt;adapter = adapter;&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;new_client-&gt;driver = &amp;driver;&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; &lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;/* Tell the I2C layer a new client has arrived */&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;err = i2c_attach_client(new_client);&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;if (err)&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;    goto error;&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;可见，一个&lt;span lang="EN-US"&gt;i2c_client&lt;/span&gt;代表着位于&lt;span lang="EN-US"&gt;adapter&lt;/span&gt;总线上，地址为&lt;span lang="EN-US"&gt;address&lt;/span&gt;，使用&lt;span lang="EN-US"&gt;driver&lt;/span&gt;来驱动的一个设备。它将总线驱动与设备驱动，以及设备地址绑定在了一起。一个&lt;span lang="EN-US"&gt;i2c_client&lt;/span&gt;就代表着一个&lt;span lang="EN-US"&gt;I2C&lt;/span&gt;设备。&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;当得到&lt;span lang="EN-US"&gt;I2C&lt;/span&gt;设备后，就可以直接对此设备进行读写：&lt;/p&gt;  &lt;div style="border: 1pt solid windowtext; padding: 1pt 4pt; margin-left: 36pt; margin-right: 0cm;"&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;/*&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; * The master routines are the ones normally used to transmit data to devices&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; * on a bus (or read from them). Apart from two basic transfer functions to &lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; * transmit one message at a time, a more complex version can be used to &lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; * transmit an arbitrary number of messages without interruption.&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt; */&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;extern int i2c_master_send(struct i2c_client *,const char* ,int);&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="border: medium none ; padding: 0cm; margin-left: 0cm;"&gt;&lt;tt&gt;&lt;span style="font-size: 9pt;" lang="EN-US"&gt;extern int i2c_master_recv(struct i2c_client *,char* ,int);&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;span style="font-size:100%;"&gt;舉個例子再說明一次&lt;br /&gt;example：AT91RM9200的I2C driver&lt;br /&gt;&lt;br /&gt;首先初始AT91RM9200的I2C工作模式, 然後裝載I2C bus driver&lt;br /&gt;&lt;br /&gt;static struct i2c_adapter at91rm9200_adapter = {&lt;br /&gt;    .name = "AT91RM9200",&lt;br /&gt;    .id = I2C_ALGO_SMBUS,&lt;br /&gt;    .algo = &amp;at91_algorithm,&lt;br /&gt;    .algo_data = NULL&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;真正讀寫&lt;br /&gt;&lt;br /&gt;static struct i2c_algorithm at91_algorithm = {&lt;br /&gt;    .name = "at91i2c",&lt;br /&gt;    .id = I2C_ALGO_SMBUS,&lt;br /&gt;    .smbus_xfer = at91_smbus_xfer&lt;br /&gt;    .master_xfer = at91_xfer&lt;br /&gt;    .functionality = at91_func&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;通過呼叫I2C core中的介面函數 &lt;span style="color: rgb(51, 51, 153);"&gt;i2c_add_adapter&lt;/span&gt;將這兩個module註冊到作業系統理bus driver就算裝上, i2c_algorithm實現i2c通信的具體方法, 針對本文at91_xfer最為關鍵, I2C core框架中提供給host使用的data transfer interface- i2c_master_send, i2c_master_recv, i2c_tarnsfer最終都是呼叫at91_xfer&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;device driver (x1227 一個 RTC IC)&lt;br /&gt;&lt;br /&gt;struct i2c_driver x1227_driver = {&lt;br /&gt;    .name = "x1227driver"&lt;br /&gt;    .id = "I2C_DRIVERID_X1227,&lt;br /&gt;    .flags = I2C_DF_NOTIFY,&lt;br /&gt;    .attach_adapter = x1227_probe,&lt;br /&gt;    .detech_client = x1227_detech,&lt;br /&gt;    .command = x1227_command,&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;其中attach_adapter利用adapter driver提供的I2C probe方法, 利用device driver module中提供的address, 檢測可能存在的設備及其地址, 如果發現設備則create struct i2c_client來標示這個device並向該adapter的data structure register. detect_client用於bus上得unregister, 並release i2c_client及相對應的私有data structure. command是user interface中的ioctl功能的底層實現&lt;br /&gt;&lt;br /&gt;i2c device driver需要實現兩各方面的介面, 一個是對I2C core框架的介面, 設備初始化時通過function i2c_add_driver來實現driver的register, 這個i2c_driver一旦裝入完成, 其中attach_adapter function就會開始被呼叫&lt;br /&gt;另一個是對user application的介面, 提供user program probe I2C device的interface, 包括實現open, release, read, write, ioctl每個device driver都有一個稱為file_operation的data structure&lt;br /&gt;&lt;br /&gt;static struct file_operations rtc_fops = {&lt;br /&gt;    .owner = THIS_MODULE,&lt;br /&gt;    .ioctl = x1227_rtc_ioctl,&lt;br /&gt;    .open = x1227_rtc_open,&lt;br /&gt;    .release = x1227_rtc_release,&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Reference:&lt;br /&gt;1.&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;a href="http://www.lm-sensors.org/"&gt;Lm_sensors&lt;/a&gt; - Linux hardware monitoring, 網站目的是讓機器可以讀取thermal sensor等來監控系統, 但因為主要的sensor IC介面不外乎是I2C or SMBus介面, 所以Kernel很多有關I2C的程式來至於這邊的貢獻&lt;br /&gt;2. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span class="simpleBlogIcons contenttype-blogentry"&gt;&lt;a href="http://www.gnome-cn.org/resources/blog/lonestar/linuxdei2cqudongjiagou"&gt;Linux的I2C驱动架构&lt;/a&gt;  以分析source code data structure方面來解釋Linux I2C driver架構&lt;br /&gt;3. &lt;/span&gt;&lt;a href="http://219.133.31.204:81/gate/big5/www.guangdongdz.com/special_column/techarticle/20073/3111322038230.html"&gt;嵌入式Linux系統中I2C總線設備的驅動設計&lt;/a&gt; 分析Linux I2C driver架構, 同時提供了一個很好的架構圖&lt;br /&gt;4.&lt;/span&gt; &lt;a href="http://blog.21ic.org/user1/1066/index.html"&gt;[misc驱动]linux下I2C驱动(一)~(七)&lt;/a&gt; 解釋了i2c-dev的概念, 並解釋了一些lm_sensors project的文件&lt;span style="font-size:130%;"&gt;&lt;strong&gt;&lt;a href="http://blog.21ic.org/user1/1066/archives/2007/34679.html"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-8291117117784827064?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/8291117117784827064/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=8291117117784827064' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/8291117117784827064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/8291117117784827064'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/07/linux-i2c-driver.html' title='Linux I2C driver'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-3314618245081424947</id><published>2007-07-11T21:44:00.000+08:00</published><updated>2007-07-11T22:07:30.930+08:00</updated><title type='text'>糖尿病</title><content type='html'>內分泌急症, 糖尿病, 高滲透壓高血糖非酮酸昏迷(HHNC)&lt;br /&gt;Hyperosmolar Hyperglycemic Nonketotic Coma&lt;br /&gt;&lt;br /&gt;威脅"非胰島素依賴型糖尿病"(TYPE II)的病人, 典型病患年齡超過50歲且合併其他疾病&lt;br /&gt;產生的胰島素只夠來避免酮酸中毒, 但無法避免嚴重的高血糖, 脫水, 高滲透壓的現象&lt;br /&gt;&lt;br /&gt;臨床表徵&lt;br /&gt;神經: 混亂, 嗜睡, 抽搐, 昏迷&lt;br /&gt;肺臟: 淺或正常的呼吸&lt;br /&gt;心血管: 心博過速, T波變高, 心跳節律異常&lt;br /&gt;腎臟: 多尿, 糖尿&lt;br /&gt;腸胃: 輕微之腹部不適, 噁心, 嘔吐&lt;br /&gt;&lt;br /&gt;血糖濃度增加會產生滲透式的利尿效果, 造成嚴重的脫水現象, 脫水易造成栓塞, 沒有足夠胰島素身體開始代謝脂肪和肌肉組織, 胺基酸增加, 肝臟糖質新生作用更加中高血糖現象&lt;br /&gt;&lt;br /&gt;矯正高血糖, 脫水, 電解質不平衡&lt;br /&gt;意識程度改變, 氧氣治療&lt;br /&gt;靜脈液體補充0.9%生理食鹽水&lt;br /&gt;胰島素滴注 (&lt;100 mg/dl/hr)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-3314618245081424947?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/3314618245081424947/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=3314618245081424947' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/3314618245081424947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/3314618245081424947'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/07/blog-post_11.html' title='糖尿病'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6684638057132206873.post-5442024321150070259</id><published>2007-07-11T21:31:00.000+08:00</published><updated>2007-07-11T21:33:03.898+08:00</updated><title type='text'>開張</title><content type='html'>心得, 想法, 首篇測試！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6684638057132206873-5442024321150070259?l=clc168.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clc168.blogspot.com/feeds/5442024321150070259/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6684638057132206873&amp;postID=5442024321150070259' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/5442024321150070259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6684638057132206873/posts/default/5442024321150070259'/><link rel='alternate' type='text/html' href='http://clc168.blogspot.com/2007/07/blog-post.html' title='開張'/><author><name>Ziv</name><uri>http://www.blogger.com/profile/01607244687315450437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
