led驅(qū)動(dòng)程序:
#include<linux/kernel.h> #include<linux/module.h> #include<linux/device.h> #include<linux/types.h> #include<linux/ioctl.h> #include<linux/errno.h> #include<linux/init.h> #include<linux/cdev.h> #include<asm/uaccess.h> #include<linux/fs.h> #include<asm/io.h> #include<mach/regs-gpio.h> #define DEVICE_NAME "led" #define LED1 S3C2410_GPB5 #define LED_ON 0 struct s3c2410_led_dev static struct s3c2410_led_dev dev; void s3c2410_led_InitIO(void); void s3c2410_led_InitIO(void) static int s3c2410_led_open(struct inode *inode,struct file *filp) static int s3c2410_led_release(struct inode *inode,struct file *filp) static int s3c2410_led_ioctl(struct inode *inode,struct file *filp,unsigned int cmd ,unsigned long arg) static ssize_t s3c2410_led_read(struct file *filp,char *buffer,size_t count,loff_t *ppos) static ssize_t s3c2410_led_write(struct file *filp,char *buffer, size_t count,loff_t *ppos) static struct file_operations s3c2410_led_fops={ static void led_setup_cdev(void) static int s3c2410_led_init(void) static void s3c2410_led_exit(void) module_init(s3c2410_led_init); module_exit(s3c2410_led_exit); MODULE_LICENSE("GPL"); Makefile文件: obj-m:=led.o
KDIR:=/opt/EmbedSky/linux-2.6.30.4 PWD:=$(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules/*先用-C參數(shù)指定內(nèi)核源碼的目錄,這樣make時(shí)會(huì)進(jìn)入到內(nèi)核源碼目錄,M=$PWD或SUBDIRS=$PWD,指定要編譯的模塊所在目錄,make modules時(shí),內(nèi)核主makefile會(huì)執(zhí)行此目錄下的Makefile,編譯模塊*/ //SUBDIRS 也可以用M代替 clean:
-rm -f led.mod.c modules.order Module.symvers -rm -f *~ core *.o *.ko 生成.ko文件后下載到開(kāi)發(fā)板/usr/led,加載insmod led.ko 。在/dev/下創(chuàng)建設(shè)備(有的會(huì)自動(dòng)創(chuàng)建)mknod led c 212 0。 (查資料:如果在程序中添加函數(shù)class_create和device_create(分別創(chuàng)建類和節(jié)點(diǎn)),就能夠在/dev目錄下自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn))
通過(guò)cat /proc/devices查看掛載有沒(méi)有成功。
測(cè)試文件led_test.c
#include<stdio.h>
#include<stdlib.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" #define LED_ON 0
#define LED_OFF 1 int main()
{ int fd,i,j; int led_status=0; fd=open("/dev/led",O_RDWR); if(fd<0) { perror("open device led failed!"); exit(1); } printf("led test show.press ctrl +c exit /n"); ioctl(fd,LED_OFF); while(1) { read(fd,&led_status,1); if(led_status==0) ioctl(fd,LED_ON); else if(led_status==1) ioctl(fd,LED_OFF); printf("led:on and off\n"); for(i=0;i<300;i++) for(j=0;j<10000;j++);
} close(fd); return 0; } 編譯arm-linux-gcc -o led_test led_test.c。產(chǎn)生led_test文件。
下載到/usr/led/test/目錄下,改變文件的執(zhí)行權(quán)限:chmod +x led_test。
執(zhí)行:./led_test
OK,燈亮
|
|
來(lái)自: jianbin226 > 《arm驅(qū)動(dòng)》