一、實驗環境
開發機環境
作業系統:ubuntu 10.10
交叉編譯環境:arm-linux-gcc 4.4.1,安裝位置 /usr/local/arm/4.4.1/
6410板子核心原始碼路徑:/work/linux-2.6.36.2-v1.05/
目標板環境:ok6410-a linux2.6.36
二、實驗原理
控制led是最簡單的一件事情,我們學習led驅動程式,就相當於學習其他程式語言是的「hello world」程式一樣,是乙個入門的程式。
學習驅動程式,必須要對硬體有所了解,接下來看幾個與硬體相關的材料。
ok6410 led原理圖
ok6410 led原理圖
從上面的原理圖可以得知,led與cpu引腳的連線方法如下,低電平點亮。
led1 -gpm0
led2 -gpm1
led3 -gpm2
led4 -gpm3
從資料手冊可以找到相應的控制方法。這裡我們以led1為例,介紹一下led1的操作方法,其他的類似,請大家自行分析。
通過上面可以得知,需要先將gpm0設定為輸出方式。將相應的暫存器進行配置。
然後將gpmdat暫存器的第0位置0燈亮,置1燈滅。
三、實驗步驟
1、編寫驅動程式
driver_led.c
#include
#include
#include
#include /* copy_to_user,copy_from_user */
#include
#include
#include
#include
#include
#include
//#define led_major 240
#define device_name "ok6410_leds"
int led_open (struct inode *inode,struct file *filp)
ssize_t led_read (struct file *filp, char __user *buf, size_t count,loff_t *f_pos)
ssize_t led_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)
return count;
}int led_release (struct inode *inode, struct file *filp)
struct file_operations led_fops =;
static struct miscdevice misc = ;
int __init led_init (void)
printk ("ok!\n");
return 0;
}void __exit led_exit (void)
module_init(led_init);
module_exit(led_exit);
makefile檔案
ifneq ($(kernelrelease),)
obj-m := ok6410_led_new.o
else
kdir := /home/doublechen/forlinx/linux-2.6.36.2-v1.05
all:
make -c $(kdir) m=$(pwd) modules arch=arm cross_compile=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul*
endif
2、編寫測試程式
test.c
#include
#include
#include
#include
int main (void)
;fd = open("/dev/ok6410_leds",o_rdwr);
if (fd < 0)
while(1)
close (fd);
return 0;
} 3、編譯驅動程式與測試程式
編譯驅動程式
#make
編譯測試程式
#arm-linux-gcc test.c -o test
將開發板的ip位址修改,與主機在同乙個網段。確保pc的tftp服務開啟。
smdk6410# tftp -l /lib/modules/2.6.36.2/driver_led.ko -r driver_led.ko -g 192.168.1.111 192.168.1.111為伺服器ip
smdk6410# tftp -l test -r test -g 192.168.1.111
5、測試
載入驅動 #insmod /lib/modules/2.6.36.2/driver_led.ko
測試 ./test
[root@forlinx6410]# ./test
此時可以看到ok6410板子上的led0在閃爍。
解除安裝驅動 #rmmod driver_led
字元裝置驅動 Led
驅動檔案 使用linux3.2.81核心 include include include include include include include include include include include static struct class ledsdrv class 類結構體 st...
字元裝置驅動 LED型
字元驅動程式 對於led型別的字元裝置驅動函式編寫 1 建立乙個file operation結構體,裡面會有點燈操作的各個硬體操作函式 2 編寫乙個drv init 函式 3 要對drv init函式進行修飾為入口函式,告訴核心,載入驅動時進行掛接 4 有init函式,那麼也會有出口函式exit m...
字元裝置驅動 LED驅動程式
int main open sys.open led.open write sys.write led.write 第一步 驅動功能實現 static int first drv open struct inode inode,struct file file static ssize t firs...