linux--LED设备驱动1
2011-10-05 14:11
281 查看
开发环境:红帽企业版5,mini2440-2.6.29版本
交叉编译器4.3.2
我是用mini2440板子运行的,适合没有驱动基础的同学的。
源代码如下:
makefile如下:
测试程序如下:
虚拟机运行图:
![](http://hi.csdn.net/attachment/201110/5/0_1317794884uOzf.gif)
开发板运行图
![](http://hi.csdn.net/attachment/201110/5/0_1317795081mfO3.gif)
本人弄了一上午才弄出来 让大家见笑了,一次记录我的驱动人生。
交叉编译器4.3.2
我是用mini2440板子运行的,适合没有驱动基础的同学的。
源代码如下:
#include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/delay.h> #include <asm/uaccess.h> #include <asm/irq.h> #include <asm/io.h> #include <mach/regs-gpio.h> #include <mach/hardware.h> #include <linux/gpio.h> //#include <mach/gpio-nrs.h> #define LED_MAJOR 234 #define DEVICE_NAME "leds" static unsigned long led_table[]={ S3C2410_GPF3, S3C2410_GPF4, S3C2410_GPF5, S3C2410_GPF6, }; static unsigned long led_cfg_table[]={ S3C2410_GPF3_OUTP, S3C2410_GPF4_OUTP, S3C2410_GPF5_OUTP, S3C2410_GPF6_OUTP, }; int led_ioctl(struct inode *inode, struct file *file, unsigned int cmd , unsigned long arg){ switch(cmd){ case 0: s3c2410_gpio_setpin(led_table[0],0); s3c2410_gpio_setpin(led_table[1],1); s3c2410_gpio_setpin(led_table[2],1); s3c2410_gpio_setpin(led_table[3],1); break; case 1: s3c2410_gpio_setpin(led_table[0],1); s3c2410_gpio_setpin(led_table[1],0); s3c2410_gpio_setpin(led_table[2],1); s3c2410_gpio_setpin(led_table[3],1); break; case 2: s3c2410_gpio_setpin(led_table[0],1); s3c2410_gpio_setpin(led_table[1],1); s3c2410_gpio_setpin(led_table[2],0); s3c2410_gpio_setpin(led_table[3],1); break; case 3: s3c2410_gpio_setpin(led_table[0],1); s3c2410_gpio_setpin(led_table[1],1); s3c2410_gpio_setpin(led_table[2],1); s3c2410_gpio_setpin(led_table[3],0); break; default: return -EINVAL; break; } return 0; } struct file_operations led_ops = { .owner = THIS_MODULE, .ioctl = led_ioctl, }; static int __init init_led(void) { int i, ret; ret = register_chrdev(LED_MAJOR,DEVICE_NAME,&led_ops); if(ret < 0){ printk(DEVICE_NAME, "can't register major number/n"); } for(i = 0; i < 4; i++){ s3c2410_gpio_cfgpin(led_table[i],led_cfg_table[i]); s3c2410_gpio_setpin(led_table[i],1); } printk(DEVICE_NAME "initialized/n"); return 0; } static void __exit exit_led(void) { unregister_chrdev(LED_MAJOR,DEVICE_NAME); } module_init(init_led); module_exit(exit_led); MODULE_LICENSE("GPL"); MODULE_AUTHOR("linwei");
makefile如下:
ifneq ($(KERNELRELEASE),) obj-m := led2.o else KDIR := /home/smb/kernel/linux-2.6.29 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
测试程序如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> int main(int argc, char **argv) { int on; int led_no; int fd; if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 || on < 0 || on > 1 || led_no < 0 || led_no > 3) { fprintf(stderr, "Usage: leds led_no 0|1\n"); exit(1); } fd = open("/dev/leds", 0); if (fd < 0) { fd = open("/dev/leds", 0); } if (fd < 0) { perror("open device leds"); exit(1); } ioctl(fd, on, led_no); close(fd); return 0; }
虚拟机运行图:
![](http://hi.csdn.net/attachment/201110/5/0_1317794884uOzf.gif)
开发板运行图
![](http://hi.csdn.net/attachment/201110/5/0_1317795081mfO3.gif)
本人弄了一上午才弄出来 让大家见笑了,一次记录我的驱动人生。
相关文章推荐
- Linux字符设备驱动之Tiny6410 LED驱动分析
- 基于linux的虚拟平台设备驱动 led架构
- linux平台总线驱动设备模型之点亮LED
- Linux 字符设备驱动开发基础(一)—— 编写简单 LED 设备驱动
- “手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- 【复习】linux之LED驱动的设备树方式
- linux平台总线驱动设备模型之点亮LED
- TQ2440 LINUX 2.6.30.4 LED驱动感言,从最初的打印字符,到自动分配设备号,到自动创建设备节点,到次设备号分控led
- s3c2440基于linux的gpio led字符设备驱动
- [置顶] linux设备驱动篇之LED驱动(一)
- Linux驱动开发之四-----LED改进测试(增加自动创建设备节点)
- s3c2440基于linux的gpio led字符设备驱动实践
- Linux输入子系统(6):设备驱动层之LED驱动
- TQ2440 LINUX 2.6.30.4 LED驱动感言,从最初的打印字符,到自动分配设备号,到自动创建设备节点,到此设备号分控led
- linux2.6.32 led 设备驱动及应用程序
- Linux 字符设备驱动 LED
- 编写LED混杂设备驱动:静态映射,如何用Linux内核里的gpio_request(),gpio_set_value()等函数,ioctl函数
- 手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- tiny6410 linux混杂设备 led驱动
- 嵌入式Linux字符设备入门之--LED驱动详解