九编写led驱动
Posted suzkfly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了九编写led驱动相关的知识,希望对你有一定的参考价值。
led.c
1 #include <linux/init.h> 2 #include <linux/module.h> 3 #include <linux/cdev.h> 4 #include <linux/fs.h> 5 #include <linux/io.h> 6 7 #define GPMCON 0x7F008820 8 #define GPMDAT 0x7F008824 9 10 static int * __gp_gpmdat; 11 12 static int led_open (struct inode *p_inode, struct file *p_file) 13 { 14 int *p_gpmcon = NULL; 15 16 p_gpmcon = ioremap(GPMCON, 4); 17 writel(0x1111, p_gpmcon); 18 19 __gp_gpmdat = ioremap(GPMDAT, 4); 20 21 return 0; 22 } 23 24 static long led_ioctl (struct file *p_file, unsigned int cmd, unsigned long arg) 25 { 26 switch (cmd) { 27 case 0: 28 writel(0x0, __gp_gpmdat); 29 break; 30 31 case 1: 32 writel(0xF, __gp_gpmdat); 33 break; 34 35 default: 36 return -1; 37 } 38 return 0; 39 } 40 41 static struct cdev led_dev; 42 static struct file_operations fops = { 43 .open = led_open, 44 .unlocked_ioctl = led_ioctl, 45 }; 46 dev_t devno; 47 48 static __init int led_init (void) 49 { 50 cdev_init(&led_dev, &fops); 51 alloc_chrdev_region(&devno, 0, 1, "myled"); 52 cdev_add(&led_dev, devno, 1); 53 54 return 0; 55 } 56 57 static __exit void led_exit (void) 58 { 59 cdev_del(&led_dev); 60 unregister_chrdev_region(devno, 1); 61 } 62 63 module_init(led_init); 64 module_exit(led_exit); 65 66 MODULE_LICENSE("GPL");
led_app.c
1 #include <unistd.h> 2 #include <sys/ioctl.h> 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #include <fcntl.h> 7 8 int main(int argc, const char *argv[]) 9 { 10 int fd, cmd; 11 12 if (argc != 2) { 13 printf(".example: ./led_app 0 "); 14 return; 15 } 16 17 cmd = atoi(argv[1]); 18 19 fd = open("/dev/myled", O_RDWR); 20 21 ioctl(fd, cmd); 22 23 return 0; 24 }
Makefile
1 obj-m := led.o 2 KDIR = /home/linux/zkf/6410/urbetter-linux2.6.28-v1.0/ 3 4 all: 5 make -C $(KDIR) $(objs) M=$(PWD) modules CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm 6 arm-none-linux-gnueabi-gcc led_app.c -o led_app 7 sudo cp led.ko ~/zkf/6410/rootfs/home/test 8 sudo cp led_app ~/zkf/6410/rootfs/home/test 9 clean: 10 rm *.o *.symvers *.mod.c *.order
make之后会生成led.ko和led_app两个要用到的文件,在Makefile中已经将他们复制到了开发板挂载目录中。在开发板终端中输入命令:insmod led.ko 之后输入命令:cat /proc/devices 可以看到myled主设备号为251
输入命令:mknod /dev/myled c 251 0
之后便能执行应用程序led_app了,执行 ./led_app 0 则点亮所有LED,执行 ./led_app 1 则熄灭所有LED。
以上是关于九编写led驱动的主要内容,如果未能解决你的问题,请参考以下文章
实战!手把手教你如何编写一个Linux驱动并写一个支持物联网的LED演示demo