1. 程式人生 > >JZ2440_V3_內核驅動程序_點亮一個LED燈

JZ2440_V3_內核驅動程序_點亮一個LED燈

準備 程序編譯 led燈 ice 燒錄 2.6 usr 驅動程序 理解

為了用內核驅動程序點亮一個LED燈,真是費盡周折,參考了韋東山的《嵌入式linux驅動開發完全手冊》(以下簡稱《完全手冊》)和網上很多人的blog,最終在@Carlos·Wei的指引下,終於點亮了LED燈,見下圖!
技術分享圖片

其中的一些彎路主要是沒嚴格按照韋東山的linux版本和其編譯器來編譯內核和驅動程序,二來是因為韋東山這本書當時寫的不是那麽詳細,在理解上有些許偏差。
下面在寫這篇博客時列出我的開發環境等信息

開發環境

  • linux Ubuntu 16.04
  • arm-linux-gcc-3.4.5-glibc-2.3.6 版本(用《完全手冊》指定的編譯器,我當時用的arm-linux-gcc4.4.3版本,結果編譯出的程序在JZ2440開發板上無法運行)
  • 開發板中u-boot為板載資料提供
  • 開發板中linux內核版本為linux-2.6.22.6
  • 開發板中yaffs文件系統為板載資料提供

一、點亮一個LED燈需要做的準備工作


首先引用宋寶華《linux設備驅動開發詳解》中P66的一段話
在linux內核中增加程序需要完成以下3項工作。

  • 將編寫的源代碼復制到linux內核源代碼的相應目錄中。
  • 在目錄的Kconfig文件中增加關於新源代碼對應項目的編譯配置選項。
  • 在目錄的Makefile文件中增加對新源代碼的編譯條目。

確保按照韋東山的那個PDF對內核文件進行打補丁在進行後續工作哦!

技術分享圖片


第一步:修改linux-2.6.22.6內核文件

1)配置頂層Makefile(主要是配置編譯器為arm-linux-gcc-3.4.5-glibc-2.3.6所在路徑)
技術分享圖片

2)增加s3c2440配套的內核驅動源程序到 /drivers/char/ 目錄下
????由於韋東山在《完全手冊》的資料裏提供的/drivers/leds/s3c24xx_leds.c是適配V2和V1版本的,筆者使用的是JZ2440_V3版本,不做修改就執行以下步驟你在V3版本上是點不亮的哦。V3版本的LED是鏈接到GPF上的,不是GPB上,如圖:
技術分享圖片
技術分享圖片
所以,這裏要做一下調整才行的:
技術分享圖片
3)配置 /drivers/char 目錄下的Kconfig
技術分享圖片

4)配置 /drivers/char目錄下的Makefile
技術分享圖片

第二步:配置menuconfig

在內核linux-2.6.22.6根文件目錄下執行

make menuconfig

在內核目錄樹內依次選擇
Device Drivers --->
????Character devices --->
????????<*> S3C2440_LEDS MULTIMICRO(NEW)
在光標停留在S3C2440...選項上時,可以通過敲擊前盤空格來配置是將改驅動程序編譯到內核中還是編譯為一個.ko文件(獨立的文件,可供內核加載),本文加載到內核匯裏面去了,免去了加載到內核中的繁瑣。然後配置完後,一路Exit然後Yes即可,配置後終端會提示如下信息:
技術分享圖片

第三步:將驅動程序編譯至內核中

然後在分別執行

make s3c2410_defconfig
make -j8

make s3c2410_defconfig 作用先不做解釋(也可不執行該命令!)
然後在執行

make uImage -j8

結果如圖,可以看出編譯好的內核文件uImage已經生產,在/arch/arm/boot/目錄下面,此時的內核文件中已經包含了s3c2400的LED驅動程序。
技術分享圖片

第四步:編譯驅動測試程序

該程序目的是為了調用內核中的LED驅動函數
改程序在韋東山《完全手冊》配套的光盤資料裏面的/drivers_and_test/leds/s3c24xx_leds.c中
在編譯改.c程序前,首先修改.c同一目錄下得Makefile文件,主要是配置為與編譯內核一致的編譯器
技術分享圖片

然後make一下就會生產可執行文件

make

技術分享圖片

至此,準備工作都已經完成,接下來開始使用這些生成的uImage 和 led_test文件

二、測試LED內核驅動

第一步:燒錄uImage內核文件

首先把上文產生的內核文件uImage燒錄至jz2440開發板中(默認你已經燒錄了yaffs文件系統哦,否則無法再終端進行一下步驟),重啟開發板後,可以在終端看到如下界面
技術分享圖片
然後在終端按下回車會看到如下界面,現在就可以使用cd、ls等命令了
技術分享圖片

第二步:將上文生產的led_test可執行文件傳輸至開發板中

  • 可以用ftp傳
  • 可以用scp傳
  • 可以用U盤傳(本文選用此種方式)
    用u盤傳就要掛載U盤了,以此處為基準倒數第二個圖片可以看到 [sda] 這些信息行,其上還有我的U盤型號 SanDisk Cruzer Force,表示開發板已經檢測到了U盤,因為我的在U盤一直在開發板上插著,所以啟動時就自動檢測了。當然你插上U盤後也會顯示這些信息,通過
fdisk -l

技術分享圖片

可以查看U盤的的設備點,然後下一步就是在開發板的/mnt/目錄下建立一個文件夾,用於將U盤的裏的文件都掛載到這個文件夾下,我在/mnt/文件夾下建立了一個sandisk的文件夾。
技術分享圖片
接下來就可以掛載U盤到sandisk文件夾下了,執行以下命令:

mount -t auto /dev/sda1 /mnt/sandisk

技術分享圖片

然後cd到sandisk文件夾下就可以ls出U盤裏的內容了,將led_test文件cp到開發板/usr/bin/文件夾下就ok了
第三步:建立led驅動設備文件
執行命令(詳見《完全手冊》P395)

mknod /dev/leds c 231 0

第四步:執行內核驅動測試程序
執行命令

led_test 1 on
led_test 1 off

技術分享圖片

可以看到開發板的第一個led點亮和熄滅
若你的led_test可執行文件不在開發板/usr/bin/文件夾下,那在改可執行文件所在目錄下執行

./led_test 1 on
./led_test 1 off

也可以的
若提示Illegal instruction那說明你編譯led_test執行文件所使用的編譯器和編譯內核的編譯器不是同一個!改成同一個編譯器就好了

JZ2440_V3_內核驅動程序_點亮一個LED燈