ARM+linux驅動開發步驟的簡單示範

來源:互聯網
上載者:User

      碰到一個問我怎麼寫驅動的師弟,其實我也不懂,更不懂怎麼和他說了。要學的還有很多,具體的驅動架構需要他去看了,理解核心機制我也需要抽時間去琢磨。由於前面做過,就整理一下前面做過的文檔,從頭到尾示範一下,步驟而已,簡單的說,就是操作示範,至於調試啊,那是代碼的事情了。直接貼出以前的文檔如下:

 

********************************************************

由於近段時間還要繼續創新實驗項目,這個不是很喜歡做,哎,一言難盡。還好,我可以搞USB模組。不說了,說說我的開發板吧。今天拿起,啟動不得,一陣子沒摸她,倒是給我發脾氣了。沒有供電,還以為電源壞了。後來一查,按鈕開關壞了。小CASE,換好,今晚,跑跑板。
  
   系統配置:
   虛擬機器上,作業系統是Fedora9,核心看看。
   #uname -r
   2.6.25-14.fc9.i686
   開發板FL2440:
   # uname -r
   2.6.12-h1940
  

   首先,到虛擬機器上確定兩個編譯器,gcc和arm-linux-gcc。
   # gcc -v  然後就跟著就出來了,
   gcc 版本 4.3.0 20080428 (Red Hat 4.3.0-8) (GCC)
______________________________________________________
|  使用toolchain的開發方式,我當時使用的是別人做好的交叉編譯器,解壓後,直接到配置文
|  件夾下配置
|  #cd /etc
|  把編譯器路徑告訴核心,這叫做環境變數設定,即在bashrc中的後面加入
|  export PATH=/usr/local/arm/3.4.1/bin:$PATH
_______________________________________________________
   所以, 這裡就可以這樣繼續看交叉編譯器了
   # arm-linux-gcc
   gcc version 3.4.1

   其次,目的:寫個流水燈的驅動,其實就是寫個對led的操作罷了。命名led.c
具體板子具體分析,這就不貼出來了,接下來,寫個很簡單的Makefile,貼碼如下:
—————————————————————————————————————
ARCH= arm                                                                 # 說明平台
MVTOOL_PREFIX = /usr/local/arm/3.4.1/bin/arm-linux- #指定編譯器,本機或者交叉編譯器:絕對路徑
CROSS_COMPILE= $(MVTOOL_PREFIX)                       
KDIR   :=  /usr/src/linux-2.6.12                               #告訴使用的核心編譯
EXEC = led                                                             #檔案名稱
obj-m   :=   led.o                            #-m編譯成模組,注意參數 -y -名稱
PWD   :=  $(shell pwd)  
all:
 $(MAKE) -C $(KDIR) M=$(PWD)  modules
—————————————————————————————————————
#mkdir led  //建個檔案夾,將led.c和makefile這兩個源檔案cp過來,很簡單了。
#make     
#ls
led.c   led.mod.c  led.o led.ko  led.mod.o 
      看見了吧,make給幹了很過工作,結果完成任務是帶給我led.ko和其他的咚咚(中間檔案),

看準了,led.ko是所需模組(2.4核心以前是.o檔案),其他都不用關注。虛擬機器和本機設定了共

享,所以我直接拷貝過來,通過UART發送到FL2440,然後在板子操作

#insmod led.ko   //insmod 會調用module_init,這個放心

   最後,驅動一切都弄好了,寫個測試程式看看吧!這裡貼出ledshow.c
————————————————————————————————————
#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/ioctl.h"
#include "stdlib.h"
#include "termios.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "sys/time.h"

int main(void)
{
 int on=1;
 int led;
 int fd;
 fd=open("/dev/led",0);
 if(fd<0)
 {
  perror("open device led");
  exit(1);
 }
 printf("leds test show,press ctrl+c to exit /n");
 while(1)
 {
  for(led=0;led<4;led++)
  {
   ioctl(fd,on,led);
   usleep(50000);
  }
  on=!on;
 }
 close(fd);
 return 0;
}
——————————————————————————————————————
      同樣,我拷貝到led檔案夾下,這個很簡單了,不用寫makefile或用自動產生makefile檔案了。文

件這麼少,我們就省事點吧,花最少的時間完成最多的動作嘛。呵呵
#arm-linux-gcc -o ledshow ledshow.c  //交叉編譯器設定好,就是方便
#ls
led.c   led.mod.c  led.o    ledshow.c 
led.ko  led.mod.o  ledshow  Makefile
程式出爐了,將測試程式ledshow通過串口傳到開發板上。然後,
#chmod +x ledshow  //修改一下檔案許可權,可讀可寫可執行去。
#./ledshow

結果,OK!(開發板只有我看見哈哈)

對了,說明,我的核心源碼樹是在/usr/src/linux-2.6.12,隨便在任意目錄下幹像上面的事情,

得在源碼樹頂層目下配置過核心,編譯一下就好,否則好像會出錯,還沒研究怎麼回事。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.