<?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-7357892837569619421</id><updated>2011-07-31T09:35:24.340+08:00</updated><category term='linux kernel'/><category term='SIP'/><category term='研究生活'/><category term='心情'/><category term='Blogger'/><category term='ARM S3C2440'/><category term='Qtopia'/><category term='linux driver'/><category term='wxWidgets'/><title type='text'>Live and let die</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7357892837569619421.post-187893054693123968</id><published>2008-09-29T00:51:00.005+08:00</published><updated>2009-09-15T18:51:50.808+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='心情'/><title type='text'>做兵去</title><content type='html'>好久沒有動我的部落格了&lt;br /&gt;要去當兵囉 ~~~&lt;br /&gt;發表一下感想好了&lt;br /&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;等當兵的日子超無聊&lt;br /&gt;不過說真的 當兵完以後就沒有辦法過這樣悠閒的日子了&lt;br /&gt;就要開始準備工作 面對其他的壓力了&lt;br /&gt;&lt;br /&gt;11個月而已 很快就出來了&lt;br /&gt;話是這樣說 可是進去以後應該還是會覺得時間過的很慢很慢 哈哈&lt;br /&gt;&lt;br /&gt;真想趕快當完兵去工作&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/7357892837569619421-187893054693123968?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/187893054693123968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=187893054693123968' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/187893054693123968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/187893054693123968'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/09/blog-post.html' title='做兵去'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7357892837569619421.post-492759437487515726</id><published>2008-05-27T16:45:00.001+08:00</published><updated>2008-05-27T20:52:51.341+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxWidgets'/><title type='text'>wxWidgets cross-Platform GUI Library</title><content type='html'>wxWidgets 是一個跨平台開發 gui 介面的函式庫   &lt;br /&gt;官方網站：&lt;a title="http://www.wxwidgets.org/" href="http://www.wxwidgets.org/"&gt;http://www.wxwidgets.org/&lt;/a&gt;   &lt;br /&gt;  &lt;br /&gt;支援的平台：   &lt;br /&gt;- Win32   &lt;br /&gt;- Mac OS X   &lt;br /&gt;- GTK+   &lt;br /&gt;- X11   &lt;br /&gt;- Motif   &lt;br /&gt;- WinCE   &lt;br /&gt;  &lt;br /&gt;&lt;span id="fullpost"&gt;可以去下載 &lt;a href="http://www.bloodshed.net/dev/index.html"&gt;wxDev-C++&lt;/a&gt; 或是 &lt;a href="http://wxformbuilder.org/"&gt;wxFormBuilder&lt;/a&gt; 來輔助開發 (個人比較推薦 wxFormBuilder)&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;mysubtitle&gt;Windows 上使用 wxWidgets 開發&lt;/mysubtitle&gt;     &lt;br /&gt;Widgets 版本： wxMSW-2.8.7     &lt;br /&gt;編譯器： Visual Stdio 2005     &lt;br /&gt;    &lt;br /&gt;設定編譯器：     &lt;br /&gt;- 加入 Include 目錄： &lt;strong&gt;&amp;lt;wxMSX-2.8.7&amp;gt;/include      &lt;br /&gt;&lt;/strong&gt;- 加入 lib 目錄： &lt;strong&gt;&amp;lt;wxMSX-2.8.7&amp;gt;/lib/vc_lib      &lt;br /&gt;&lt;/strong&gt;- 加入連接的 lib 檔： &lt;strong&gt;wxmsw28d_core.lib wxbase28d.lib wxtiffd.lib wxjpegd.lib      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib winmm.lib &lt;/strong&gt;&lt;strong&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib&lt;/strong&gt;     &lt;br /&gt;- 設定前置處理器定義：&lt;strong&gt; WIN32;__WXMSW__;_WINDOWS&lt;/strong&gt;     &lt;br /&gt;- 選擇成： &lt;strong&gt;多執行緒偵錯 DLL (/MDd)      &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;&lt;code class="ps"&gt;附註：      &lt;br /&gt;1. 依照自己需要加入 lib 檔       &lt;br /&gt;2. lib 檔名 - debug 結尾有 &amp;quot;d&amp;quot;, unicode 結尾有 &amp;quot;u&amp;quot;       &lt;br /&gt;3. 如果要用編譯器 debug 要設定 &amp;quot;產生偵錯資訊&amp;quot;       &lt;br /&gt;4. 大致上是要設定這些東西，其他細節就自行嘗試吧！！&lt;/code&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;code class="ref"&gt;參考資料：      &lt;br /&gt;&lt;a title="http://wiki.wxwidgets.org/User%27s_Guide_For_VCpp_6.0" href="http://wiki.wxwidgets.org/User%27s_Guide_For_VCpp_6.0"&gt;http://wiki.wxwidgets.org/User%27s_Guide_For_VCpp_6.0&lt;/a&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;a title="http://wiki.wxwidgets.org/Microsoft_Visual_CPP_Guide#Visual_C.2B.2B_2005_Express_and_Text_Editor_of_Your_Choice" href="http://wiki.wxwidgets.org/Microsoft_Visual_CPP_Guide#Visual_C.2B.2B_2005_Express_and_Text_Editor_of_Your_Choice"&gt;http://wiki.wxwidgets.org/Microsoft_Visual_CPP_Guide#Visual_C.2B.2B_2005_Express_and_Text_Editor_of_Your_Choice&lt;/a&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;a title="http://www.christoph-mewes.de/wxwidgets/" href="http://www.christoph-mewes.de/wxwidgets/"&gt;http://www.christoph-mewes.de/wxwidgets/&lt;/a&gt;&lt;/code&gt;&lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7357892837569619421-492759437487515726?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/492759437487515726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=492759437487515726' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/492759437487515726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/492759437487515726'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/05/wxwidgets-cross-platform-gui-library.html' title='wxWidgets cross-Platform GUI Library'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-344429199211036555</id><published>2008-05-20T15:46:00.000+08:00</published><updated>2008-05-26T16:59:00.781+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIP'/><title type='text'>OpenSER</title><content type='html'>OpenSER 是一個 open source&amp;#160; 的 SIP Server   &lt;br /&gt;提供了大部分常用的 SIP Server 功能 :   &lt;br /&gt;- SIP proxy server   &lt;br /&gt;- SIP register server   &lt;br /&gt;- SIP redirect server   &lt;br /&gt;  &lt;br /&gt;&lt;span id="fullpost"&gt;&lt;mysubtitle&gt;系統需求：&lt;/mysubtitle&gt;    &lt;br /&gt;- &lt;em&gt;gcc compiler      &lt;br /&gt;&lt;/em&gt;- &lt;em&gt;flex&lt;/em&gt;     &lt;br /&gt;- &lt;em&gt;bison&lt;/em&gt;     &lt;br /&gt;- &lt;em&gt;libmysqlclient15-dev&lt;/em&gt;     &lt;br /&gt;- &lt;em&gt;openssl      &lt;br /&gt;&lt;/em&gt;- &lt;em&gt;mysql      &lt;br /&gt;&lt;/em&gt;    &lt;br /&gt;&lt;mysubtitle&gt;編譯安裝 OpenSER&lt;/mysubtitle&gt;     &lt;br /&gt;到&lt;a href="http://www.openser.org/pub/openser/latest/src/"&gt;這裡&lt;/a&gt;下載最新的版本     &lt;br /&gt;我使用的版本是：openser-1.3.2-tls.tar.gz     &lt;br /&gt;    &lt;br /&gt;修改 Makefile 把 mysql 從 exclude modules 去除     &lt;br /&gt;&lt;code&gt;....      &lt;br /&gt;      &lt;br /&gt;exclude_modules?= .... &lt;font color="#ff0000"&gt;&lt;strike&gt;mysql&lt;/strike&gt;&lt;/font&gt; ...       &lt;br /&gt;      &lt;br /&gt;.... &lt;/code&gt;    &lt;br /&gt;&lt;strong&gt;make all&lt;/strong&gt;     &lt;br /&gt;&lt;strong&gt;make install&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;code class="ps"&gt;附註：      &lt;br /&gt;如果不想改 Makefile 可以改用下面指令       &lt;br /&gt;make all include_modules=&amp;quot;mysql&amp;quot;       &lt;br /&gt;make install include_modules=&amp;quot;mysql&amp;quot;&lt;/code&gt;     &lt;br /&gt;會將相關檔案安裝在 /usr/local 底下     &lt;br /&gt;執行檔會出現在 /usr/local/sbin 底下 (openser openserctl openserdbctl openserunix)     &lt;br /&gt;config 檔會出現在 /usr/local/etc/openser 底下 (dictionary.radius openser.cfg openserctlrc)&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;mysubtitle&gt;建立 openser log 檔&lt;/mysubtitle&gt;     &lt;br /&gt;修改 /etc/syslog.cfg 檔，加入藍色部份     &lt;br /&gt;&lt;code&gt;.....      &lt;br /&gt;      &lt;br /&gt;&lt;font color="#0000ff"&gt;#        &lt;br /&gt;# don't log messages with LOG_LOCAL0 in /var/log/syslog anymore         &lt;br /&gt;*.*;auth,authpriv.none,local0.none -/var/log/syslog         &lt;br /&gt;        &lt;br /&gt;#         &lt;br /&gt;# log messages with LOG_LOCAL0 in /var/log/openser.log         &lt;br /&gt;local0.* -/var/log/openser.log&lt;/font&gt;       &lt;br /&gt;      &lt;br /&gt;.....&lt;/code&gt;     &lt;br /&gt;    &lt;br /&gt;會在 /var/log/ 底下出現 openser.log     &lt;br /&gt;    &lt;br /&gt;如果想要修改 openser log 設定     &lt;br /&gt;要修改 openser.cfg     &lt;br /&gt;相關參數：     &lt;br /&gt;&lt;strong&gt;- debug: &lt;/strong&gt;set log level (0~9).     &lt;br /&gt;&lt;strong&gt;- log_stderror: &lt;/strong&gt;If set to &amp;quot;yes&amp;quot;, print debugging information to standard error output.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If set to &amp;quot;no&amp;quot;, syslog will be used.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Default is &amp;quot;no&amp;quot; (printing to syslog).     &lt;br /&gt;&lt;strong&gt;- log_facility:&lt;/strong&gt; is used to specify what type of program is logging the message.&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Valid values are &amp;quot;LOG_LOCAL0&amp;quot; through &amp;quot;LOG_LOCAL7&amp;quot;.&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; See the manual page of syslog for more information.     &lt;br /&gt;    &lt;br /&gt;&lt;code class="ref"&gt;參考資料：      &lt;br /&gt;&lt;a title="http://www.openser.org/dokuwiki/doku.php/tutorials:debug-syslog-messages#introduction" href="http://www.openser.org/dokuwiki/doku.php/tutorials:debug-syslog-messages#introduction"&gt;http://www.openser.org/dokuwiki/doku.php/tutorials:debug-syslog-messages#introduction&lt;/a&gt; &lt;/code&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;mysubtitle&gt;啟用認證使用者功能 (Mysql)&lt;/mysubtitle&gt;     &lt;br /&gt;修改 openserctlrc     &lt;br /&gt;&lt;code&gt;......      &lt;br /&gt;      &lt;br /&gt;&lt;font color="#0000ff"&gt;SIP_DOMAIN=&amp;lt;your server domain&amp;gt;        &lt;br /&gt;&lt;/font&gt;      &lt;br /&gt;......       &lt;br /&gt;      &lt;br /&gt;&lt;font color="#0000ff"&gt;DBENGINE=MYSQL&lt;/font&gt;       &lt;br /&gt;      &lt;br /&gt;......&lt;/code&gt;     &lt;br /&gt;    &lt;br /&gt;修改 openser.cfg 取消以下的註解     &lt;br /&gt;&lt;code&gt;......      &lt;br /&gt;      &lt;br /&gt;&lt;font color="#0000ff"&gt;loadmodule &amp;quot;mysql.so&amp;quot;&lt;/font&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;font color="#0000ff"&gt;loadmodule &amp;quot;auth.so&amp;quot;&lt;/font&gt;       &lt;br /&gt;&lt;font color="#0000ff"&gt;loadmodule &amp;quot;auth_db.so&amp;quot;&lt;/font&gt;       &lt;br /&gt;      &lt;br /&gt;.......       &lt;br /&gt;      &lt;br /&gt;&lt;font color="#0000ff"&gt;modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,&amp;#160;&amp;#160; 2)&lt;/font&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;font color="#0000ff"&gt;modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;calculate_ha1&amp;quot;, yes)&lt;/font&gt;       &lt;br /&gt;&lt;font color="#0000ff"&gt;modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;password_column&amp;quot;, &amp;quot;password&amp;quot;)&lt;/font&gt;       &lt;br /&gt;      &lt;br /&gt;.......       &lt;br /&gt;      &lt;br /&gt;&lt;font color="#0000ff"&gt;if (!www_authorize(&amp;quot;&amp;lt;your server domain&amp;gt;&amp;quot;, &amp;quot;subscriber&amp;quot;))        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; www_challenge(&amp;quot;&amp;lt;your server domain&amp;gt;&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit;         &lt;br /&gt;}         &lt;br /&gt;&lt;/font&gt;      &lt;br /&gt;.......&lt;/code&gt;     &lt;br /&gt;    &lt;br /&gt;建立 openser 的 mysql tabel     &lt;br /&gt;&lt;strong&gt;openserdbctl create&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;會建立兩個 mysql 使用者： openser openserro     &lt;br /&gt;預設密碼分別為： openserrw openserro&amp;#160; &lt;br /&gt;    &lt;br /&gt;使用 openserct add 指令加入新帳號     &lt;br /&gt;    &lt;br /&gt;&lt;code class="ref"&gt;參考資料：      &lt;br /&gt;&lt;a title="http://www.openser.org/mos/view/-OpenSER-Installation-Notes/" href="http://www.openser.org/mos/view/-OpenSER-Installation-Notes/"&gt;http://www.openser.org/mos/view/-OpenSER-Installation-Notes/&lt;/a&gt;&lt;/code&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;mysubtitle&gt;使用方式&lt;/mysubtitle&gt;     &lt;br /&gt;開啟服務： openserctl start     &lt;br /&gt;停止服務： openserctl stop     &lt;br /&gt;查詢誰在線上： openserctl online     &lt;br /&gt;新增帳號： openserctl add &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; &amp;lt;email&amp;gt;     &lt;br /&gt;    &lt;br /&gt;&lt;code class="ref"&gt;參考資料：      &lt;br /&gt;&lt;a title="http://www.openser.org/dokuwiki/doku.php/install:openser-from-svn" href="http://www.openser.org/dokuwiki/doku.php/install:openser-from-svn"&gt;http://www.openser.org/dokuwiki/doku.php/install:openser-from-svn&lt;/a&gt;&lt;/code&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/7357892837569619421-344429199211036555?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/344429199211036555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=344429199211036555' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/344429199211036555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/344429199211036555'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/05/openser.html' title='OpenSER'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-1573337998473999997</id><published>2008-04-23T14:19:00.000+08:00</published><updated>2008-05-26T17:08:35.144+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux driver'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>MMC/SD Driver</title><content type='html'>&lt;p&gt;2.6.24.3 沒有 s3c24XX 系列的 mmc/sd 驅動作出來    &lt;br /&gt;可以去抓相關的 patch     &lt;br /&gt;    &lt;br /&gt;&lt;code class="ref"&gt;patch: &lt;a title="http://svnweb.openmoko.org/branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch?rev=3700&amp;amp;sortby=date&amp;amp;view=markup" href="http://svnweb.openmoko.org/branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch?rev=3700&amp;amp;sortby=date&amp;amp;view=markup"&gt;http://svnweb.openmoko.org/branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch?rev=3700&amp;amp;sortby=date&amp;amp;view=markup&lt;/a&gt;&lt;/code&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;code class="ref"&gt;參考資料：      &lt;br /&gt;&lt;a title="http://blog.21ic.com/user1/3172/archives/2007/40307.html" href="http://blog.21ic.com/user1/3172/archives/2007/40307.html"&gt;S3C2410中SD卡驅動的移植&lt;/a&gt;       &lt;br /&gt;&lt;a title="http://blog.chinaunix.net/u1/41539/showart_326487.html" href="http://blog.chinaunix.net/u1/41539/showart_326487.html"&gt;s3c2410平台SD卡驅動分析&lt;/a&gt;       &lt;br /&gt;&lt;a title="http://blog.ednchina.com/mcu_study/19821/message.aspx" href="http://blog.ednchina.com/mcu_study/19821/message.aspx"&gt;s3c2440linux2.6mmc/sd驅動程序&lt;/a&gt;&lt;/code&gt;     &lt;br /&gt;&lt;span id="fullpost"&gt;     &lt;br /&gt;menuconfig 要選：       &lt;br /&gt;System Type&amp;#160; ---&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [*] S3C2410 DMA support&amp;#160; &lt;br /&gt;      &lt;br /&gt;&lt;code class="ps"&gt;附註：不知道 2410 和 2440 DMA 操作的方試是不是一樣？？&lt;/code&gt;       &lt;br /&gt;&lt;mysubtitle&gt;相關筆記&lt;/mysubtitle&gt;       &lt;br /&gt;SDCLK&amp;#160;&amp;#160; -&amp;gt; GPE5       &lt;br /&gt;SDCMD&amp;#160; -&amp;gt; GPE6       &lt;br /&gt;SDDAT0 -&amp;gt; GPE7       &lt;br /&gt;SDDAT1 -&amp;gt; GPE8       &lt;br /&gt;SDDAT2 -&amp;gt; GPE9       &lt;br /&gt;SDDAT3 -&amp;gt; GPE10       &lt;br /&gt;Card Detect -&amp;gt; GPG2       &lt;br /&gt;Write Protect -&amp;gt; ??       &lt;br /&gt;SD POWER -&amp;gt; GPB9       &lt;br /&gt;      &lt;br /&gt;有用到 tasklet 機制 (軟體中斷)       &lt;br /&gt;1. 使用 tastklet_init 建立一個 tasklet       &lt;br /&gt;2. 再使用 tasklet_schedule 把其 tasklet 放在 tasklet_vec 的最前面。       &lt;br /&gt;      &lt;br /&gt;&lt;code class="ref"&gt;參考資料：        &lt;br /&gt;&lt;a title="http://blog.chinaunix.net/u/24474/showart_227121.html" href="http://blog.chinaunix.net/u/24474/showart_227121.html"&gt;http://blog.chinaunix.net/u/24474/showart_227121.html&lt;/a&gt;         &lt;br /&gt;&lt;a title="http://mechgouki.blogdriver.com/mechgouki/282365.html" href="http://mechgouki.blogdriver.com/mechgouki/282365.html"&gt;http://mechgouki.blogdriver.com/mechgouki/282365.html&lt;/a&gt;&lt;/code&gt;       &lt;br /&gt;      &lt;br /&gt;讀取資料 -&amp;gt; do_pio_read ??       &lt;br /&gt;寫入資料 -&amp;gt; do_pio_write ??       &lt;br /&gt;      &lt;br /&gt;irq&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -&amp;gt; s3cmci_irq       &lt;br /&gt;irq_cd -&amp;gt; s3cmci_irq_cd&amp;#160; &lt;br /&gt;      &lt;br /&gt;發送CMD8，檢查卡是否 SD2.0。SD1.1 是不支持 CMD8 的，因此在 SD2.0 Spec中提出了先發送CMD8，如果回應為無效命令，則卡為SD1.1，否則就是SD2.0       &lt;br /&gt;      &lt;br /&gt;&lt;code class="ref"&gt;參考資料：        &lt;br /&gt;&lt;a title="http://blog.chinaunix.net/u1/42456/showart_523584.html" href="http://blog.chinaunix.net/u1/42456/showart_523584.html"&gt;http://blog.chinaunix.net/u1/42456/showart_523584.html&lt;/a&gt; &lt;/code&gt;      &lt;br /&gt;      &lt;br /&gt;卡插入後似乎是正常的       &lt;br /&gt;但是會出現       &lt;br /&gt;mmc0: error -110 whilst initialising SD card       &lt;br /&gt;應該是卡在 linux/driver/mmc/core/sd.c 的       &lt;br /&gt;mmc_sd_init_card() --&amp;gt; mmc_send_app_op_cond(host, ocr, NULL)       &lt;br /&gt;      &lt;br /&gt;ocr 是指 card 內部的 Operation Condition Register (OCR) 讀出來的值       &lt;br /&gt;發送 CMD41 CMD55&amp;#160; 讀取 OCR 的值       &lt;br /&gt;問題是出在 OCR[31] 一直是 0 &amp;lt;--- 初始化沒有完成？？       &lt;br /&gt;結果問題是出在電壓不足，要把 sd power enable       &lt;br /&gt;( color 是大功臣 )       &lt;br /&gt;      &lt;br /&gt;struct mmc_command 中的變數代表意思：       &lt;br /&gt;opcode -&amp;gt; 要發送的 command       &lt;br /&gt;arg&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -&amp;gt; 要傳送的參數&amp;#160; &lt;br /&gt;flags&amp;#160;&amp;#160;&amp;#160; -&amp;gt; command 的類型       &lt;br /&gt;      &lt;br /&gt;kernel 已經有抓到 sd 卡的資料       &lt;br /&gt;但是會出現 kernel panic       &lt;br /&gt;好像是在送 CMD18 時候出錯??       &lt;br /&gt;CMD18 是 adtc 類的 command：continuously transfers data blocks from card to host       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; until interrupted by a STOP_TRANSMISSION command.       &lt;br /&gt;      &lt;br /&gt;      &lt;br /&gt;錯誤訊息：       &lt;br /&gt;&lt;code&gt;Unable to handle kernel paging request at virtual address c4000000        &lt;br /&gt;pgd = c3e2c000         &lt;br /&gt;[c4000000] *pgd=00000000         &lt;br /&gt;Internal error: Oops: 805 [#1]         &lt;br /&gt;Modules linked in:         &lt;br /&gt;CPU: 0&amp;#160;&amp;#160;&amp;#160; Not tainted&amp;#160; (2.6.24.3 #166)         &lt;br /&gt;PC is at pio_tasklet+0x2f8/0x61c         &lt;br /&gt;LR is at __init_begin+0x3fff8000/0x34         &lt;br /&gt;pc : [&amp;lt;c01bc870&amp;gt;]&amp;#160;&amp;#160;&amp;#160; lr : [&amp;lt;00000000&amp;gt;]&amp;#160;&amp;#160;&amp;#160; psr: 20000013         &lt;br /&gt;sp : c3cf9ce4&amp;#160; ip : 00000003&amp;#160; fp : c3cf9d04         &lt;br /&gt;r10: c3cf9f0c&amp;#160; r9 : 00000000&amp;#160; r8 : c3cf9f64         &lt;br /&gt;r7 : c02b4460&amp;#160; r6 : 0000000a&amp;#160; r5 : c3c349a0&amp;#160; r4 : c5400040         &lt;br /&gt;r3 : c4000001&amp;#160; r2 : c4000000&amp;#160; r1 : 00000000&amp;#160; r0 : c3e37040         &lt;br /&gt;Flags: nzCv&amp;#160; IRQs on&amp;#160; FIQs on&amp;#160; Mode SVC_32&amp;#160; ISA ARM&amp;#160; Segment kernel         &lt;br /&gt;Control: c000717f&amp;#160; Table: 33e2c000&amp;#160; DAC: 00000017         &lt;br /&gt;Process mmcqd (pid: 799, stack limit = 0xc3cf8258)         &lt;br /&gt;Stack: (0xc3cf9ce4 to 0xc3cfa000)         &lt;br /&gt;9ce0:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c0054788 c3cf9ce8 c0292c60 c02b4484 0000000a c3cf9d1c c3cf9d08         &lt;br /&gt;9d00: c0042ea4 c01bc588 00000001 c02b44c4 c3cf9d3c c3cf9d20 c00429ec c0042e34         &lt;br /&gt;9d20: c02921dc 00000025 c02c048c 00000000 c3cf9d4c c3cf9d40 c0042c10 c00429a0         &lt;br /&gt;9d40: c3cf9d6c c3cf9d50 c0023048 c0042bdc ffffffff f4000000 00200000 c3cf9e18         &lt;br /&gt;9d60: c3cf9dcc c3cf9d70 c0023a84 c0023010 c3c17660 c02b4460 00000020 00000000         &lt;br /&gt;9d80: c02921dc 80000013 00000003 c3cf9e18 c3cf9f64 00000000 c3cf9f0c c3cf9dcc         &lt;br /&gt;9da0: c02b4484 c3cf9db8 c0060e80 c00605d8 60000013 ffffffff c3c349a0 c3cf9f64         &lt;br /&gt;9dc0: c3cf9e00 c3cf9dd0 c01bc55c c0060550 c3cf9ef8 c3c34800 c3c34800 c3c34800         &lt;br /&gt;9de0: 00000000 c3cf9e18 c3da8074 00000000 00000000 c3cf9e14 c3cf9e04 c01bcbd4         &lt;br /&gt;9e00: c01bbfd0 c3cf9ef8 c3cf9e40 c3cf9e18 c01b48b4 c01bcba4 00000000 c3cf9e1c         &lt;br /&gt;9e20: c3cf9e1c c3e12f64 c3cf9ef8 c3cf8000 c3e05e00 c3cf9fb8 c3cf9e44 c01baa40         &lt;br /&gt;9e40: c01b47a8 00000001 c3e12f60 00000000 00000000 00000000 00000000 00000000         &lt;br /&gt;9e60: 00000000 c3cf9e64 c3cf9e64 00000000 00000000 00000000 00000000 00000000         &lt;br /&gt;9e80: 00000000 00000000 00000000 00000000 00000000 c3cf9e94 c3cf9e94 c3cf9e9c         &lt;br /&gt;9ea0: c3cf9e9c 00000000 00000000 00000000 00000000 00000000 00000000 00000000         &lt;br /&gt;9ec0: c02a36d0 00000001 00000000 00000000 00000000 c3cf9f0c c3cf9ee4 c0036fa4         &lt;br /&gt;9ee0: c0104e40 00000001 c02a36d0 c3c17950 c3c79d50 c3da8074 c3cf9f0c c3cf9f64         &lt;br /&gt;9f00: c3cf9f38 c3cf9e18 c01b4780 00000012 00000000 00000000 00000000 00000000         &lt;br /&gt;9f20: 00000000 000000b5 00000000 00000000 c3cf9f64 c3cf9ef8 0000000c 00000000         &lt;br /&gt;9f40: 00000000 00000000 00000000 00000000 0000049d 00000000 00000000 00000000         &lt;br /&gt;9f60: c3cf9ef8 05f5e100 00000000 00000200 00000008 00000000 00000200 00000000         &lt;br /&gt;9f80: c3cf9f38 c3cf9ef8 00000001 c3dd2000 c3e12f6c c3e12f64 c3cf8000 00000000         &lt;br /&gt;9fa0: c3db90ec 00000000 00000000 c3cf9fdc c3cf9fbc c01bb38c c01ba850 fffffffc         &lt;br /&gt;9fc0: c01bb29c 00000000 00000000 00000000 c3cf9ff4 c3cf9fe0 c005151c c01bb2ac         &lt;br /&gt;9fe0: 00000000 00000000 00000000 c3cf9ff8 c0040080 c00514d8 0c104400 fbf5ebbe         &lt;br /&gt;Backtrace:         &lt;br /&gt;[&amp;lt;c01bc578&amp;gt;] (pio_tasklet+0x0/0x61c) from [&amp;lt;c0042ea4&amp;gt;] (tasklet_action+0x80/0xcc)         &lt;br /&gt;r6:0000000a r5:c02b4484 r4:c0292c60         &lt;br /&gt;[&amp;lt;c0042e24&amp;gt;] (tasklet_action+0x0/0xcc) from [&amp;lt;c00429ec&amp;gt;] (__do_softirq+0x5c/0xc8)         &lt;br /&gt;r5:c02b44c4 r4:00000001         &lt;br /&gt;[&amp;lt;c0042990&amp;gt;] (__do_softirq+0x0/0xc8) from [&amp;lt;c0042c10&amp;gt;] (irq_exit+0x44/0x4c)         &lt;br /&gt;r7:00000000 r6:c02c048c r5:00000025 r4:c02921dc         &lt;br /&gt;[&amp;lt;c0042bcc&amp;gt;] (irq_exit+0x0/0x4c) from [&amp;lt;c0023048&amp;gt;] (asm_do_IRQ+0x48/0x5c)         &lt;br /&gt;[&amp;lt;c0023000&amp;gt;] (asm_do_IRQ+0x0/0x5c) from [&amp;lt;c0023a84&amp;gt;] (__irq_svc+0x24/0xa0)         &lt;br /&gt;Exception stack(0xc3cf9d70 to 0xc3cf9db8)         &lt;br /&gt;9d60:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c3c17660 c02b4460 00000020 00000000         &lt;br /&gt;9d80: c02921dc 80000013 00000003 c3cf9e18 c3cf9f64 00000000 c3cf9f0c c3cf9dcc         &lt;br /&gt;9da0: c02b4484 c3cf9db8 c0060e80 c00605d8 60000013 ffffffff         &lt;br /&gt;r7:c3cf9e18 r6:00200000 r5:f4000000 r4:ffffffff         &lt;br /&gt;[&amp;lt;c0060540&amp;gt;] (enable_irq+0x0/0xb0) from [&amp;lt;c01bc55c&amp;gt;] (s3cmci_send_request+0x59c/0x5b8)         &lt;br /&gt;r5:c3cf9f64 r4:c3c349a0         &lt;br /&gt;[&amp;lt;c01bbfc0&amp;gt;] (s3cmci_send_request+0x0/0x5b8) from [&amp;lt;c01bcbd4&amp;gt;] (s3cmci_request+0x40/0x48)         &lt;br /&gt;[&amp;lt;c01bcb94&amp;gt;] (s3cmci_request+0x0/0x48) from [&amp;lt;c01b48b4&amp;gt;] (mmc_wait_for_req+0x11c/0x13c)         &lt;br /&gt;r4:c3cf9ef8         &lt;br /&gt;[&amp;lt;c01b4798&amp;gt;] (mmc_wait_for_req+0x0/0x13c) from [&amp;lt;c01baa40&amp;gt;] (mmc_blk_issue_rq+0x200/0x670)         &lt;br /&gt;r7:c3e05e00 r6:c3cf8000 r5:c3cf9ef8 r4:c3e12f64         &lt;br /&gt;[&amp;lt;c01ba840&amp;gt;] (mmc_blk_issue_rq+0x0/0x670) from [&amp;lt;c01bb38c&amp;gt;] (mmc_queue_thread+0xf0/0x12c)         &lt;br /&gt;[&amp;lt;c01bb29c&amp;gt;] (mmc_queue_thread+0x0/0x12c) from [&amp;lt;c005151c&amp;gt;] (kthread+0x54/0x7c)         &lt;br /&gt;r8:00000000 r7:00000000 r6:00000000 r5:c01bb29c r4:fffffffc         &lt;br /&gt;[&amp;lt;c00514c8&amp;gt;] (kthread+0x0/0x7c) from [&amp;lt;c0040080&amp;gt;] (do_exit+0x0/0x6d0)         &lt;br /&gt;r5:00000000 r4:00000000         &lt;br /&gt;Code: e35c0000 e1a02003 e2833001 e5853068 (e5c21000)         &lt;br /&gt;Kernel panic - not syncing: Fatal exception in interrupt&lt;/code&gt;       &lt;br /&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;用新的 patch 就可以解決所有問題 = =          &lt;br /&gt;詳情請看 color 的 blog&lt;/font&gt;&lt;/strong&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/7357892837569619421-1573337998473999997?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/1573337998473999997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=1573337998473999997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/1573337998473999997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/1573337998473999997'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/mmcsd-driver.html' title='MMC/SD Driver'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-8162404803555291865</id><published>2008-04-19T16:40:00.000+08:00</published><updated>2008-04-22T18:06:52.961+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux driver'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>Touch Screen Driver - 游標抖動</title><content type='html'>現在在使用時游標會一直抖動，在 ts_test 中顯示的座標很不穩定。   &lt;br /&gt;定點不動時，抓到的座標數值會一直變化(大概是 +2 -2 的範圍變化)   &lt;br /&gt;應該是驅動不穩定造成的   &lt;br /&gt;在網路上有找到類似的文章   &lt;br /&gt;  &lt;br /&gt;&lt;code class="ref"&gt;參考資料：    &lt;br /&gt;&lt;a title="http://www.mcublog.com/blog/blog2007/dzzjhjl/archives/2008/26543.html" href="http://www.mcublog.com/blog/blog2007/dzzjhjl/archives/2008/26543.html"&gt;http://www.mcublog.com/blog/blog2007/dzzjhjl/archives/2008/26543.html&lt;/a&gt;&lt;/code&gt;   &lt;br /&gt;  &lt;br /&gt;要把 &lt;strong&gt;&lt;font color="#0000ff"&gt;Pen Filtering&lt;/font&gt;&lt;/strong&gt; 實做出來才能解決這個問題   &lt;br /&gt;好加在 WinCE 裡面有程式碼可以參考   &lt;br /&gt;  &lt;br /&gt; &lt;span id="fullpost"&gt; &lt;mysubtitle&gt;s3c2410_ts 程式碼筆記：&lt;/mysubtitle&gt;   &lt;br /&gt;有設定 GPIO G ，不過把他註解調也可以正常使用，應該是跟 touch screen 沒關係   &lt;br /&gt;好像是針對 2410 的設定，我們是用 2440 所以註解掉也沒差。&amp;#160; &lt;br /&gt;&lt;code&gt;&lt;strike&gt;s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON);      &lt;br /&gt;s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON);       &lt;br /&gt;s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON);       &lt;br /&gt;s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);&lt;/strike&gt; &lt;/code&gt;  &lt;br /&gt;  &lt;br /&gt;當點下或放開會觸發   &lt;br /&gt;static irqreturn_t stylus_updown(int irq, void *dev_id)   &lt;br /&gt;  &lt;br /&gt;當觸控有動作會觸發   &lt;br /&gt;static irqreturn_t stylus_action(int irq, void *dev_id)&amp;#160; &lt;br /&gt;  &lt;br /&gt;回報座標和是否觸控&amp;#160; &lt;br /&gt;input_report_abs(ts.dev, ABS_X, ts.xp);   &lt;br /&gt;input_report_abs(ts.dev, ABS_Y, ts.yp);   &lt;br /&gt;input_report_key(ts.dev, BTN_TOUCH, 1);   &lt;br /&gt;input_report_abs(ts.dev, ABS_PRESSURE, 1);   &lt;br /&gt;  &lt;br /&gt;判斷是點下或是放開動作   &lt;br /&gt;&lt;code&gt;updown = (!(data0 &amp;amp; S3C2410_ADCDAT0_UPDOWN)) &amp;amp;&amp;amp;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (!(data1 &amp;amp; S3C2410_ADCDAT0_UPDOWN));&amp;#160; &lt;/code&gt;  &lt;br /&gt;  &lt;br /&gt;驅動內取樣的頻率定義在 oversampling_shift&amp;#160; &lt;br /&gt;  &lt;br /&gt;原本作法是取樣 (1&amp;lt;&amp;lt;oversampling_shift) 次，   &lt;br /&gt;然後取平均值當作最後抓到的座標。   &lt;br /&gt;  &lt;br /&gt;&lt;mysubtitle&gt;修改 touch screen 驅動&lt;/mysubtitle&gt;   &lt;br /&gt;把 smdk2410_ts_cfg.delay 改成 20000 後 (原本為100)   &lt;br /&gt;游標穩定很多，但是還是會輕微抖動，不過已經比之前好多了。   &lt;br /&gt;應該是之前可能是因為硬體取樣頻率太高，所以會比較不穩定？？   &lt;br /&gt;  &lt;br /&gt;&lt;code class="ps"&gt;附註：ADCDLY 設定為 delay 的值。&amp;#160;&amp;#160; &lt;/code&gt;  &lt;br /&gt;  &lt;br /&gt;現在試著把 Filter 的程式碼加進去，看會不會不要抖 XD   &lt;br /&gt;果然加進去後就不會抖動了，只是滑鼠靈敏度會比較差一點。   &lt;br /&gt;  &lt;br /&gt;主要修改的部份：   &lt;br /&gt;1. 當很短時間內取樣點差異很小時，視為取樣點不動。   &lt;br /&gt;2. 去除不合法的取樣點。   &lt;br /&gt;  &lt;br /&gt;加入一個函式：   &lt;br /&gt;&lt;code&gt;#define TRUE 1    &lt;br /&gt;#define FALSE 0     &lt;br /&gt;#define FILTER_LIMIT 25     &lt;br /&gt;static int touch_pen_filtering(int *px, int *py)     &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int RetVal = TRUE;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// TRUE&amp;#160; : Valid pen sample&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// FALSE : Invalid pen sample&lt;/font&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; static int count = 0;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; static int x[2], y[2];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int TmpX, TmpY;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int dx, dy;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; count++;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if(count &amp;gt; 2) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// apply filtering rule&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; count = 2;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// average between x,y[0] and *px,y&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TmpX = (x[0] + *px) / 2;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TmpY = (y[0] + *py) / 2;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// difference between x,y[1] and TmpX,Y&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dx = (x[1] &amp;gt; TmpX) ? (x[1] - TmpX) : (TmpX - x[1]);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dy = (y[1] &amp;gt; TmpY) ? (y[1] - TmpY) : (TmpY - y[1]);&amp;#160; &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ((dx &amp;gt; FILTER_LIMIT) || (dy &amp;gt; FILTER_LIMIT)) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// Invalid pen sample&lt;/font&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *px = x[1];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *py = y[1];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RetVal = FALSE;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; count = 0;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// Valid pen sample&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x[0] = x[1];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; y[0] = y[1];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x[1] = *px;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; y[1] = *py;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RetVal = TRUE;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } else {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// till 2 samples, no filtering rule&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x[0] = x[1];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; y[0] = y[1];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x[1] = *px;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; y[1] = *py;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// reserve pen samples&lt;/font&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RetVal = FALSE;     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return RetVal;     &lt;br /&gt;}&lt;/code&gt;   &lt;br /&gt;  &lt;br /&gt;修改後的程式碼：   &lt;br /&gt;&lt;code&gt;static irqreturn_t stylus_action(int irq, void *dev_id)    &lt;br /&gt;{&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unsigned long data0;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unsigned long data1;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;static long last_x ,last_y;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; static long sum_x, sum_y;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long dx, dy;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long tmpX, tmpY;&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data0 = readl(base_addr+S3C2410_ADCDAT0);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data1 = readl(base_addr+S3C2410_ADCDAT1);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&lt;strike&gt;ts.xp += data0 &amp;amp; S3C2410_ADCDAT0_XPDATA_MASK;&lt;/strike&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strike&gt;ts.yp += data1 &amp;amp; S3C2410_ADCDAT1_YPDATA_MASK;&lt;/strike&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tmpX = data0 &amp;amp; S3C2410_ADCDAT0_XPDATA_MASK;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tmpY = data1 &amp;amp; S3C2410_ADCDAT1_YPDATA_MASK;       &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ts.count++;     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ts.count &amp;lt; (1&amp;lt;&amp;lt;ts.shift)) {&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;ts.xp += tmpX;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ts.yp += tmpY;&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else {&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;sum_x = ts.xp;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sum_y = ts.yp;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ts.xp &amp;gt;&amp;gt;= ts.shift;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ts.yp &amp;gt;&amp;gt;= ts.shift;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dx = (ts.xp&amp;gt;last_x)?(ts.xp-last_x):(last_x-ts.xp);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dy = (ts.yp&amp;gt;last_y)?(ts.yp-last_y):(last_y-ts.yp);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(dx&amp;gt;10 || dy&amp;gt;10) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; last_x = ts.xp;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; last_y = ts.yp;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ts.xp = last_x;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ts.yp = last_y;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return IRQ_HANDLED;     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;&lt;/code&gt;  &lt;br /&gt;&lt;code&gt;static void touch_timer_fire(unsigned long data)    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(updown) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ts.count != 0) {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;if(touch_pen_filtering(&amp;amp;ts.xp, &amp;amp;ts.yp)) {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; input_report_abs(ts.dev, ABS_X, ts.xp);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; input_report_abs(ts.dev, ABS_Y, ts.yp);       &lt;br /&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; input_report_key(ts.dev, BTN_TOUCH, 1);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; input_report_abs(ts.dev, ABS_PRESSURE, 1);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; input_sync(ts.dev);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....     &lt;br /&gt;}&lt;/code&gt;   &lt;br /&gt;  &lt;br /&gt;&lt;code class="ps"&gt;附註：  &lt;br /&gt;1. 其中程式碼的 &lt;strong&gt;FILTER_LIMIT&lt;/strong&gt; 和 &lt;strong&gt;if(dx&amp;gt;10 || dy&amp;gt;10) {&lt;/strong&gt; 的數值可以修改調整。  &lt;br /&gt;2. 但是我懶得在試了&lt;/code&gt; &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/7357892837569619421-8162404803555291865?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/8162404803555291865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=8162404803555291865' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/8162404803555291865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/8162404803555291865'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/touch-screen-driver_19.html' title='Touch Screen Driver - 游標抖動'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7357892837569619421.post-213129131456912348</id><published>2008-04-17T21:33:00.000+08:00</published><updated>2008-04-21T00:43:56.140+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>Linux Command Line - mtdparts</title><content type='html'>Device Drivers ---&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Memory Technology Device (MTD) support ---&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [*] MTD partitioning support   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [*] Command line partition table parsing   &lt;br /&gt;  &lt;br /&gt;&lt;span id="fullpost"&gt;linux command mtdparts 格式：    &lt;br /&gt;  &lt;code&gt;mtdparts&amp;#160;&amp;#160; = &amp;lt;mtddef&amp;gt;[;&amp;lt;mtddef ]            &lt;br /&gt;&amp;lt;mtddef&amp;gt;&amp;#160; := &amp;lt;mtd-id&amp;gt;:&amp;lt;partdef&amp;gt;[,&amp;lt;partdef&amp;gt;]             &lt;br /&gt;&amp;lt;partdef&amp;gt; := &amp;lt;size&amp;gt;[@offset][&amp;lt;name&amp;gt;][ro]             &lt;br /&gt;&amp;lt;mtd-id&amp;gt;&amp;#160; := unique id used in mapping driver/device             &lt;br /&gt;&amp;lt;size&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; := standard linux memsize OR &amp;quot;-&amp;quot; to denote all             &lt;br /&gt;remaining space             &lt;br /&gt;&amp;lt;name&amp;gt;&amp;#160;&amp;#160;&amp;#160; := (NAME)&lt;/code&gt;    &lt;p&gt;     &lt;br /&gt;但是 s3c2410.c 並沒有把 linux command mtdparts 實做出來。       &lt;br /&gt;難怪怎麼測試都沒反應。       &lt;br /&gt;      &lt;br /&gt;修改 linux/driver/mtd/nand/s3c2410.c：&lt;/p&gt;   &lt;code&gt;#ifdef CONFIG_MTD_PARTITIONS      &lt;br /&gt;      &lt;br /&gt;&lt;font color="#0000ff"&gt;#ifdef CONFIG_MTD_CMDLINE_PARTS&amp;#160; &lt;br /&gt;const char *part_probes[] = { &amp;quot;cmdlinepart&amp;quot;, NULL };         &lt;br /&gt;#endif&lt;/font&gt;       &lt;br /&gt;      &lt;br /&gt;static int s3c2410_nand_add_partition(struct s3c2410_nand_info *info,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct s3c2410_nand_mtd *mtd,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct s3c2410_nand_set *set)       &lt;br /&gt;{       &lt;br /&gt;&lt;font color="#0000ff"&gt;#ifdef CONFIG_MTD_CMDLINE_PARTS&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct mtd_partition *partitions = NULL;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int num_partitions = 0;         &lt;br /&gt;#endif         &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (set == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return add_mtd_device(&amp;amp;mtd-&amp;gt;mtd);       &lt;br /&gt;      &lt;br /&gt;&lt;font color="#0000ff"&gt;#ifdef CONFIG_MTD_CMDLINE_PARTS        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mtd-&amp;gt;mtd.name = &amp;quot;s3c2440_nand&amp;quot;;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; num_partitions = parse_mtd_partitions(&amp;amp;(mtd-&amp;gt;mtd), part_probes, &amp;amp;partitions, 0);        &lt;br /&gt;        &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(num_partitions &amp;gt; 0) {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set-&amp;gt;partitions = partitions;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set-&amp;gt;nr_partitions = num_partitions;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;#endif         &lt;br /&gt;        &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (set-&amp;gt;nr_partitions &amp;gt; 0 &amp;amp;&amp;amp; set-&amp;gt;partitions != NULL) {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return add_mtd_partitions(&amp;amp;mtd-&amp;gt;mtd, set-&amp;gt;partitions, set-&amp;gt;nr_partitions);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return add_mtd_device(&amp;amp;mtd-&amp;gt;mtd);       &lt;br /&gt;}       &lt;br /&gt;      &lt;br /&gt;#else       &lt;br /&gt;........ }&lt;/code&gt;     &lt;br /&gt;    &lt;br /&gt;這樣就可以在 linux command line 裡面把分區傳給 kernel     &lt;br /&gt;使用方法     &lt;br /&gt;mtdparts=s3c2440_nand:&amp;lt;size1&amp;gt;@&amp;lt;offset1&amp;gt;(&amp;lt;name1&amp;gt;),&amp;lt;size2&amp;gt;@&amp;lt;offset2&amp;gt;(&amp;lt;name2&amp;gt;)     &lt;br /&gt;    &lt;br /&gt;其中 &amp;quot;s3c2440_nand&amp;quot; 要跟 mtd-&amp;gt;mtd.name 一樣     &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/7357892837569619421-213129131456912348?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/213129131456912348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=213129131456912348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/213129131456912348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/213129131456912348'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/command-line-partition-table.html' title='Linux Command Line - mtdparts'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-2640095587673314694</id><published>2008-04-15T17:37:00.001+08:00</published><updated>2008-04-20T22:00:48.611+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux driver'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>s3c2440 USB Storage</title><content type='html'>&lt;a href="javascript:Decrypt_text('protect_1', '64PcfAy007X7fklTMjFXUbQ97GjRmXnOtDl+XMvjpMCFbuOT\nKKYxTHCk/f9TiCft4y9/KS7TWaYr+qMvIDyL39wSU4uEf4W8\n2gvYvcAk/IlD9bDPm+eezvoyJEUmdFCO+gVeE8YeHBYXxLFJ\nUkbGnFzogCgdwCVIGsTj7DcQbcJE2Knb7bo3dHG5BAvkU02H\nUqHIqe3+C9fCxsFMG4SARNHYLVTWCMJFY0llJ/WJlWfHX3ra\nlCLT/wkUdIt+fDmQzfZO6VqHcpSLfBW2t2usfeaxj4KrHksl\nfqEkkeOG0aGba/bNF/XgUHxlNEyf6y4wCq0DpSVFeZ39UQph\nGsWduZybNqJJQfW5QeKseFsCW/xtd+C5nE+kst5UqkL/I5Hf\nLb5nxbwl23omvskM90DSxxhDoMMheCiC8AZrWi6u2dK9VcPo\n0lie85StRacytQP6whOCcRUrtdtnCArcp0Z46FZC2t1lGoUz\nCrPiW3/uZWxXYaYJ6B7/FolgggKKq7b0BK6h8EvuGLL0aqff\n/GNXOxntQ7x5k13c4Kk+N7hQJkiUZzwCXINhtqbq8YMQI5zl\nI7SGdFBWnL2Sj2NDRt+PCQApZjLf+NBCxknFHZkHdERirKW0\nu5KjWs96h/piz6HEewpWhWGiQ0gDl1nJl41PviC3k+BEC1Cs\n9xa5MUjolRpn/D9wPOLrhYb1fsXA03e6m+UufkC8drGZ+oUw\nnrF9Yep/b+843rnZuq8xCy07HcSxXsqwTCAxB+Hjq2fLWM44\ndBSSVxEMBJne+2lA/NYp5OnmWsoz2x6eM+c/bYJhTB+nQ2zH\nQQzdh5qqCDJjlJX+oYfgcDOMYdV80Gx7j5MZV6B+Y/4jNSYm\nMya3jTPB7gGkkmgHGpEE0tGUU8xu+0UdhnsqTwLSeB5vlBKC\nMzsIQwcaq6PfCadkOlLEypSHaMS+2eJo+y9slhrlVaRZ6//t\nTSeWu/oJziOMts8/SVfRj/WNKwxnYYYZWiG/I3Qxvjp9eKJQ\nHr7acKtxx/vFEXAkUoxSyGxjsR8L5/0uNZgfYSztUSQnOoh/\n9KeKqXldQEMUtAf1bT10KWOTYhAaYl0YyYU6O0ODaOu6MBCB\naWukMRR4wkttPWds7T/EAQwtjVv/hIauxV7TIk8Mzf1E4v/9\noKn/tEuxg1Hd1EUN/CwCG0lGYCZi8jEWJU8n5j1zPeryMU8n\nyBVnjb7a/5gDhffcWqveP6CuyfpL9qHvEeCPObKQHdOtwwct\n1lXpjtyPtg7Ev5Gpzcw060Fl6iL53Kbgc5QgDqccHtQVwWHi\nWKhHqDIogsuUYKqpMn0NOVZEbIqLoX2IhJl2TpcHmIw5DmSd\n+ltnrheki4idODs2ZncemHz9sc6wiybkQanbfG2Dps7sG25i\nGBWoq5uONSnMPsaVlUuPk0oujhvSjnZKGjMxI7cd7ZGYH997\n4zHDYz7qat2pg/+jHcSodHyvR1nJHnGJqc9N0O+iiWL1qXjd\nreKsybjshIE9SbJEvxy7xRC006fjp0IY0Q6o2T9aAeA+2EwL\nuYTIlKUjm+Dc3YCKChbDt3tPNYmv1tR3ekDh7+a4pMNJByFw\n+95gbjtIrQLwgAUcwzNDYQxstlLa/iq2aiPCLaCNbc8CIE23\nwRsghraVLsD9lgFl9CHyfS11eGpJuNBgnvGfXOfXu9gnPHn+\nbi5rL4IRHOF4rznA/Y1WIpsrYBIrzQmvNKH0cMWTFCUQoOpR\n4T9sa9dtw99mg8Qq/Md2ioKHp1Nb1oFVCXlTcJCObW7bOctJ\nUGR1AIPCDfcV4lFTX1t6QfH2CCuPeLlY8ENE9IAzQ2yw2nnm\nO/ERQ0rJlRkcJsm1X3kSHmWapNJBG5P6L7xhPXycdkJwJ9Um\nwsB82i30030JAnbx60PYYkhGEh4TrfMOH33elx6vW0bX0Cqy\nf58APPsjKCLNC/oUC7MXrk/l9lGA146RBo6kZUAEBlvTRq+X\nDJXpOhbxDcIqqcc7OceArwifDCzCyUrd/e7Bt/qdJAKmwwMH\nkij+LpRcpHY3PvhYTby7NM4EpX+Fv76qlzuqDeGqgZdiwYYX\nlf8psm078WdzSqxn/HdbDgpc5xF4ezwVjE0UCLdxmuqlHAQR\n/bBSPehnnWcDUM+5i88zRV9cVspiQ497TXodlgBhf9ePycQR\nCYQNcu6XA9Uu430AhqSvZwnwDfm7BK3uaRestKCEKdlESZgq\nb07HPKZ83VGSWauCLfukv/OhKVwUgCFjSHKMfkdI7ahwnJyV\nbu67d4gjjY5yy5HYGEL1krqSyHC0fNGhj9pblfXc97ZJ6gfk\ndq3fZXBjpimq/m291pvRQd/n/pelO9iD4Wf0r5dE09Z3roS2\nl4uUPI9dCuPh9+LMrBgB0D1tqRV1nIRFcXYxBW266hDpMZM/\nGHNByEe+5ajtW6I7oJ0+8ZySVJsymu5x1nM8zof9guFxlOYB\ntJ1MbgW8cAFbHr1gXfJmfo8NbiCyxFOaUKLv2AaSfijKUNmo\nRI6jjOHik4JzBIAx97woSaOsn3aG1AzNuXb2dyAEJJGeGhDb\nwNsKtefs0SJzFs9dG9p5iCzsHWfrNiZsp/wix88sqU6Uake6\nPF3LWPLSKhS/u5tkfERnbhIzDOcJc/XG7tIrjfiymOnodcq9\nBu709RFHlMXO7x7UMs+B8EOSEAEszRCnV/jurANzyvwhEHKR\nsCChmgiHB4tGS08v+7g2wd8raSKf1e+dK2r1EbTNpmDFR76B\ny2cYFs0Qwd2wnjFcTesvfiUNuWifsu9Y9JilzjlOG5uZP3Gq\n7otQ3pgbtyS5ScVTkpBNHpcHp7xwn1ullOlh+q6mHjHfgE5m\nuj3REUi+TiNEtPrrjN0Ni3CoxiIJ1/h7qqQZIInOMWX4bj9I\nDYqeIlaozdS6ULyE8H8bJK8+VyG2W/OcuL8eSeZ8rxWhWUHK\nz+kqfzCQ2ax3U6LUE/ri7divcQR368MlZEJ1CQ8dMFuCwXfd\nMjyTToFA/8sPYOh1cnnAjrCq15LfB0aded2s9nxGqzqoO6Gq\nIB1i52mrS8r0Bwc9LgkcjoQ2vHLb+UiBCYvluLn6f0/GiQhr\naSzXHFR4P962vCazhg9LgnnDg9fbrChkXcQ5MZ4kVlba0Xz2\nWH0WBsxuQ7rnjoLuEu93+9Q+OL8RDXUqLdGx5oOzNxST4Btt\nCNBpwEfdTSm7KRcJoqrM7K3BeC/FeLkV5II55RVYX9w6k1F9\nItNb1AOQVLQPDCYnu/zoiV0CJqsjoceVfhxkfMomP56wZRqN\nzY8JHLizNmK5eLlgN4YmhI9LPWZj7vKC20/2XEEuzO/N9WXg\ntbo3XbJBNfGE6gSvEZNQN8Xt9yEpBBb27K0cXM1LE7r/1VdK\n4+HO0Beyr6D/q52JPoAOc7LLoVhpjm5ZfWCJBhcf+BqdCIDF\nU/FRTp95iyXD0LM0D0Q+v1/A3iv6k775QSyCMgSJ52tlQ9+i\naT7nLFDRlJ26nSXPMPIwZLYAbcOpftR6yYDwvQBY0YRsXSjd\nNJ2mAIVYWQ/HHWWKJr/6VfGSf3uwWAU6iHQsMqUD4m7LN245\nAtPUm2pgaM2y0vV/x/F2nDyYnZPTHi9N4IIj94gObU7cFTGN\nLW9+jh3hfcD/DJX3Tw0zVqJJEEBBTNx3gjOa36cGjaBRo0dF\n0qweugjDUy+SWjMt9m3u8rEt8riSeQALF1RmRFR4ICMq9MlK\nilTt20/au2Ypo4tu7kbuEowyZ7SEyl08KgxecMS+3nE8XTmI\nArNNMIVWmUzFXEiLusugfFVgcuOIVs89lWVXRJnPNuP4cDCx\n9try0GfYt0iojQ9FMzpr9E0MLKuMAYGsDmNwQK2eJcB3H5l2\nmDcPPJRxs8Cq/7X3j73Gwza7Sar/1/pFZ3wRgHBwXhDdCy3M\nRv3p09eQjI6krN0nO/ph6RpkVafcAL6zKc7RCMoqikpVqPjD\nwZBtDCXjywXOmcjR/c6zrNGIby1jxhxA11OU/x4bt0xs4KD/\nil/10RRuKOQ5wp/TaQ0owMCWYybkoag9OEm3yc+/R7ywpXJq\nmfb2wn0RKysw65DvgpJeFp0WJBslaXWKTBaGLq6IAqrDPTzL\nBmKcAToExpvbUgMJOFxs4M3sOMx05rMkmyWH3tKZFEwDYUOb\nadR/LcY66Zk/rugFLPqa4236TDNOqkl6/ELCv6c5Ss1bEynx\npFjDmimwm+h3jOXoZSFMSUznNWIB6zzLuZDLdP969RCa9Dsb\na0vGiEHsmOY3/XPtD6klP8fpqDXLxC1j+Ghh0ZvhIW2mU086\nP2npjORuPW2K2hxXDyvCOfVDv+UOc4nhuuylEjhO1cv1V3t7\nFP7pvb7e7uYglv2yRDeRoXgIl/RX0DPaR5WS4fapQ2jaQAXn\npSGSjS2d003MOn5IB7O8LKuq02WI+k5eaSlHEVTLFRFYh/N6\ngp+DPF3UCz3bxnaZtNOf/TtaJAfSu1ZzpZWZwHIR2CyhTAtH\nCrm2Dq+cgPkXvgL+ll/8kvLzpwaIozrz1Ot5t5vF8OpoEWBr\nWfsNJdopm8mZyTvv3oDevcc9iQJ999+/Dxtk5GAlAq253Er1\n0uH4QuKGw9L4Cy6UyeLOGkg063Q6XRvi9Ixp/qbHWdJXBMmy\nIVqV4lgBxTX+ErjlLt2XcsDZwAVe236TyNlO3bOhFE9nCLDL\n9tciSJw1HRqGumMp9GIEJCNsED3hhFQAbAwwBlxzsPxvWait\nDIaAtn1KKSs84oC0Q4r/9EyOoKDT9TO+nDjlEvoASS5uOguU\nEIJjFrOWYZqxjJahMHIaq23NUpz4jnTbxNoBz7Hb6UC/+PK3\nw4Ailo3NcWVNDX96SATpysLPKkpTYfHeTXZS98TjQ64iVsTB\n107JimFaTuwOFQpaV5OcLWAPmsGiOlR4u2lS9HwOJmJBLoY1\nH2+ToZ7FNnv20hvFBlFHvrRO+r0UvDbJEMJzbsNFtXeKJzZX\nH5e/mnqoT758oCz1QacKaHuSNEMzDzwPCxBiqcovrRVAaFbb\ntJUT+coGJbjucDprt+2GMmqpvPCWtOSaW+Gg3s7OLmDk3iPg\nG4XjUkRcEG3zJT8k8gjbgnIIb63WNRJG+nZgSOaGvldX6A67\nvGUnMdr1hLRi/MT0e0eX+AY0uOlHfSeQJ7IuR6ScHmCWwi8Y\nu0S1U44icVaBBWBY7Qqj5+m9DP9N7l1gmWtmNib/cfjRpSHV\nvVWBRe16MxUCcieWjpuzVQWS+BBmGzRRQjdR9UhktCVvAuL0\n020paPvSij9Z5GTUbSoKxpXE/wHM7Zs5rfZdczVQgjm7nqWm\n37kEwxBqPZcaTwARa0qQX01CpvN/b607HO+9ulvfPymXDyb5\nK1cF0j9/L3SikKaUGQ56LZ0eiNODms7Mzp/Cuv5+VoJdyj2Z\nfAKOY1qe9X2GNIpv54mawspkP4Bi1MqA6XQ/Vi/pD+JVSkxi\nyyDnrMbuZG4kiQN/88l+k6d1SCTi/RIcx+0XXLrum7F+uIze\nCQio6dxcKp/mRhDkMsTiKLj2htGWJLF9VkiPMyrJk2Hrbk3d\nwtt2XFjQeZK44QVeezjSjMusJt/0pDm+UtifJAL0gApnaXbA\nelwLESRPmfH+GBf2S7IRR8UryKIE5aSliAOrgAiYZTA8Ouz6\n2xj/nl6xGBrhTiiIWTlStdUI6nqoY4flfMhnk0Aaw6GeNY1O\n8K5uyZ5/NxQ9VxOPqyUYyeiLzYDgvD/BtiY7lmfvvHZjjyQG\nGImiiCzDWCGk3hdiiPRn349qQPMkzsZKDEFRN9z6OYnZwlv1\ntIhaaOFeQLxCW0G8N1yCrUt9QzaLv+mhIlqCAf7kUj4WldZg\nvSStQ5DqJOKXhGTU2g0R3IYbFZLNUAs88F9RlZTLT/zMpoSx\n7Qc2kGvgLiiieSKGdLq0p26OQP5YPvMaFWfupDtPUakrgoe6\n0mT2IgQ5I1mZ5Vr9rJIUSV2C/iHzxpnPRqB2Uka2LHirbFcA\nw6R0tH74uT7ymxSD6mXPXxe/P1KF2ZzNmZn9m7bbJfZAccXO\nqH2o0jrD1jHQExQhzd8U2CRSRBoma/M4FPOIXtAwi6Nbiz3f\nUZjRt92ABUxSMhthF6iK2Ie9r0goLirVbSLeVUIssjW1AtyP\nK4bYJuIgFqZC8EDHZ6pdL6jtKtLPrnnuvhGE48giKZkGToJG\nIDtEZsZl23SVVE1piicLhhsNMqDLZyF8GDwQBd8ENBIIg4Aw\nVd/5FSU3NVKVlTZpZafaZJ+y62X5H+TsJk3hl+f572YkGYUH\nX1qX+QvwHY2MkYi2ZbRLKDe7ba6jOiOUeFtjEyr4ptx0T/ZX\nc3I5TFpAey7UsPj1WiA+uSDUAsSalCMOlvWWAZiKC2lrfpaA\nHTtax/XjG5kMpoLZF2soD8pSWBsaLmf8pKj78c1FWvvreNOC\nN5jLaIo5TKilUx4/oJg256hmgj47acWAypEAU311ibgEHGfW\ngEpIRuGES/lnZIzpfYwz4Llx+X80XLv9wJuV+BSfU/QECVu6\nWR7KNOOtXnL6+qE5/QaaX2g8sG4=&lt;br /&gt;');"&gt;觀看保護內容&lt;/a&gt;  &lt;div id="protect_1"&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7357892837569619421-2640095587673314694?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/2640095587673314694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=2640095587673314694' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/2640095587673314694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/2640095587673314694'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/s3c2440-usb.html' title='s3c2440 USB Storage'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-4279321070414400910</id><published>2008-04-11T15:17:00.000+08:00</published><updated>2008-04-12T16:12:38.867+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='研究生活'/><title type='text'>胖子禁3G海報</title><content type='html'>&lt;p&gt;胖子昨天在實驗室用 3G 跟他的啾講得很甜蜜    &lt;br /&gt;於是阿鋒跟阿華做一張海報送給胖子 &lt;br/&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;a href="http://lh6.ggpht.com/top12345tw/R_8Q1bddVzI/AAAAAAAAANw/7uPV5z4YpxU/DSC00298%5B5%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="432" alt="DSC00298" src="http://lh6.ggpht.com/top12345tw/R_8Q2bddV0I/AAAAAAAAAN4/bfKxHdgE39U/DSC00298_thumb%5B3%5D.jpg" width="332" border="0" /&gt;&lt;/a&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/7357892837569619421-4279321070414400910?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/4279321070414400910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=4279321070414400910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/4279321070414400910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/4279321070414400910'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/3g.html' title='胖子禁3G海報'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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://lh6.ggpht.com/top12345tw/R_8Q2bddV0I/AAAAAAAAAN4/bfKxHdgE39U/s72-c/DSC00298_thumb%5B3%5D.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7357892837569619421.post-8728952712922665555</id><published>2008-04-10T19:22:00.000+08:00</published><updated>2008-04-21T15:04:37.572+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux driver'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>Touch Screen Driver 筆記</title><content type='html'>&lt;p&gt;2.6.24.3 沒有將 s3c2440 / s3c2410 的 touch screen driver 實做出來。    &lt;br /&gt;所以我們必須自己加進去。     &lt;br /&gt;可以去網路上抓別人做好的 patch：     &lt;br /&gt;&lt;code class="ref"&gt;&lt;a title="http://svnweb.openmoko.org/branches/src/target/kernel/2.6.24.x/patches/s3c2410_touchscreen.patch?rev=3654&amp;amp;view=markup" href="http://svnweb.openmoko.org/branches/src/target/kernel/2.6.24.x/patches/s3c2410_touchscreen.patch?rev=3654&amp;amp;view=markup"&gt;s3c2410 Touch Screen&lt;/a&gt;&lt;/code&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;span id="fullpost"&gt;這個 patch 是針對 mach-h1940      &lt;br /&gt;所以還要自己加些程式碼到 mach-s3c2440/mach-smdk2440.c       &lt;br /&gt;      &lt;br /&gt;linux/arch/arm/mach-s3c2440/mach-smdk2440.c       &lt;br /&gt;&lt;code&gt;static struct s3c2410_ts_mach_info smdk2410_ts_cfg __initdata = {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .delay = 100,         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .presc = 49,         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .oversampling_shift = 2,         &lt;br /&gt;};         &lt;br /&gt;        &lt;br /&gt;static void __init smdk2440_map_io(void)         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ......         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set_s3c2410ts_info(&amp;amp;smdk2410_ts_cfg);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ......         &lt;br /&gt;}         &lt;br /&gt;        &lt;br /&gt;static struct platform_device *smdk2440_devices[] __initdata = {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ......         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;s3c_device_ts,         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ......         &lt;br /&gt;}; &lt;/code&gt;      &lt;br /&gt;在 make menuconfig 要選上：       &lt;br /&gt;Device Driver ---&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Input device support ---&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;*&amp;gt; Event interface       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [* ] Touchscreens ---&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;*&amp;gt; Samsung S3C2410 touchscreen input driver       &lt;br /&gt;      &lt;br /&gt;編譯完成後，進入 kernel 應該會出現 /dev/event0 和 /dev/mouse0&amp;#160; &lt;br /&gt;      &lt;br /&gt;不過座標校正後，游標還是會輕微抖動。       &lt;br /&gt;      &lt;br /&gt;&lt;code class="ps"&gt;-*附註*-        &lt;br /&gt;1. 之前一直是不成功。幹！結果是自己耍白痴加錯檔案，加到 mach-smdk2410.c 中。         &lt;br /&gt;2. 記得要選上 Event interface。(tslib 不認得 mouse0 只能認得 event0??)&lt;/code&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;strong&gt;程式碼分析：&lt;/strong&gt;       &lt;br /&gt;      &lt;br /&gt;向系統註冊 ADC IRQ 處理函式       &lt;br /&gt;request_irq (IRQ_ADC, stylus_action, IRQF_SAMPLE_RANDOM, &amp;quot;s3c2410_action&amp;quot;,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ts.dev);       &lt;br /&gt;      &lt;br /&gt;向系統註冊 TC IRQ 處理函式       &lt;br /&gt;request_irq (IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM, &amp;quot;s3c2410_action&amp;quot;,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ts.dev); &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/7357892837569619421-8728952712922665555?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/8728952712922665555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=8728952712922665555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/8728952712922665555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/8728952712922665555'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/touch-screen-driver.html' title='Touch Screen Driver 筆記'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-5191112492801041955</id><published>2008-04-09T00:45:00.001+08:00</published><updated>2008-05-20T15:46:21.312+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qtopia'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>QTopia - Touch Panel</title><content type='html'>&lt;p&gt;讓 QTopia 能使用觸控螢幕必須將 tslib 連結到 QTopia 裡面。    &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;編譯 tslib：&lt;/strong&gt;     &lt;br /&gt;可以在 &lt;a title="http://tslib.berlios.de/" href="http://tslib.berlios.de/"&gt;http://tslib.berlios.de/&lt;/a&gt; 取得 tslib-1.0.tar.bz2     &lt;br /&gt;解壓縮後進入資料夾內     &lt;br /&gt;執行 autogen.sh (需要安裝 automake libtool) 後會產生 configure     &lt;br /&gt;設定 configure：     &lt;br /&gt;./configure --prefix=$PWD/_install CC=arm-linux-gcc --host=arm-linux ac_cv_func_malloc_0_nonnull=yes     &lt;br /&gt;    &lt;br /&gt;執行完後就可以開始編譯了     &lt;br /&gt;make     &lt;br /&gt;make install     &lt;br /&gt;    &lt;br /&gt;編譯完後會將檔案放在 --prefix 設定的資料夾內     &lt;br /&gt;把檔案複製到 filesystem 底下     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;設定 tslib 環境變數：      &lt;br /&gt;&lt;/strong&gt;export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib     &lt;br /&gt;export TSLIB_TSDEVICE=/dev/ts     &lt;br /&gt;export TSLIB_CALIBFILE=/etc/pointercal     &lt;br /&gt;export TSLIB_CONFFILE=/etc/ts.conf     &lt;br /&gt;export TSLIB_PLUGINDIR= lo /lib/ts     &lt;br /&gt;export TSLIB_FBDEVICE=/dev/fb0     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;把 tslib 加入到 QTopia：&lt;/strong&gt;     &lt;br /&gt;在 QTopia 資料夾底下     &lt;br /&gt;./configure -v -little-endian -embedded arm -depths 16 -L (tslib安裝目錄)/lib -I (tslib安裝目錄)/include     &lt;br /&gt;    &lt;br /&gt;設定環境變數     &lt;br /&gt;export QWS_MOUSE_PROTO=&amp;quot;tslib:/dev/ts&amp;quot;     &lt;br /&gt;    &lt;br /&gt;在執行 QTopia 的範例應該就可以用 touch panel&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7357892837569619421-5191112492801041955?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/5191112492801041955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=5191112492801041955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/5191112492801041955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/5191112492801041955'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/qtopia-touch-panel.html' title='QTopia - Touch Panel'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-4214328771361124300</id><published>2008-04-08T13:22:00.000+08:00</published><updated>2008-04-19T16:33:46.218+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qtopia'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>tslib - 編譯</title><content type='html'>&lt;p&gt;tslib 版本：tslib release 1.0 (好像跟 tslib-1.4 一樣??)   &lt;br /&gt;cross compiler：3.4.1 arm-linux-gcc     &lt;br /&gt;    &lt;br /&gt;&lt;span id="fullpost"&gt;執行 autogen.sh (需要安裝 automake libtool)      &lt;br /&gt;會產生 configure 檔案       &lt;br /&gt;      &lt;br /&gt;./configure --prefix=$PWD/_install CC=arm-linux-gcc --host=arm-linux ac_cv_func_malloc_0_nonnull=yes       &lt;br /&gt;      &lt;br /&gt;設定完後就可以編譯了       &lt;br /&gt;      &lt;br /&gt;make       &lt;br /&gt;make install       &lt;br /&gt;      &lt;br /&gt;會將產生出來的檔案放在 --prefix 指定的資料夾內       &lt;br /&gt;      &lt;br /&gt;&lt;strong&gt;需要的 library:       &lt;br /&gt;&lt;/strong&gt;在 /usr/local/arm/3.4.1/arm-linux/lib 底下      &lt;br /&gt;libdl-2.3.2.so      &lt;br /&gt;libdl.*      &lt;br /&gt;      &lt;br /&gt;&lt;strong&gt;設定 tslib 環境變數：&lt;/strong&gt;       &lt;br /&gt;export TSLIB_TSDEVICE=/dev/event0       &lt;br /&gt;export TSLIB_CALIBFILE=/etc/pointercal       &lt;br /&gt;export TSLIB_CONFFILE=/etc/ts.conf       &lt;br /&gt;export TSLIB_PLUGINDIR=/lib/ts       &lt;br /&gt;export TSLIB_FBDEVICE=/dev/fb0       &lt;br /&gt;export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib       &lt;br /&gt;      &lt;br /&gt;&lt;strong&gt;設定 ts.conf：        &lt;br /&gt;&lt;/strong&gt;把 module_raw 設定成 input       &lt;br /&gt;&lt;font color="#0000ff"&gt;module_raw input       &lt;br /&gt;&lt;/font&gt;      &lt;br /&gt;接下來只要執行 bin 底下的 ts_calibrate 就會出現校正畫面       &lt;br /&gt;校正完畢後會產生 pointercal       &lt;br /&gt;      &lt;br /&gt;執行 ts_test 會有測試畫面       &lt;br /&gt;      &lt;br /&gt;**附註**       &lt;br /&gt;1. 記得 TSLIB_TSDEVICE 要設定成 /dev/event0 不要設定成 /dev/mouse0       &lt;br /&gt;2. 環境變數要對應放在 filesystem 的位置&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/7357892837569619421-4214328771361124300?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/4214328771361124300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=4214328771361124300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/4214328771361124300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/4214328771361124300'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/tslib.html' title='tslib - 編譯'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-6649676447028126649</id><published>2008-04-06T17:15:00.000+08:00</published><updated>2008-04-12T17:18:41.708+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qtopia'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>QTopia Core - 編譯</title><content type='html'>&lt;strong&gt;編譯環境：&lt;/strong&gt;   &lt;br /&gt;cross compiler：arm-linux-gcc 3.4.1   &lt;br /&gt;使用的版本：qtopia-core-opensource-src-4.3.3   &lt;br /&gt;  &lt;br /&gt;&lt;span id="fullpost"&gt;&lt;strong&gt;前置工作：&lt;/strong&gt;     &lt;br /&gt;修改 mkspecs/qws/linux-arm-g++/qmake.conf     &lt;br /&gt;將 cross compiler 改成 arm-linux     &lt;table style="border-right: black 0px solid; border-top: black 0px solid; background-image: none; border-left: black 0px solid; width: 100%; border-bottom: black 0px solid; height: 100px; background-color: white; text-align: left" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;........            &lt;br /&gt;            &lt;br /&gt;QMAKE_CC&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = arm-linux-gcc             &lt;br /&gt;            &lt;br /&gt;.......             &lt;br /&gt;            &lt;br /&gt;QMAKE_CXX&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = arm-linux-g++             &lt;br /&gt;            &lt;br /&gt;........             &lt;br /&gt;            &lt;br /&gt;            &lt;p&gt;QMAKE_LINK&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = arm-linux-g++              &lt;br /&gt;QMAKE_LINK_SHLIB&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = arm-linux-g++               &lt;br /&gt;              &lt;br /&gt;........               &lt;br /&gt;              &lt;br /&gt;QMAKE_AR&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = arm-linux-ar cqs               &lt;br /&gt;QMAKE_RANLIB&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = arm-linux-ranlib               &lt;br /&gt;              &lt;br /&gt;........               &lt;br /&gt;              &lt;br /&gt;QMAKE_STRIP&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = arm-linux-strip               &lt;br /&gt;              &lt;br /&gt;........&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;     &lt;br /&gt;&lt;strong&gt;開始編譯：        &lt;br /&gt;&lt;/strong&gt;./configure -v -little-endian -embedded arm -depths 16       &lt;br /&gt;make       &lt;br /&gt;make install       &lt;br /&gt;      &lt;br /&gt;會將編譯出來的資料會放在       &lt;br /&gt;/usr/local/Trolltech/QtopiaCore-4.3.3-arm       &lt;br /&gt;把他複製到 Filesystem 底下吧       &lt;br /&gt;還要複製動態連結檔 (*.so) 到 lib 底下       &lt;br /&gt;已經忘記要複製哪些了，有空再補齊吧！       &lt;br /&gt;      &lt;br /&gt;&lt;strong&gt;設定環境：        &lt;br /&gt;&lt;/strong&gt;設定環境變數如下：&lt;/p&gt;    &lt;table style="border-right: black 0px solid; border-top: black 0px solid; background-image: none; border-left: black 0px solid; width: 100%; border-bottom: black 0px solid; height: 100px; background-color: white; text-align: left" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;export HOME=/root              &lt;br /&gt;export QTDIR=/usr/local/Trolltech/QtopiaCore-4.3.3-arm               &lt;br /&gt;export QPEDIR=/usr/local/Trolletch/QtopiaCore-4.3.3-arm               &lt;br /&gt;export KDEDIR=/opt/kde&amp;#160; &lt;br /&gt;export PATH=$QPEDIR/bin:$PATH               &lt;br /&gt;export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;設定好後就可以執行      &lt;br /&gt;/usr/local/Trolltech/QtopiaCore-4.3.3-arm/example 底下的執行檔       &lt;br /&gt;記得要加 -qws 選項       &lt;br /&gt;      &lt;br /&gt;字型太小問題       &lt;br /&gt;QWS_DISPLAY=&amp;quot;LinuxFb:mmWidth85&amp;quot;       &lt;br /&gt;      &lt;br /&gt;** 附註 **       &lt;br /&gt;1. make install 需要 root 的權限       &lt;br /&gt;2. 執行範例時要加 -qws 選項&lt;/p&gt; &lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7357892837569619421-6649676447028126649?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/6649676447028126649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=6649676447028126649' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/6649676447028126649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/6649676447028126649'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/lcd-qtopia.html' title='QTopia Core - 編譯'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-4164041398839794365</id><published>2008-04-03T16:06:00.000+08:00</published><updated>2008-05-05T15:32:14.846+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux driver'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>LCD Driver 筆記</title><content type='html'>要讓 s3c2440 LCD 正常顯示要修改 LCD 相關暫存器的設定，設定部份都是參考 Eboot 的設定。   &lt;br /&gt;至於為甚麼要這樣設定，我也不是很清楚。   &lt;br /&gt;&lt;span id="fullpost"&gt;   &lt;br /&gt;&lt;strong&gt;修改 LCD driver info：&lt;/strong&gt;     &lt;br /&gt;linux/arch/arm/mach-s3c2440/mach-smdk2440.c     &lt;br /&gt;    &lt;br /&gt;&lt;code&gt;&lt;font color="#008000"&gt;/* LCD driver info */        &lt;br /&gt;&lt;/font&gt;static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .lcdcon5&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = S3C2410_LCDCON5_FRM565 |       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; S3C2410_LCDCON5_INVVLINE |       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; S3C2410_LCDCON5_INVVFRAME |       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; S3C2410_LCDCON5_PWREN |       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; S3C2410_LCDCON5_HWSWP |       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&lt;strong&gt;S3C2410_LCDCON5_INVVDEN&lt;/strong&gt;&lt;/font&gt; |&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&lt;strong&gt;S3C2410_LCDCON5_INVVCLK&lt;/strong&gt;&lt;/font&gt;,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .type&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = S3C2410_LCDCON1_TFT,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .width&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 240,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .height&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 320,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .pixclock&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 166667, &lt;font color="#008000"&gt;/* HCLK 60 MHz, divisor 10 */&lt;/font&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .xres&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 240,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .yres&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 320,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .bpp&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 16,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;font color="#0000ff"&gt;&lt;strong&gt;left_margin&amp;#160;&amp;#160;&amp;#160; = 8&lt;/strong&gt;&lt;/font&gt;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;font color="#0000ff"&gt;&lt;strong&gt;right_margin&amp;#160;&amp;#160; = 4&lt;/strong&gt;&lt;/font&gt;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .hsync_len&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 4,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;font color="#0000ff"&gt;&lt;strong&gt;upper_margin&amp;#160;&amp;#160; = 6&lt;/strong&gt;&lt;/font&gt;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;font color="#0000ff"&gt;&lt;strong&gt;lower_margin&amp;#160;&amp;#160; = 8&lt;/strong&gt;&lt;/font&gt;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;font color="#0000ff"&gt;&lt;strong&gt;vsync_len&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 2&lt;/strong&gt;&lt;/font&gt;,       &lt;br /&gt;};       &lt;br /&gt;      &lt;br /&gt;      &lt;br /&gt;static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .displays&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = &amp;amp;smdk2440_lcd_cfg,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .num_displays&amp;#160;&amp;#160; = 1,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .default_display = 0,&amp;#160;&amp;#160; &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&lt;font color="#0000ff"&gt;.gpccon&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 0xaa8096a9,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .gpccon_mask&amp;#160;&amp;#160;&amp;#160; = 0xffc0ffff,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .gpcup&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = (0x1f&amp;lt;&amp;lt;11) | (0xff&amp;lt;&amp;lt;0),&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .gpcup_mask&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 0x00000000,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .gpdcon&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 0xaa80aaa0,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .gpdcon_mask&amp;#160;&amp;#160;&amp;#160; = 0xffc0fff0,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .gpdup&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = (0x1f&amp;lt;&amp;lt;11) | (0x3f&amp;lt;&amp;lt;2),&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .gpdup_mask&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 0x00000000,&amp;#160;&amp;#160; &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .lpcsel&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 0xc0c,           &lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;}; &lt;/code&gt;    &lt;p&gt;將 LCD 暫存去設定改成上面的值，畫面就可以正常顯示。      &lt;br /&gt;      &lt;br /&gt;&lt;code class="ps"&gt;*ps: lpcsel 就是 TCONSEL&lt;/code&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;strong&gt;現在遇到的問題：        &lt;br /&gt;&lt;/strong&gt;S3C2440 LCD 設定必須使用 SPI0 ，而 kernel 的 LCD Driver 並沒有實做出來。       &lt;br /&gt;也就是說現在透過 SPI0 設定 LCD 的部份，是由 vivi 完成的。       &lt;br /&gt;如果說 vivi 沒有初始化 LCD，則進入 kernel 後 LCD 也不會正常顯示。       &lt;br /&gt;所以必須在 kernel LCD driver 加入 spi0 的設定，讓 kernel 不用透過 vivi 也能讓 LCD 正常顯示。       &lt;br /&gt;      &lt;br /&gt;&lt;strong&gt;S3c2440 SPI0 相關 GPIO 腳位： &lt;/strong&gt;&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;GPE11 ---&amp;gt; SPIMISO0 &lt;/li&gt;      &lt;li&gt;GPE12 ---&amp;gt; SPIMOSI0 &lt;/li&gt;      &lt;li&gt;GPE13 ---&amp;gt; SPICLK0 &lt;/li&gt;      &lt;li&gt;GPC5 ----&amp;gt; OUTPUT ?? &lt;/li&gt;      &lt;li&gt;GPC6 ----&amp;gt; OUTPUT ?? &lt;/li&gt;   &lt;/ul&gt; &lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7357892837569619421-4164041398839794365?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/4164041398839794365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=4164041398839794365' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/4164041398839794365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/4164041398839794365'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/lcd-driver-spi0.html' title='LCD Driver 筆記'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-4139685454187184764</id><published>2008-04-02T19:27:00.000+08:00</published><updated>2008-04-17T15:22:47.676+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux driver'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>LCD Driver 筆記 - Frame Buffer</title><content type='html'>&lt;span class="postbody"&gt;&lt;span style="font-weight: bold; font-size: 100%"&gt;什麼是framebuffer 設備：&lt;/span&gt;     &lt;br /&gt;framebuffer 是一種能夠提取圖形的硬件設備，是用戶進入圖形界面很好的接口。     &lt;br /&gt;有了framebuffer，用戶的應用程序不需要對底層的驅動的深入瞭解就能夠做出很好的圖形。     &lt;br /&gt;對於用戶而言，它和 /dev 下面的其他設備沒有什麼區別，用戶可以把 framebuffer 看成一塊內存，既可以向這塊內存中寫入數據，也可以從這塊內存中讀取數據。     &lt;br /&gt;第一個被註冊的 framebuffer 的 minor 等於0，第二個被註冊的 framebuffer的minor 等於 1，以此類推。其 major 都為 29。&lt;/span&gt;   &lt;br /&gt;&lt;span class="postbody"&gt;   &lt;br /&gt;&lt;span style="font-weight: bold; font-size: 100%"&gt;framebuffer 內部結構說明：&lt;/span&gt;     &lt;br /&gt;相關檔案：     &lt;br /&gt;linux/include/linux/fb.h     &lt;br /&gt;linux/drivers/video/fbmem.c     &lt;br /&gt;&lt;/span&gt; &lt;span id="fullpost"&gt; &lt;span class="postbody"&gt;   &lt;br /&gt;&lt;/span&gt;&lt;span id="zoom"&gt;fb_var_screeninfo 是用來描述圖形卡的特性的。通常是被用戶設置的。&lt;/span&gt;   &lt;br /&gt;  &lt;table style="border-right: black 0px solid; border-top: black 0px solid; background-image: none; border-left: black 0px solid; width: 100%; border-bottom: black 0px solid; height: 100px; background-color: white; text-align: left" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;&lt;span id="zoom"&gt;struct fb_var_screeninfo              &lt;br /&gt;{               &lt;br /&gt;&lt;/span&gt;&lt;span id="zoom"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 xres;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span id="zoom"&gt;&lt;span style="color: rgb(0,153,0)"&gt;/* visible resolution */ &lt;/span&gt;&lt;/span&gt;&lt;span id="zoom"&gt;&lt;span style="color: rgb(255,0,0)"&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 yres; &lt;/span&gt;            &lt;br /&gt;&lt;span id="zoom"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 xres_virtual;&amp;#160; &lt;/span&gt;&lt;span id="zoom"&gt;&lt;span style="color: rgb(0,153,0)"&gt;/* virtual resolution */&lt;/span&gt;&amp;#160;&lt;/span&gt;&lt;span id="zoom"&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 yres_virtual;               &lt;br /&gt;&lt;/span&gt;&lt;span id="zoom"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 xoffset;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span id="zoom"&gt;&lt;span style="color: rgb(0,153,0)"&gt;/* offset from virtual to visible resolution &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;&lt;span style="color: rgb(0,153,0)"&gt;可視區域的偏移 */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="zoom"&gt;&amp;#160;&lt;/span&gt;&lt;span id="zoom"&gt;&amp;#160;&lt;span style="color: rgb(255,0,0)"&gt;&lt;span style="color: rgb(0,153,0)"&gt;&lt;/span&gt;                 &lt;br /&gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 yoffset;&lt;/span&gt;             &lt;br /&gt;            &lt;br /&gt;&lt;span id="zoom"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 bits_per_pixel;&lt;span style="color: rgb(0,153,0)"&gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span id="zoom"&gt;&lt;span style="color: rgb(0,153,0)"&gt;/* &lt;/span&gt;&lt;span style="color: rgb(0,153,0)"&gt;每一像素的bit數 */&lt;/span&gt;&lt;/span&gt; &lt;span id="zoom"&gt;             &lt;br /&gt;&lt;/span&gt;&lt;span id="zoom"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 grayscale;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span id="zoom"&gt;&lt;span style="color: rgb(0,153,0)"&gt;/* != 0 Gray levels instead of colors &lt;/span&gt;&lt;span style="color: rgb(0,153,0)"&gt;等於零就成黑白 &lt;/span&gt;&lt;/span&gt;&lt;span id="zoom" style="color: rgb(0,153,0)"&gt;*/&lt;/span&gt;&lt;span id="zoom"&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span id="zoom"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_bitfield red;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* bitfield in fb mem if true color, */&lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_bitfield green;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* else only length is significant */&lt;/span&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_bitfield blue;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_bitfield transp; &lt;span style="color: rgb(0,153,0)"&gt;/* transparency &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;&lt;span style="color: rgb(0,153,0)"&gt;透明 */&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="zoom"&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 nonstd;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* != 0 Non standard pixel format 非零&lt;/span&gt;&lt;/span&gt;&lt;span id="zoom" style="color: rgb(0,153,0)"&gt;不是標準格式&lt;/span&gt;&lt;span id="zoom"&gt;&lt;span style="color: rgb(0,153,0)"&gt; */&lt;/span&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span id="zoom"&gt;__u32 activate;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* see FB_ACTIVATE_* */&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span id="zoom"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 height;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* height of picture in mm &lt;/span&gt;&lt;span style="color: rgb(0,153,0)"&gt;內存中的圖像高度 &lt;/span&gt;&lt;/span&gt;&lt;span id="zoom" style="color: rgb(0,153,0)"&gt;*/&lt;/span&gt;&lt;span id="zoom"&gt;              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 width;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* width of picture in mm &lt;/span&gt;&lt;span style="color: rgb(0,153,0)"&gt;內存中的圖像寬度 &lt;/span&gt;&lt;/span&gt;&lt;span id="zoom" style="color: rgb(0,153,0)"&gt;*/              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span id="zoom"&gt;__u32 accel_flags; &lt;span style="color: rgb(0,153,0)"&gt;/* acceleration flags (hints) &lt;/span&gt;&lt;span style="color: rgb(0,153,0)"&gt;加速標誌 &lt;/span&gt;&lt;/span&gt;&lt;span id="zoom" style="color: rgb(0,153,0)"&gt;*/&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span id="zoom"&gt;&lt;span style="color: rgb(0,153,0)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* Timing: All values in pixclocks, except pixclock (of course) */&lt;/span&gt;               &lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* 這些部分就是顯示器的顯示方法了，可以找相關的資料看看 */&lt;/span&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 pixclock;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* pixel clock in ps (pico seconds) */&lt;/span&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 left_margin;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* time from sync to picture */&lt;/span&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 right_margin;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* time from picture to sync */&lt;/span&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 upper_margin; &lt;span style="color: rgb(0,153,0)"&gt;/* time from sync to picture */&lt;/span&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 lower_margin;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 hsync_len;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* length of horizontal sync &lt;/span&gt;&lt;span style="color: rgb(0,153,0)"&gt;水平可視區域 &lt;/span&gt;&lt;/span&gt;&lt;span id="zoom" style="color: rgb(0,153,0)"&gt;*/&lt;/span&gt;&lt;span id="zoom"&gt;              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 vsync_len;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* length of vertical sync &lt;/span&gt;&lt;span style="color: rgb(0,153,0)"&gt;垂直可視區域 &lt;/span&gt;&lt;/span&gt;&lt;span id="zoom" style="color: rgb(0,153,0)"&gt;*/&lt;/span&gt;             &lt;br /&gt;&lt;span id="zoom"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 sync;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* see FB_SYNC_* */&lt;/span&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 vmode;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* see FB_VMODE_* */&lt;/span&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 reserved[6];&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,153,0)"&gt;/* Reserved for future compatibility&lt;/span&gt;&lt;span style="color: rgb(0,153,0)"&gt; 備用－以後開發 &lt;/span&gt;&lt;/span&gt;&lt;span id="zoom" style="color: rgb(0,153,0)"&gt;*/&lt;/span&gt;&lt;span id="zoom"&gt;              &lt;br /&gt;};&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;br /&gt;fb_fix_screeninfo 定義了圖形卡的硬件特性，是不能改變的，用戶選定了哪一個圖形卡，那麼它的硬件特性也就定下來了。&lt;span style="font-size: 100%"&gt;&lt;/span&gt;   &lt;br /&gt;  &lt;table style="border-right: black 0px solid; border-top: black 0px solid; background-image: none; border-left: black 0px solid; width: 100%; border-bottom: black 0px solid; height: 100px; background-color: white; text-align: left" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;struct fb_fix_screeninfo            &lt;br /&gt;{             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char id[16];&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* identification string eg &amp;quot;TT Builtin&amp;quot; */              &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unsigned long smem_start; &lt;font color="#008000"&gt;/* Start of frame buffer mem 內存起始*/              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* (physical address) 物理地址 */&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 smem_len;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Length of frame buffer mem 內存大小 */              &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 type;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* see FB_TYPE_* */&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 type_aux;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Interleave for interleaved Planes 插入區域？ */&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 visual;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* see FB_VISUAL_* */&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u16 xpanstep;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* zero if no hardware panning 沒有硬件設備就為零 */&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u16 ypanstep;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* zero if no hardware panning */&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u16 ywrapstep;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* zero if no hardware ywrap */&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 line_length;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* length of a line in bytes 一行的字節表示 */              &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unsigned long mmio_start; &lt;font color="#008000"&gt;/* Start of Memory Mapped I/O 內存映射的I/O起始 */&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* (physical address) */&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 mmio_len;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Length of Memory Mapped I/O I/O的大小 */&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 accel;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Type of acceleration available 可用的加速類型 */              &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u16 reserved[3];&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Reserved for future compatibility */&lt;/font&gt;             &lt;br /&gt;};&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;br /&gt;fb_cmap&lt;span class="postbody"&gt; 描述設備無關的顏色映射信息。可以通過 &lt;font color="#0000ff"&gt;FBIOGETCMAP&lt;/font&gt; 和 &lt;font color="#0000ff"&gt;FBIOPUTCMAP&lt;/font&gt; 對應的 ioctl操作設定或獲取顏色映射信息。     &lt;br /&gt;    &lt;table style="border-right: black 0px solid; border-top: black 0px solid; background-image: none; border-left: black 0px solid; width: 100%; border-bottom: black 0px solid; height: 100px; background-color: white; text-align: left" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;struct fb_cmap              &lt;br /&gt;{               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 start;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* First entry 第一個入口 */&lt;/font&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u32 len;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Number of entries 入口的數字 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u16 *red;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Red values 紅 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u16 *green;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u16 *blue;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __u16 *transp;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* transparency, can be NULL 透明，可以為零 */&lt;/font&gt;               &lt;br /&gt;};&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;br /&gt;fb_info 定義了當前圖形卡 framebuffer 設備的獨立狀態，一個圖形卡可能有兩個 framebuffer， 在這種情況下，就需要兩個 fb_info 結構。這個結構是唯一在內核空間可見的。     &lt;br /&gt;    &lt;table style="border-right: black 0px solid; border-top: black 0px solid; background-image: none; border-left: black 0px solid; width: 100%; border-bottom: black 0px solid; height: 100px; background-color: white; text-align: left" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;struct fb_info {              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char modename[40];&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* default video mode 默認的視頻卡類型 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; kdev_t node;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int flags;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int open;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Has this been open already? */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #define FBINFO_FLAG_MODULE 1&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Low-level driver is a module */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_var_screeninfo var;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Current var 現在的視頻信息 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_fix_screeninfo fix;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Current fix 修正的信息 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_monspecs monspecs;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Current Monitor specs 現在的顯示器模式 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_cmap cmap;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Current cmap 當前優先級 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_ops *fbops;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char *screen_base;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Virtual address 物理基址 */                &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct display *disp;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* initial display variable 初始化 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct vc_data *display_fg;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Console visible on this display */&lt;/font&gt;               &lt;br /&gt;              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char fontname[40];&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* default font name 默認的字體 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; devfs_handle_t devfs_handle;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Devfs handle for new name */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; devfs_handle_t devfs_lhandle;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Devfs handle for compat. symlink 兼容 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*changevar)(int);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* tell console var has changed 告訴                &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; console 變量修改了 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*switch_con)(int, struct fb_info*);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* tell fb to switch consoles 告訴 fb&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 選擇consoles */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*updatevar)(int, struct fb_info*);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* tell fb to update the vars 告訴 fb 更新變量 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void (*blank)(int, struct fb_info*);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* tell fb to (un)blank the screen 告訴 fb                &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 使用黑白模式（或者不黑）                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; arg = 0: unblank 黑白模式                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; arg &amp;gt; 0: VESA level (arg-1)&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 選擇VESA模式 */                 &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void *pseudo_palette;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* Fake palette of 16 colors and the cursor's                &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; color for nonpalette mode 修正調色板 */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* From here on everything is device dependent */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void *par;               &lt;br /&gt;};&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 100%"&gt;   &lt;p&gt;fb_ops 用戶應用可以使用 ioctl() 系統調用來操作設備，這個結構就是用一支持 ioctl() 的這些操作的。&amp;#160; &lt;font color="#ff0000"&gt;(跟我在程式碼裡面看到的不太一樣？？)&lt;/font&gt;      &lt;br /&gt;&lt;/p&gt;    &lt;table style="border-right: black 0px solid; border-top: black 0px solid; background-image: none; border-left: black 0px solid; width: 100%; border-bottom: black 0px solid; height: 100px; background-color: white; text-align: left" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;struct fb_ops              &lt;br /&gt;{               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* open/release and usage marking */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct module *owner;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_open)(struct fb_info *info, int user);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_release)(struct fb_info *info, int user);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* get non settable parameters */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* get settable parameters */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* set settable parameters */                &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_set_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* get colormap */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_get_cmap)(struct fb_cmap *cmap, int kspc, int con,               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_info *info);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* set colormap */                &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_set_cmap)(struct fb_cmap *cmap, int kspc, int con,               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_info *info);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* pan display (optional) */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_pan_display)(struct fb_var_screeninfo *var, int con,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct fb_info *info);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* perform fb specific ioctl (optional) */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_ioctl)(struct inode *inode, struct file *file, unsigned int cmd,               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unsigned long arg, int con, struct fb_info *info);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* perform fb specific mmap */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_mmap)(struct fb_info *info, struct file *file,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct vm_area_struct *vma);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;/* switch to/from raster image mode */&lt;/font&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int (*fb_rasterimg)(struct fb_info *info, int start);               &lt;br /&gt;};&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;&lt;/p&gt;   &lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-weight: bold"&gt;         &lt;br /&gt;LCD Frame buffer 函式呼叫順序：&lt;/span&gt;&lt;/span&gt;       &lt;br /&gt;s3c2410fb_probe()：       &lt;br /&gt;- s3c2410fb_map_video_memory()       &lt;br /&gt;- s3c2410fb_init_registers()       &lt;br /&gt;- s3c2410fb_check_var()       &lt;br /&gt;      &lt;br /&gt;s3c2410fb_set_par() -&amp;gt; s3c2410fb_activate_var()：       &lt;br /&gt;- s3c2410fb_calculate_tft_lcd_regs()       &lt;br /&gt;- s3c2410fb_set_lcdaddr()       &lt;br /&gt;      &lt;br /&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-weight: bold"&gt;對 framebuffer 操作：&lt;/span&gt;&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span id="zoom"&gt;dd if=/dev/fb0 of=fbfile        &lt;br /&gt;可以將 fb0 中的內容保存下來存到 fbfile 裡         &lt;br /&gt;&lt;/span&gt;&lt;span id="zoom"&gt;       &lt;br /&gt;如果顯示模式是 1024*768 的 8 位色         &lt;br /&gt;dd if=/dev/zero of=/dev/fb0 bs=1024 count=768         &lt;br /&gt;可以清空 framebuffer (螢幕全黑)         &lt;br /&gt;        &lt;br /&gt;&lt;/span&gt;&lt;span id="zoom"&gt;dd if=fbfile of=/dev/fb&lt;/span&gt;0       &lt;br /&gt;將 fbfile 內的資料寫回 framebuffer&amp;#160; &lt;br /&gt;&lt;span style="font-size: 100%"&gt;       &lt;br /&gt;&lt;strong&gt;程式內對 framebuffer 操作：         &lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;table style="border-right: black 0px solid; border-top: black 0px solid; background-image: none; border-left: black 0px solid; width: 100%; border-bottom: black 0px solid; height: 100px; background-color: white; text-align: left" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;           &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;            &lt;br /&gt;#include &amp;lt;fcntl.h&amp;gt;            &lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;            &lt;br /&gt;#include &amp;lt;string.h&amp;gt;            &lt;br /&gt;#include &amp;lt;sys/ioctl.h&amp;gt;            &lt;br /&gt;#include &amp;lt;sys/mman.h&amp;gt;            &lt;br /&gt;#include &amp;lt;asm/page.h&amp;gt; &lt;/p&gt;          &lt;p&gt;#include &amp;quot;bitmap.h&amp;quot; &lt;/p&gt;          &lt;p&gt;int main()           &lt;br /&gt;{            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int fb;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unsigned char* fb_mem;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// open frame buffer device&lt;/font&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fb= open(&amp;quot;/dev/fb0&amp;quot;, O_RDWR);            &lt;br /&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// get frame buffer memory mapping address&lt;/font&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fb_mem = mmap (NULL, 320*240*2,             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PROT_READ|PROT_WRITE, MAP_SHARED, fb, 0);            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// clear frame buffer&lt;/font&gt;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; memset(fb_mem, 0, 320*240*2);            &lt;br /&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// cpoy image to framebuffer             &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; memcpy(fb_mem, (unsigned char *)ScreenBitmap, 320*240*2);&amp;#160; &lt;br /&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;// close framebuffer device&lt;/font&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; close(fb);&amp;#160; &lt;br /&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0;            &lt;br /&gt;}&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;span style="font-size: 100%"&gt;&lt;span style="font-size: 100%"&gt;       &lt;br /&gt;        &lt;br /&gt;** 參考資料 **         &lt;br /&gt;&lt;a href="http://moto.debian.org.tw/viewtopic.php?p=56374"&gt;http://moto.debian.org.tw/viewtopic.php?p=56374&lt;/a&gt;         &lt;br /&gt;&lt;a href="http://www.91linux.com/html/article/kernel/20071204/8805.html"&gt;http://www.91linux.com/html/article/kernel/20071204/8805.html&lt;/a&gt;         &lt;br /&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7357892837569619421-4139685454187184764?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/4139685454187184764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=4139685454187184764' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/4139685454187184764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/4139685454187184764'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/04/lcd-driver.html' title='LCD Driver 筆記 - Frame Buffer'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-3092302797902759755</id><published>2008-03-31T16:57:00.000+08:00</published><updated>2008-04-17T15:23:14.712+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux driver'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>LED Driver 筆記 - led trigger</title><content type='html'>在 menuconfig 裡必須選取  &lt;br /&gt;Device Driver ---&amp;gt;  &lt;br /&gt;[*] LED Support ---&amp;gt;  &lt;br /&gt;[*] LED Trigger support  &lt;br /&gt;  &lt;br /&gt;在 LED 設定的 struct 中，有一個變數為 &lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;def_trigger   &lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0)"&gt;表示控制 led 的名稱   &lt;br /&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0)"&gt;static struct s3c24xx_led_platdata smdk_pdata_led_blue = {&lt;/span&gt;  &lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;.gpio = S3C2410_GPB1,&lt;/span&gt;  &lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;.flags = S3C24XX_LEDF_TRISTATE,&lt;/span&gt;  &lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;.name = &amp;quot;led-blue&amp;quot;,&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51,51,255)"&gt;.def_trigger = &amp;quot;nand-disk&amp;quot;,&lt;/span&gt;  &lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0,0,0)"&gt;   &lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;&lt;/span&gt;  &lt;br /&gt;表示控制 LED 藍燈的名稱是 &amp;quot;nand-disk&amp;quot;  &lt;br /&gt;  &lt;div id="fullpost"&gt;   &lt;br /&gt;在 linxu/drivers/mtd/nand/nand_base.c    &lt;br /&gt;註冊： &lt;span style="font-weight: bold"&gt;led_trigger_register_simple(&amp;quot;nand-disk&amp;quot;, &amp;amp;nand_led_trigger);&lt;/span&gt;    &lt;br /&gt;取消註冊： &lt;span style="font-weight: bold"&gt;led_trigger_unregister_simple(nand_led_trigger);     &lt;br /&gt;&lt;/span&gt;控制：&lt;span style="font-weight: bold"&gt;&lt;span style="font-weight: bold"&gt; led_trigger_event(nand_led_trigger, LED_FULL);       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;現在 只要對 nand flash 操作，藍燈就會亮    &lt;br /&gt;    &lt;br /&gt;在 linux/drivers/leds/leds-s3c24xx.c 中    &lt;br /&gt;    &lt;br /&gt;會呼叫    &lt;br /&gt;static void s3c24xx_led_set(struct led_classdev *led_cdev, enum led_brightness value)    &lt;br /&gt;{    &lt;br /&gt;struct s3c24xx_gpio_led *led = to_gpio(led_cdev);    &lt;br /&gt;struct s3c24xx_led_platdata *pd = led-&amp;gt;pdata;    &lt;br /&gt;    &lt;br /&gt;&lt;span style="color: rgb(0,102,0)"&gt;/* there will be a short delay between setting the output and&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: rgb(0,102,0)"&gt;* going from output to input when using tristate. */&lt;/span&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;s3c2410_gpio_setpin(pd-&amp;gt;gpio, (value ? 1 : 0) ^(pd-&amp;gt;flags &amp;amp; S3C24XX_LEDF_ACTLOW));&lt;/span&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;if (pd-&amp;gt;flags &amp;amp; S3C24XX_LEDF_TRISTATE)&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;s3c2410_gpio_cfgpin(pd-&amp;gt;gpio,value ? S3C2410_GPIO_OUTPUT : S3C2410_GPIO_INPUT);&lt;/span&gt;    &lt;br /&gt;}    &lt;br /&gt;    &lt;br /&gt;&lt;span style="font-size: 85%"&gt;** 備註 **     &lt;br /&gt;&lt;/span&gt;    &lt;ol&gt;     &lt;li&gt;&lt;span style="font-size: 85%"&gt;#define DEFINE_LED_TRIGGER(x) static struct led_trigger *x;         &lt;br /&gt;定義在 linxu/include/linux/leds.h&lt;/span&gt;&lt;/li&gt;      &lt;li&gt;&lt;span style="font-size: 85%"&gt;led brightness 是濠洨的 (只有亮跟不亮)&lt;/span&gt;&lt;/li&gt;      &lt;li&gt;&lt;span style="font-size: 85%"&gt;LED 相關設定可以參考 &lt;a title="http://top12345tw.blogspot.com/2008/03/linux-kernel-26243-led-driver.html" href="http://top12345tw.blogspot.com/2008/03/linux-kernel-26243-led-driver.html"&gt;LED Driver 筆記&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;   &lt;/ol&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7357892837569619421-3092302797902759755?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/3092302797902759755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=3092302797902759755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/3092302797902759755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/3092302797902759755'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/03/led-driver-led-trigger.html' title='LED Driver 筆記 - led trigger'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-8307460660646047330</id><published>2008-03-31T02:34:00.000+08:00</published><updated>2008-05-29T14:01:05.188+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><title type='text'>Blogger Tag Cloud/Label Cloud</title><content type='html'>在 ]]&amp;lt;/b:skin&amp;gt; 之前加入以下 css   &lt;br /&gt;&lt;code&gt;/* Label Cloud Styles    &lt;br /&gt;----------------------------------------------- */     &lt;br /&gt;#labelCloud {text-align:center;font-family:arial,sans-serif;}     &lt;br /&gt;#labelCloud .label-cloud li{display:inline;background-image:none !important;padding:0 5px;margin:0;vertical-align:baseline !important;border:0 !important;}     &lt;br /&gt;#labelCloud ul{list-style-type:none;margin:0 auto;padding:0;}     &lt;br /&gt;#labelCloud a img{border:0;display:inline;margin:0 0 0 3px;padding:0}     &lt;br /&gt;#labelCloud a{text-decoration:none}     &lt;br /&gt;#labelCloud a:hover{text-decoration:underline}     &lt;br /&gt;#labelCloud li a{}     &lt;br /&gt;#labelCloud .label-cloud {}     &lt;br /&gt;#labelCloud .label-count {padding-left:0.2em;font-size:9px;color:#000}     &lt;br /&gt;#labelCloud .label-cloud li:before{content:&amp;quot;&amp;quot; !important}&lt;/code&gt;   &lt;br /&gt;  &lt;br /&gt;在 &amp;lt;/head&amp;gt; 前加入以下 javascript   &lt;br /&gt;&lt;code&gt;&amp;lt;script type='text/javascript'&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Label Cloud User Variables     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var cloudMin = 1;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var maxFontSize = 20;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var maxColor = [0,0,255];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var minFontSize = 10;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var minColor = [0,0,0];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var lcShowCount = false;     &lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/code&gt;   &lt;br /&gt;  &lt;br /&gt;找到 siderbar 加入以下的 widget   &lt;br /&gt;&lt;code&gt;&amp;lt;b:widget id='Label1' locked='false' title='Label Cloud' type='Label'&amp;gt;    &lt;br /&gt;&amp;lt;b:includable id='main'&amp;gt;&amp;#160; &lt;br /&gt;&amp;#160; &amp;lt;b:if cond='data:title'&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;h2&amp;gt;&amp;lt;data:title/&amp;gt;&amp;lt;/h2&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/b:if&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;div class='widget-content'&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;div id='labelCloud'/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script type='text/javascript'&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Don't change anything past this point -----------------     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Cloud function s() ripped from del.icio.us     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function s(a,b,i,x){     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(a&amp;amp;gt;b){&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var m=(a-b)/Math.log(x),v=a-Math.floor(Math.log(i)*m)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var m=(b-a)/Math.log(x),v=Math.floor(Math.log(i)*m+a)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return v     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var c=[];&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var labelCount = new Array();&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var ts = new Object;     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;b:loop values='data:labels' var='label'&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var theName = &amp;amp;quot;&amp;lt;data:label.name/&amp;gt;&amp;amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ts[theName] = &amp;lt;data:label.count/&amp;gt;;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/b:loop&amp;gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (t in ts){     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!labelCount[ts[t]]){&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; labelCount[ts[t]] = new Array(ts[t])&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var ta=cloudMin-1;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tz = labelCount.length - cloudMin;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lc2 = document.getElementById('labelCloud');     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ul = document.createElement('ul');     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ul.className = 'label-cloud';     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for(var t in ts){     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(ts[t] &amp;amp;lt; cloudMin){     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; continue;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (var i=0;3 &amp;amp;gt; i;i++) {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c[i]=s(minColor[i],maxColor[i],ts[t]-ta,tz)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var fs = s(minFontSize,maxFontSize,ts[t]-ta,tz);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; li = document.createElement('li');&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; li.style.fontSize = fs+'px';&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; li.style.lineHeight = '1';&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a = document.createElement('a');&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a.title = ts[t]+' Posts in '+t;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a.style.color = 'rgb('+c[0]+','+c[1]+','+c[2]+')';&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a.href = '/search/label/'+encodeURIComponent(t);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (lcShowCount){&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; span = document.createElement('span');&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; span.innerHTML = '('+ts[t]+') ';&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; span.className = 'label-count';&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a.appendChild(document.createTextNode(t));&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; li.appendChild(a);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; li.appendChild(span);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a.appendChild(document.createTextNode(t));&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; li.appendChild(a);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ul.appendChild(li);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; abnk = document.createTextNode(' ');&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ul.appendChild(abnk);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lc2.appendChild(ul);&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;noscript&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ul&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;b:loop values='data:labels' var='label'&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;b:if cond='data:blog.url == data:label.url'&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;data:label.name/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;b:else/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;a expr:href='data:label.url'&amp;gt;&amp;lt;data:label.name/&amp;gt;&amp;lt;/a&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/b:if&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&amp;lt;data:label.count/&amp;gt;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/li&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/b:loop&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ul&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/noscript&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;b:include name='quickedit'/&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/div&amp;gt;     &lt;br /&gt;&amp;lt;/b:includable&amp;gt;     &lt;br /&gt;&amp;lt;/b:widget&amp;gt;&lt;/code&gt;   &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;code class="ref"&gt;參考資料：    &lt;br /&gt;&lt;a title="http://phy3blog.googlepages.com/Beta-Blogger-Label-Cloud.html" href="http://phy3blog.googlepages.com/Beta-Blogger-Label-Cloud.html"&gt;http://phy3blog.googlepages.com/Beta-Blogger-Label-Cloud.html&lt;/a&gt;&lt;/code&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7357892837569619421-8307460660646047330?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/8307460660646047330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=8307460660646047330' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/8307460660646047330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/8307460660646047330'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/03/blogger-tag-cloudlabel-cloud.html' title='Blogger Tag Cloud/Label Cloud'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-5176574539014472111</id><published>2008-03-29T16:00:00.000+08:00</published><updated>2008-04-22T13:35:30.336+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><title type='text'>Blogger 設計</title><content type='html'>&lt;mysubtitle&gt;顯示最新文章和最新回應：&lt;/mysubtitle&gt;   &lt;br /&gt;選擇「資訊提供」，URL 填入下面網址（藍色部份請自行修改）&amp;#160;&amp;#160; &lt;br /&gt;最新文章：http://&lt;font color="#0000ff"&gt;top12345tw&lt;/font&gt;.blogspot.com/feeds/posts/default&amp;#160; &lt;br /&gt;最新回應：http://&lt;font color="#0000ff"&gt;top12345tw&lt;/font&gt;.blogspot.com/feeds/comments/full   &lt;br /&gt;  &lt;br /&gt;&lt;code class="ref"&gt;參考資料：    &lt;br /&gt;&lt;a title="http://klcintw4.blogspot.com/2007/02/sidebar.html" href="http://klcintw4.blogspot.com/2007/02/sidebar.html"&gt;http://klcintw4.blogspot.com/2007/02/sidebar.html&lt;/a&gt;     &lt;br /&gt;&lt;/code&gt;  &lt;br /&gt;&lt;mysubtitle&gt;漂亮的 code reference tag：&lt;/mysubtitle&gt;   &lt;br /&gt;在 html 裡面加入以下 css 程式碼   &lt;br /&gt;  &lt;br /&gt;&lt;code&gt;code&amp;#160; {    &lt;br /&gt;display: block; &lt;font color="#008000"&gt;/* fixes a strange ie margin bug */&lt;/font&gt;     &lt;br /&gt;font-family: Courier New;     &lt;br /&gt;font-size: 9pt;     &lt;br /&gt;overflow:auto;     &lt;br /&gt;background: #f0f0f0 url(http://chenkaie.googlepages.com/Code_BG.gif) left top&amp;#160;&amp;#160;&amp;#160;&amp;#160; repeat-y;     &lt;br /&gt;border: 1px solid #ccc;     &lt;br /&gt;padding: 5px 5px 5px 20px;     &lt;br /&gt;max-height:400px;     &lt;br /&gt;line-height: 1.2em;     &lt;br /&gt;margin: 5px 5px 0 15px;     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;code.ref{     &lt;br /&gt;display: block; &lt;font color="#008000"&gt;/* fixes a strange ie margin bug */&lt;/font&gt;     &lt;br /&gt;background: #ffe8e8 url(http://chenkaie.googlepages.com/Code_REF.gif) left top repeat-y;     &lt;br /&gt;border: 1px dashed #333;     &lt;br /&gt;padding: 10px 5px 10px 20px;     &lt;br /&gt;margin: 5px 0 0 15px;     &lt;br /&gt;font-size: 11px;     &lt;br /&gt;font-family: Courier New;     &lt;br /&gt;line-height: 1.6em;     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;code.ps{     &lt;br /&gt;display: block; &lt;font color="#008000"&gt;/* fixes a strange ie margin bug */&lt;/font&gt;     &lt;br /&gt;background: #ffffc8;     &lt;br /&gt;border: 1px dashed #333;     &lt;br /&gt;padding: 2px 5px 2px 5px;     &lt;br /&gt;margin: 5px 0px 5px 0px;     &lt;br /&gt;font-size: 11px;     &lt;br /&gt;line-height: 1.6em;     &lt;br /&gt;color: #363636;     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;mysubtitle{     &lt;br /&gt;display: block; &lt;font color="#008000"&gt;/* fixes a strange ie margin bug */&lt;/font&gt;     &lt;br /&gt;font-size: 110%;     &lt;br /&gt;font-weight: bold;     &lt;br /&gt;overflow:auto;     &lt;br /&gt;border-bottom-style: OUTSET;     &lt;br /&gt;border-bottom-color: #ffffff;     &lt;br /&gt;border-bottom-width: 1px;     &lt;br /&gt;padding: 2px 2px 2px 2px;     &lt;br /&gt;line-height: 1.2em;     &lt;br /&gt;margin: 5px 5px 0 0px;     &lt;br /&gt;}     &lt;br /&gt;&lt;/code&gt;  &lt;br /&gt;使用方式   &lt;br /&gt;&amp;lt;code&amp;gt; ..... &amp;lt;/code&amp;gt;   &lt;br /&gt;&amp;lt;code class=&amp;quot;ref&amp;quot;&amp;gt; ..... &amp;lt;/code&amp;gt;&amp;#160; &lt;br /&gt;&amp;lt;code class=&amp;quot;ps&amp;quot;&amp;gt; ..... &amp;lt;/code&amp;gt;   &lt;br /&gt;&amp;lt;mysubtitle&amp;gt; ..... &amp;lt;/mysubtitle&amp;gt;   &lt;br /&gt;  &lt;br /&gt;&lt;code class="ref"&gt;參考資料：    &lt;br /&gt;&lt;a title="http://chenkaie.blogspot.com/2006/11/css-cool-blockquote-for-code-style.html" href="http://chenkaie.blogspot.com/2006/11/css-cool-blockquote-for-code-style.html"&gt;http://chenkaie.blogspot.com/2006/11/css-cool-blockquote-for-code-style.html&lt;/a&gt; &lt;/code&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;mysubtitle&gt;google AJAX search&lt;/subtitle&gt;   &lt;br /&gt;&lt;code&gt;&amp;lt;form action='http://top12345tw.blogspot.com/search' id='searchthis' method='get' style='display:inline;'&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input id='b-query' maxlength='255' name='q' size='20' type='text'/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input class='blue' id='b-searchbtn' type='submit' value='Search'/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;br/&amp;gt;Search This Blog By Google     &lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/code&gt;   &lt;br /&gt;  &lt;br /&gt;  &lt;code class="ref"&gt;參考資料：   &lt;br /&gt;&lt;a title="http://chenkaie.blogspot.com/2006/11/blog-hide-navbar-and-add-blogsearch-box.html" href="http://chenkaie.blogspot.com/2006/11/blog-hide-navbar-and-add-blogsearch-box.html"&gt;http://chenkaie.blogspot.com/2006/11/blog-hide-navbar-and-add-blogsearch-box.html&lt;/a&gt; &lt;/code&gt;   &lt;br /&gt;    &lt;br /&gt;時鐘:     &lt;br /&gt;&lt;a href="http://www.fanboy.jp/teaser/"&gt;http://www.fanboy.jp/teaser/&lt;/a&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;a title="http://www.clocklink.com/" href="http://www.clocklink.com/"&gt;http://www.clocklink.com/&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;音樂播放器:     &lt;br /&gt;&lt;a href="http://www.finetune.com/"&gt;http://www.finetune.com/&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;a title="http://www.springwidgets.com/" href="http://www.springwidgets.com/"&gt;http://www.springwidgets.com/&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;a title="http://blog.pixnet.net/prb999/post/4578896" href="http://blog.pixnet.net/prb999/post/4578896"&gt;http://blog.pixnet.net/prb999/post/4578896&lt;/a&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;其他:     &lt;br /&gt;&lt;a title="http://racklin.blogspot.com/2007/01/blogger-jquery-way.html" href="http://racklin.blogspot.com/2007/01/blogger-jquery-way.html"&gt;http://racklin.blogspot.com/2007/01/blogger-jquery-way.html&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;a title="http://xoilman.blogspot.com/2007/05/blog.html" href="http://xoilman.blogspot.com/2007/05/blog.html"&gt;http://xoilman.blogspot.com/2007/05/blog.html&lt;/a&gt;     &lt;br /&gt;&lt;a title="http://chenkaie.blogspot.com/2000/11/blog-plug-ins-of-this-blog.html" href="http://chenkaie.blogspot.com/2000/11/blog-plug-ins-of-this-blog.html"&gt;http://chenkaie.blogspot.com/2000/11/blog-plug-ins-of-this-blog.html&lt;/a&gt;     &lt;br /&gt;&lt;a title="http://klcintw4.blogspot.com/" href="http://klcintw4.blogspot.com/"&gt;http://klcintw4.blogspot.com/&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;文章加密:     &lt;br /&gt;&lt;a title="http://chenkaie.blogspot.com/2007/03/javascript-encrypt-your-private-blog.html" href="http://chenkaie.blogspot.com/2007/03/javascript-encrypt-your-private-blog.html"&gt;http://chenkaie.blogspot.com/2007/03/javascript-encrypt-your-private-blog.html&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;Tooltips:   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7357892837569619421-5176574539014472111?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/5176574539014472111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=5176574539014472111' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/5176574539014472111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/5176574539014472111'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/03/blogger.html' title='Blogger 設計'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-1594569780202983667</id><published>2008-03-28T16:04:00.000+08:00</published><updated>2008-04-17T15:23:33.396+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux driver'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>LED Driver 筆記</title><content type='html'>想了解 linux kernel 2.6.24.3 中 Driver 的實做，所以先從看起來比較簡單的 LED driver 來開始研究。   &lt;br /&gt;  &lt;br /&gt;  S3c2440 LED GPIO:    &lt;br /&gt;紅：GPBDAT4     &lt;br /&gt;藍：GPBDAT1     &lt;br /&gt;綠：GPBDAT10     &lt;br /&gt;    &lt;br /&gt;menuconfig 設定：     &lt;br /&gt;Device Drivers ---&amp;gt;     &lt;br /&gt;[*] LED Support ---&amp;gt;     &lt;br /&gt;&amp;lt;*&amp;gt; LED Class Support     &lt;br /&gt;&amp;lt;*&amp;gt; LED Support for Samsung S3C24XX GPIO LEDs     &lt;br /&gt;    &lt;br /&gt;相關檔案：     &lt;br /&gt;    &lt;ul&gt;     &lt;li&gt;linux/include/linux/leds.h &lt;/li&gt;      &lt;li&gt;linux/include/asm-arm/arch-s3c2410/leds-gpio.h        &lt;br /&gt;&lt;/li&gt;      &lt;li&gt;linux/arch/arm/plat-s3c24xx/common-smdk.c &lt;/li&gt;      &lt;li&gt;linux/driver/leds/leds.h &lt;/li&gt;      &lt;li&gt;linux/driver/leds/led-core.c &lt;/li&gt;      &lt;li&gt;linux/driver/leds/led-class.c &lt;/li&gt;      &lt;li&gt;linux/driver/leds/leds-s3c24xx.c &lt;/li&gt;   &lt;/ul&gt; &lt;span id="fullpost"&gt;   &lt;br /&gt;&lt;span style="font-weight: bold"&gt;linux/include/linux/leds.h &lt;/span&gt; &lt;table style="border-right: black 0px solid; border-top: black 0px solid; float: left; background-image: none; border-left: black 0px solid; width: 585px; border-bottom: black 0px solid; height: 100px; background-color: white; text-align: left" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;&lt;span style="color: rgb(0,102,0)"&gt;/* For the leds-gpio driver */&lt;/span&gt;&amp;#160; &lt;br /&gt;struct gpio_led {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; const char *name;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char *default_trigger;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unsigned gpio;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; u8 active_low;           &lt;br /&gt;};           &lt;br /&gt;          &lt;br /&gt;struct gpio_led_platform_data {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int num_leds;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct gpio_led *leds;           &lt;br /&gt;};&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div id="fullpost"&gt;&lt;span style="font-weight: bold"&gt;     &lt;br /&gt;      &lt;br /&gt;linux/include/asm-arm/arch-s3c2410/leds-gpio.h&lt;/span&gt; &lt;/div&gt;  &lt;table style="border-right: black 0px solid; border-top: black 0px solid; float: left; background-image: none; border-left: black 0px solid; width: 585px; border-bottom: black 0px solid; height: 100px; background-color: white; text-align: left" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;struct s3c24xx_led_platdata {          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unsigned int gpio;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unsigned int flags;           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char *name;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char *def_trigger;           &lt;br /&gt;}; &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div&gt;   &lt;br /&gt;&lt;span style="font-weight: bold"&gt;     &lt;br /&gt;linux/arch/arm/plat-s3c24xx/common-smdk.c       &lt;br /&gt;&lt;/span&gt;&lt;span&gt;將 led 相關設定內容改成如下：&lt;/span&gt;&lt;span style="font-weight: bold"&gt;      &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0,102,0)"&gt;/* LED devices */&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;static struct s3c24xx_led_platdata smdk_pdata_led_red = {&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.gpio = S3C2410_GPB4,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.flags = S3C24XX_LEDF_TRISTATE,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.name = &amp;quot;led-red&amp;quot;,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.def_trigger = &amp;quot;timer&amp;quot;,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;}&lt;/span&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;static struct s3c24xx_led_platdata smdk_pdata_led_blue = {&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.gpio = S3C2410_GPB1,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.flags = S3C24XX_LEDF_TRISTATE,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.name = &amp;quot;led-blue&amp;quot;,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.def_trigger = &amp;quot;nand-disk&amp;quot;,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;}&lt;/span&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;static struct s3c24xx_led_platdata smdk_pdata_led_green = {&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.gpio = S3C2410_GPB10,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.flags = S3C24XX_LEDF_TRISTATE,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.name = &amp;quot;led-green&amp;quot;,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.def_trigger = &amp;quot;led-green&amp;quot;,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;}&lt;/span&gt;     &lt;br /&gt;    &lt;br /&gt;gpio：定義 Led GPIO 接腳     &lt;br /&gt;name： device 名字     &lt;br /&gt;def_trigger：觸發 led 名稱     &lt;br /&gt;    &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;static struct platform_device smdk_led_red = {&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.name = &amp;quot;s3c24xx_led&amp;quot;,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.id = 0,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.dev = {&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.platform_data = &amp;amp;smdk_pdata_led_red,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;},&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;}&lt;/span&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;static struct platform_device smdk_led_blue = {&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.name = &amp;quot;s3c24xx_led&amp;quot;,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.id = 1,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.dev = {&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.platform_data = &amp;amp;smdk_pdata_led_blue,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;}&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;}&lt;/span&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;static struct platform_device smdk_led_green = {&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.name = &amp;quot;s3c24xx_led&amp;quot;,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.id = 2,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.dev = {&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;.platform_data = &amp;amp;smdk_pdata_led_green,&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;}&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102,102,102)"&gt;&lt;span style="color: rgb(0,0,0)"&gt;}&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0)"&gt;另外在 smdk_machine_init()      &lt;br /&gt;設定初始話 LED 相對應腳位 GPB1 GPB4 GPB10 讓 led 全亮       &lt;br /&gt;如下:       &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_OUTP);&lt;/span&gt;       &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;s3c2410_gpio_cfgpin(S3C2410_GPB4, S3C2410_GPB4_OUTP);&lt;/span&gt;       &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;s3c2410_gpio_cfgpin(S3C2410_GPB10,        &lt;br /&gt;S3C2410_GPB10_OUTP);&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;s3c2410_gpio_setpin(S3C2410_GPB1, 1);&lt;/span&gt;       &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;s3c2410_gpio_setpin(S3C2410_GPB4, 1);&lt;/span&gt;       &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0,0,0)"&gt;s3c2410_gpio_setpin(S3C2410_GPB10, 1);&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,0)"&gt;led trigger 在 &lt;a href="http://top12345tw.blogspot.com/2008/03/led-driver-led-trigger.html"&gt;LED Driver 筆記 - led trigger&lt;/a&gt; 會有說明       &lt;br /&gt;      &lt;br /&gt;&lt;span style="font-size: 85%"&gt;** 備註 **&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div&gt;   &lt;ol&gt;     &lt;li&gt;&lt;span style="font-size: 85%; color: rgb(0,0,0)"&gt;s3c24xx_led_platdata 的 &lt;/span&gt;&lt;span style="font-size: 85%; color: rgb(0,0,0)"&gt;flags 不要設定 &lt;/span&gt;&lt;span style="font-size: 85%; color: rgb(0,0,0)"&gt;S3C24XX_LEDF_ACTLOW。這塊板子是 1 是亮燈，0 是關燈，所以不是 &lt;/span&gt;&lt;span style="font-size: 85%"&gt;active low。&lt;/span&gt;         &lt;br /&gt;&lt;/li&gt;   &lt;/ol&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/7357892837569619421-1594569780202983667?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/1594569780202983667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=1594569780202983667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/1594569780202983667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/1594569780202983667'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/03/linux-kernel-26243-led-driver.html' title='LED Driver 筆記'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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-7357892837569619421.post-3231362542842940126</id><published>2008-03-28T03:57:00.000+08:00</published><updated>2008-04-17T15:23:55.868+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='linux driver'/><category scheme='http://www.blogger.com/atom/ns#' term='ARM S3C2440'/><title type='text'>linux kernel 2.6.24.3 platform device driver</title><content type='html'>&lt;span style="font-size: 130%"&gt;&lt;b&gt;linux Platform Driver 說明 &lt;/b&gt;&lt;/span&gt;  &lt;br /&gt;  &lt;br /&gt;從2.6版本開始引入了 platform 這個概念，在開發底層驅動程序時，首先要確認的就是設備的資源信息，例如設備的地址，   &lt;br /&gt;在2.6內核中將每個設備的資源用結構 platform_device 來描述，該結構體定義在 linux\include\linux\platform_device.h 中     &lt;br /&gt; &lt;div id="fullpost"&gt;   &lt;table cellspacing="0" cellpadding="5" width="430" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="400"&gt;&lt;span style="font-weight: bold; color: rgb(102,102,102)"&gt;struct platform_device {              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; const char *name;               &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;int id;               &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;struct device dev;               &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;u32 num_resources;               &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;struct resource *resource;               &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102,102,102)"&gt;};&lt;/span&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;br /&gt;該結構一個重要的元素是 resource，該元素存入了最為重要的設備資源信息，定義在 linux\include\linux\ioport.h 中     &lt;br /&gt;    &lt;br /&gt;  &lt;table cellspacing="0" cellpadding="5" width="430" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;b style="color: rgb(51,51,51)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;struct resource {&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;resource_size_t start;&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;resource_size_t end;&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;const char *name;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;unsigned long flags;&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;struct resource *parent, *sibling, *child;&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;};&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;    &lt;br /&gt;下面舉個例子來說明一下：     &lt;br /&gt;在 linux/arch/arm/plat-s3c24xx/devs.c 定義了     &lt;br /&gt;    &lt;br /&gt;  &lt;table cellspacing="0" cellpadding="5" width="430" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="430"&gt;&lt;b style="color: rgb(51,51,51)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;static struct resource s3c_lcd_resource[ ] = {&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; [0] = {&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: rgb(102,102,102)"&gt;.start = S3C24XX_PA_LCD,&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: rgb(102,102,102)"&gt;.end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: rgb(102,102,102)"&gt;.flags = IORESOURCE_MEM,&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: rgb(102,102,102)"&gt;},&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: rgb(102,102,102)"&gt;[1] = {&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: rgb(102,102,102)"&gt;.start = IRQ_LCD,&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: rgb(102,102,102)"&gt;.end = IRQ_LCD,&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: rgb(102,102,102)"&gt;.flags = IORESOURCE_IRQ,&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: rgb(102,102,102)"&gt;}&lt;span style="color: rgb(102,102,102)"&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;};&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;b style="color: rgb(51,51,51)"&gt;     &lt;br /&gt;&lt;/b&gt;這裡定義了兩組 resource，它描述了一個 lcd 設備的資源，     &lt;br /&gt;第1組描述了這個 lcd 設備所佔用的地址範圍，     &lt;br /&gt;IORESOURCE_MEM 表示第 1 組描述的是內存類型的資源信息，     &lt;br /&gt;第2組描述了這個 lcd 設備的中斷號，     &lt;br /&gt;IORESOURCE_IRQ 表示第 2 組描述的是中斷資源信息。     &lt;br /&gt;設備驅動會根據 flags 來獲取相應的資源信息。     &lt;br /&gt;    &lt;br /&gt;有了 resource 信息，就可以定義 platform_device 了：     &lt;br /&gt;    &lt;br /&gt;&lt;b style="color: rgb(51,51,51)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;static u64 s3c_device_lcd_dmamask = 0xffffffffUL;&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;struct platform_device s3c_device_lcd = {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.name = &amp;quot;s3c2410-lcd&amp;quot;,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.id = -1,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.num_resources = ARRAY_SIZE(s3c_lcd_resource),&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.resource = s3c_lcd_resource,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.dev = {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.dma_mask = &amp;amp;s3c_device_lcd_dmamask,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.coherent_dma_mask = 0xffffffffUL&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;}&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;};&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;EXPORT_SYMBOL( s3c_device_lcd );&lt;/span&gt;       &lt;br /&gt;&lt;/b&gt;    &lt;br /&gt;將 &lt;span style="color: rgb(0,0,0)"&gt;s3c_device_lcd&lt;/span&gt; expoert 讓其他檔案使用     &lt;br /&gt;    &lt;br /&gt;把 &lt;span style="color: rgb(0,0,0)"&gt;s3c_device_lcd&lt;/span&gt; 加到 platform_device 裡面 linux/arch/arm/mach-s3c2440/mach-smdk2440.c：     &lt;br /&gt;    &lt;br /&gt;&lt;b style="color: rgb(51,51,51)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;static struct platform_device *smdk2440_devices[ ] __initdata = {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;amp;s3c_device_usb,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(0,0,153)"&gt;s3c_device_lcd&lt;/span&gt;&lt;span style="color: rgb(102,102,102)"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;amp;s3c_device_wdt,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;amp;s3c_device_i2c,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;&amp;amp;s3c_device_iis,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;};&lt;/span&gt;&lt;/b&gt;     &lt;br /&gt;    &lt;br /&gt;有了 platform_device 就可以使用函數 platform_add_devices 向系統中添加該設備了，這裡的作法是     &lt;br /&gt;    &lt;br /&gt;&lt;b style="color: rgb(51,51,51)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;static void __init smdk2440_machine_init(void)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;{&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;..............&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: rgb(51,51,255)"&gt;&lt;span style="color: rgb(0,0,153)"&gt;platform_add_devices( smdk2440_devices, ARRAY_SIZE( smdk2440_devices ) );&lt;/span&gt;&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;............&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;}&lt;/span&gt;&lt;/b&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;b style="color: rgb(51,51,51)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;MACHINE_START(S3C2440, &amp;quot;SMDK2440&amp;quot;)&lt;/span&gt;&lt;span style="color: rgb(0,102,0)"&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.phys_io = S3C2410_PA_UART,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.io_pg_offst = (((u32)S3C24XX_VA_UART) &amp;gt;&amp;gt; 18) &amp;amp; 0xfffc,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.boot_params = S3C2410_SDRAM_PA + 0x100,&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.init_irq = s3c24xx_init_irq,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.map_io = smdk2440_map_io,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.init_machine = &lt;/span&gt;&lt;span style="color: rgb(0,0,153)"&gt;smdk2440_machine_init&lt;span style="color: rgb(51,51,51)"&gt;,&lt;/span&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.timer = &amp;amp;s3c24xx_timer,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;MACHINE_END&lt;/span&gt;&lt;/b&gt;     &lt;br /&gt;    &lt;br /&gt;驅動程序需要實現結構體 struct platform_driver，參考 linux\driver\video\s3c2410fb.c，     &lt;p&gt;&lt;b style="color: rgb(51,51,51)"&gt;&lt;span style="color: rgb(102,102,102)"&gt;static struct platform_driver s3c2410fb_driver = {&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.probe = s3c2410fb_probe,&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.remove = s3c2410fb_remove,&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.suspend = s3c2410fb_suspend,&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.resume = s3c2410fb_resume,&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.driver = {&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.name = &amp;quot;s3c2410-lcd&amp;quot;,&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;.owner = THIS_MODULE,&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;},&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;};&lt;/span&gt;         &lt;br /&gt;&lt;/b&gt;      &lt;br /&gt;在驅動初始化函數中使用函數 platform_driver_register() 註冊 platform_driver       &lt;br /&gt;&lt;b style="color: rgb(204,0,0)"&gt;       &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;int __init s3c2410fb_init( void )&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;{&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;return platform_driver_register( &amp;amp;s3c2410fb_driver );&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;}&lt;/span&gt;         &lt;br /&gt;        &lt;br /&gt;&lt;span style="color: rgb(102,102,102)"&gt;module_init( s3c2410fb_init );&lt;/span&gt;         &lt;br /&gt;        &lt;br /&gt;需要注意的是： &lt;/b&gt;&lt;b style="color: rgb(204,0,0)"&gt;s3c_device_lcd&lt;/b&gt;&lt;b style="color: rgb(204,0,0)"&gt; 結構中 name 元素和 &lt;/b&gt;&lt;b style="color: rgb(204,0,0)"&gt;s3c2410fb_driver&lt;/b&gt;&lt;b style="color: rgb(204,0,0)"&gt; 結構中 driver 的 name 必須是相同的。&lt;/b&gt;       &lt;br /&gt;      &lt;br /&gt;這樣在 platform_driver_register() 註冊時，       &lt;br /&gt;會對所有已註冊的所有 platform_device 中的 name 和當前注冊的 platform_driver 的 driver-&amp;gt;name 進行比較，       &lt;br /&gt;只有找到相同的名稱的 platfomr_device 才能註冊成功，       &lt;br /&gt;當註冊成功時會呼叫 platform_driver 結構元素 probe 函數指針，       &lt;br /&gt;這裡就是 &lt;span style="color: rgb(51,51,51)"&gt;s3c2410fb_probe&lt;/span&gt;。&lt;/p&gt; 當進入 probe 函數後，需要獲取設備的資源信息，獲取資源的函數有：     &lt;br /&gt;    &lt;br /&gt;&lt;b style="color: rgb(102,102,102)"&gt;struct resource * platform_get_resource( struct platform_device *dev, unsigned int type, unsigned int num );&lt;/b&gt;     &lt;br /&gt;    &lt;br /&gt;根據參數 type 所指定類型，例如 IORESOURCE_MEM，來獲取指定的資源。     &lt;br /&gt;    &lt;br /&gt;&lt;b style="color: rgb(102,102,102)"&gt;struct int platform_get_irq( struct platform_device *dev, unsigned int num );&lt;/b&gt;     &lt;br /&gt;    &lt;br /&gt;獲取資源中的中斷號。     &lt;br /&gt;    &lt;br /&gt;&lt;b style="color: rgb(102,102,102)"&gt;struct resource * platform_get_resource_byname( struct platform_device *dev, unsigned int type, char *name );&lt;/b&gt;     &lt;br /&gt;    &lt;br /&gt;根據參數 name 所指定的名稱，來獲取指定的資源。     &lt;br /&gt;    &lt;br /&gt;&lt;b style="color: rgb(51,51,51)"&gt;i&lt;span style="color: rgb(102,102,102)"&gt;nt platform_get_irq_byname( struct platform_device *dev, char *name );&lt;/span&gt;&lt;/b&gt;     &lt;br /&gt;    &lt;br /&gt;根據參數 name 所指定的名稱，來獲取資源中的中斷號。     &lt;br /&gt;    &lt;br /&gt;參考資料: &lt;a href="http://www.eetop.cn/blog/html/45/11145-676.html"&gt;http://www.eetop.cn/blog/html/45/11145-676.html&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7357892837569619421-3231362542842940126?l=top12345tw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://top12345tw.blogspot.com/feeds/3231362542842940126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7357892837569619421&amp;postID=3231362542842940126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/3231362542842940126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7357892837569619421/posts/default/3231362542842940126'/><link rel='alternate' type='text/html' href='http://top12345tw.blogspot.com/2008/03/linux-kernel-26243-platform-device.html' title='linux kernel 2.6.24.3 platform device driver'/><author><name>陳俞安</name><uri>http://www.blogger.com/profile/17026587241333234828</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>
