Linux內核提供了多個與I/O內存交互的函數,如ioread1六、ioread3二、iowrite1六、iowrite32等。Linux內核的內存管理模塊負責同步I/O內存與硬件中的數據。java
每個鏈接linux的硬件在I/O內存中都會有映射首地址。在使用ioread1六、ioread32等函數讀寫I/O內存時須要指定這些首地址,開發板上的led也有其映射首地址。linux
此例子的原理:如圖,LED1-LED2分別與GPC0_三、GPC0_4相連,經過GPC0_三、GPC0_4引腳的高低電壓來控制三極管的導通性,從而控制LED的亮滅。數組
根據三極管的特性,當這個引腳輸出高電平時,集電極和發射極導通,發光二極管點亮;反之,發光二極管熄滅;函數
經過控制GPC0CON和GPC0DAT來控制GPC0_3和GPC0_4對應的led。工具
具體步驟:測試
一:建立led驅動的設備文件命令行
1.使用cdev_init 函數初始化cdev內存
2.指定設備號開發
3.使用cdev_init函數將字符設備添加到內核中的字符設備數組中字符串
4.使用class_create宏建立struct class
5.使用device_create函數建立設備文件
二:卸載led驅動的設備文件
卸載Linux驅動的設備文件稍微簡單一些,須要依次調用 device_destroy、class_destroy和 unregister_chrdev_region方法。
三:設置寄存器與初始化led驅動
經過設置不一樣寄存器的值,可惡意設置led引腳的狀態、打開或禁止上拉電路以及控制led的亮和滅。
四:控制led
能夠經過 1:字符串控制led;(file_oprations.write函數) 2 :I/O命令控制led(file_oprations.icoctl函數)
五:led驅動的模塊參數
使用模塊參數是爲了裝載led驅動時指定默認狀態值
測試led驅動
編寫測試I/O控制命令的通用程序
LED驅動有兩種與設備文件交互的方式:直接寫入字符串數據和I/O控制命令。直接向設備文件寫入數據可使用命令行方式來完成,也能夠經過write函數完成。
使用NDK測試led驅動
NDK程序測試和可執行程序測試差很少。只不過NDK Library 能夠被Java程序調用,而在Android系統中測試Linux驅動,最直接的方法就是使用NDK。
使用java測試led驅動
Java只能經過發送控制字符測試led驅動
Led驅動的移植
在新的內核下從新編譯便可
創建工做目錄,拷貝源碼
$ mkdir worker/driver
$ cd /workdir/driver/
$ cp /mnt/hgfs/share/linux-3.2-FS210-V3.tar.bz2 ./
$ cp /mnt/hgfs/share/linux3.2Drivers/ ./ -a
解壓內核代碼
$ tar xvf linux-3.2-FS210-v3.tar.bz2
編譯內核源碼
$ cd /workdir/driver/linux-3.2-FS210-V3
$ cp fs210_defconfig .config
$ make zImage
編譯驅動源碼
$ cd /workdir/driver/linux-3.2Drivers/fs210_led
修改Makefile文件,修改成咱們的內核源碼的路徑和交叉工具鏈。保存退出。
$ make
查看編譯生成的ko文件,並拷貝到nfs文件系統目錄中。
$ ls
$ cp fs210_led.ko /source/rootfs/
執行make led_test命令編譯測試文件。
$ make led_test
執行代碼:
啓動開發板,查看文件系統文件
$ ls
加載驅動
$ insmod fs210_led.ko
$ mknod /dev/led c 250 0
$ chmod 777 /dev/led
$ ./led_test
實驗現象
Led1間隔閃爍。
第八章
1. 什麼是PWM?
PWM(脈衝寬度調製)簡單的講是一種變頻技術之一,是靠改變脈衝寬度來控制輸出電壓,經過改變週期來控制其輸出頻率。若是還不是很清楚,好吧,來看看咱們實際生活中的例子,咱們的電風扇爲何扭一下按扭,風扇的轉速就
會發生變化;調一下收音機的聲音按鈕,聲音的大小就會發生變化;還有待會兒咱們要講的蜂鳴器也會根據不一樣的輸入值而發出不一樣頻率的叫聲等等!!這些都是PWM的應用,都是經過PWM輸出的頻率信號進行控制的。
2. 蜂鳴器的種類和工做原理
蜂鳴器主要分爲壓電式蜂鳴器和電磁式蜂鳴器兩種類型。
壓電式蜂鳴器主要由多諧振盪器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發光二極管。多諧振盪器由晶體管或集成電路構成。當接通電源後(1.5~15V直流工做電壓),多諧振盪器起振,輸出1.5~2.5kHZ的音頻信號,阻抗匹配器推進壓電蜂鳴片發聲。
電磁式蜂鳴器由振盪器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源後,振盪器產生的音頻信號電流經過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互做用下,週期性地振動發聲。
有源蜂鳴器和無源蜂鳴器的區別:這個「源」字是否是指電源,而是指震盪源,即有源蜂鳴器內有振盪源而無源蜂鳴器內部沒有振盪源。有振盪源的通電就能夠發聲,沒有振盪源的須要脈衝信號驅動才能發聲。
一個完整的PWM驅動,經過I/O命令能夠打開和中止PWM。PWM驅動包含3個文件pwm.c、pwm_fun.h、pwm_fun.c組成。其中pwm.c是主程序,pwm_fun.h引用了相應的頭文件,以及定義了一些宏。pwm_fun.c文件包含了打開和中止pwm的兩個函數(pwm_start和pwm_stop)。Pwm驅動和led驅動的實現流程類似,所以掌握linux驅動經常使用的代碼重用方式很重要。