[ARM應用]按鍵中斷驅動實例
****************************s3c2410_button_init()************************
本文引用地址:http://www.ex-cimer.com/article/201612/341050.htm*描述 :模塊加載,IO及相關變量初始化
*參數 :無
*返回值:無
*************************************************************************
*/
static int s3c2410_button_init(void)
{
int result;
set_irq_type(BUTTON_IRQ,IRQT_FALLING); //設置外部中斷0為下降沿中斷
dev_t devno = MKDEV(button_major,0);
if(button_major)
result = register_chrdev_region(devno,1,DEVICE_NAME);
else{
result = alloc_chrdev_region(&devno ,0 ,1,DEVICE_NAME);
button_major = MAJOR(devno);
}
if(result < 0)return result;
button_setup_cdev();
s3c2410_button_InitIO(); //初始化IO端口
dev.status = BUTTON_UP; //初始化按鍵狀態(tài)為抬起狀態(tài)
printk(DEVICE_NAME " initializedn");
return 0;
}
/*
****************************s3c2410_button_exit()************************
*描述 :模塊卸載
*參數 :無
*返回值:無
*************************************************************************
*/
static void s3c2410_button_exit(void)
{
cdev_del(&dev.cdev); //注銷設備
unregister_chrdev_region(MKDEV(button_major,0),1); //釋放設備號
}
module_init(s3c2410_button_init);
module_exit(s3c2410_button_exit);
MODULE_LICENSE("GPL");
(2)編寫Makefile文件(主機的/home/kernel/rootfs/rootfs/usr/button/driver目錄下)
vi Makefile
在該文件中加入以下內容:
#如果已定義KERNELRELEASE,則說明是從內核構造系統調用的,
#因此可利用其內建語句。
ifneq ($(KERNELRELEASE),)
obj-m := button.o
#要構建的模塊名稱為button.ko,
#并由兩個源文件生成(比如file1.c和file2.c)
#module-objs := file1.o file2.o
#否則,是直接從命令行調用的,
#這時要調用內核構造系統。
else
KERNELDIR := /home/kernel/linux-2.6.24.4
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.order *symvers
(3)編譯
make
執(zhí)行make命令進行編譯,編譯完成后,該目錄下有一些文件,其中button.ko就是編譯成功的模塊文件。
(4)加載模塊
首先設置內核以NFS方式加載根文件系統,在宿主機上運行minicom,加載完U-Boot,內核和nfs文件系統之后按回車鍵進入目標機shell控制臺,在目標機控制臺中輸入模塊加載命令:
insmod usr/led/driver/led.ko
insmod usr/button/driver/button.ko
如果輸出“button initialized”,表示button設備驅動加載成功
(5)編寫測試文件button_led.c(該測試程序還依賴LED的驅動)
進入宿主機的/home/kernel/rootfs/rootfs/usr/button/test目錄。
cd /home/kernel/rootfs/rootfs/usr/button/test
vi button_led.c
驅動測試文件button_led.c如下所示:
#include
#include
#include
#include
#include
#include
#define UP 0
#define DOWN 1
#define X 2
#define LED_ON 0
#define LED_OFF 1
int main()
{
int fd0,fd1,i,j;
int ret= 0;
int button_status;
fd0 = open("/dev/button",O_RDWR);//打開button設備fd0
if (fd0 == -1) {//打開fd0設備失敗
printf("open device button errr!n");
return 0;
}
fd1 = open("/dev/led",O_RDWR);//打開led設備fd1
if (fd1 == -1) {//打開fd1設備失敗
printf("open device led errr!n");
return 0;
}
ioctl(fd1,LED_OFF); //先熄滅D1
printf("button test show. press ctrl+c to exit n");
while(1) {//主循環(huán)
read(fd0,&button_status,1);//讀取按鍵的狀態(tài),看是否被按下
if(button_status == DOWN){//如果按鍵按下了
ioctl(fd1,LED_ON); //點亮D1
for(i=0;i<300;i++)
for(j=0;j<5000;j++);//延時一段時間
ioctl(fd1,LED_OFF); //熄滅D1
}
for(i=0;i<300;i++)
for(j=0;j<5000;j++);
}
close(fd0);//關閉fd0設備
close(fd1);//關閉fd1設備
return 0;
}
(6)編譯測試程序
arm-linux-gcc -o led_button led_button.c
該命令的意思是使用的交叉編譯器arm-linux-gcc對測試程序led_button.c進行編譯,編譯成功后在test目錄下會生成目標機的可執(zhí)行文件led_button。
(7)運行測試程序
創(chuàng)建設備
在目標機中,通過查看/proc/devices中注冊進內核的設備條目及相關的設備號。進入/dev目錄,創(chuàng)建設備,設備名為led,屬于字符型設備,主設備號是212,次設備號是0;創(chuàng)建設備,設備名為button,屬于字符型設備,主設備號是213,次設備號是0。(要與led.c和button.c文件中的定義相符):
cat /proc/devices
cd /dev
mknod led c 212 0
mknod button c 213 0
./usr/button/test/led_button或/usr/led/test/led_button
(10)卸載模塊
rmmod /dev/button
rmmod /dev/led
From:嵌入式Linux初級實驗
評論