Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121057
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 296
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-10 21:57
文章分类

全部博文(31)

文章存档

2016年(4)

2015年(27)

我的朋友

分类: LINUX

2015-02-12 14:31:16

1、led驱动代码。led.c

点击(此处)折叠或打开

  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/cdev.h>
  4. #include <linux/fs.h>
  5. #include <linux/io.h>
  6. #include "led.h"

  7. MODULE_LICENSE("GPL");

  8. #define GPBCON 0x56000010
  9. #define GPBDAT 0x56000014

  10. unsigned int *led_config;
  11. unsigned int *led_data;

  12. struct cdev cdev;
  13. dev_t devno;

  14. int led_open(struct inode *node, struct file *filp)
  15. {
  16.     led_config = ioremap(GPBCON,4);//将物理地址转化为虚拟地址
  17.     writel(0x00015400,led_config);// 15400 设置配置寄存器
  18.     led_data = ioremap(GPBDAT,4);

  19.     return 0;
  20. }

  21. long led_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
  22. {
  23.     switch(cmd)
  24.     {
  25.      case LED_ON:
  26.          writel(0x00,led_data);
  27.          return 0;

  28.         case LED_OFF:
  29.             writel(0xff,led_data);
  30.             return 0;

  31.         default :
  32.          return -EINVAL;
  33.     }
  34. }

  35. static struct file_operations led_fops=
  36. {
  37.     .open = led_open,
  38.     .unlocked_ioctl = led_ioctl,
  39. };

  40. static int led_init()
  41. {
  42.     //设备初始化
  43.     cdev_init(&cdev, &led_fops);

  44.     //获得设备号
  45.     alloc_chrdev_region(&devno, 0, 1, "myled");
  46.     //注册设备
  47.     cdev_add(&cdev,devno,1);

  48.     return 0;
  49. }

  50. static void led_exit()
  51. {
  52.     //注销设备
  53.     cdev_del(&cdev);
  54.     //注销设备号
  55.     unregister_chrdev_region(devno,1);
  56. }

  57. module_init(led_init);
  58. module_exit(led_exit);

2、led.h
点击(此处)折叠或打开
  1. #define LED_MAGIC 'L'
  2. #define LED_ON _IO(LED_MAGIC,0)
  3. #define LED_OFF _IO(LED_MAGIC,1)

3、Makefile
点击(此处)折叠或打开
  1. obj-m := led.o
  2. KDIR := /home/win/code3/my2440/linux-2.6.39
  3. all:
  4.     make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
  5. clean:
  6.     rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order
make生成内核模块,led.ko文件
#make

4、led测试代码。led_app.c
点击(此处)折叠或打开
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <sys/ioctl.h>
  5. #include "led.h"

  6. int main(int argc, char *argv[])
  7. {
  8.     int fd;
  9.     int cmd;

  10.     if(argc <2)
  11.     {
  12.      printf("Please enter the sencond para!\n");
  13.         return 0;
  14.     }

  15.     cmd = atoi(argv[1]);
  16.     
  17.     fd = open("/dev/myled",O_RDWR);

  18.     if(cmd == 1)
  19.         ioctl(fd,LED_ON);
  20.     else if(cmd == 0)
  21.         ioctl(fd,LED_OFF);

  22.     return 0;
  23. }
因为根文件系统没有一些库文件,所以需要采用静态编译的方式编译led_app.c文件
arm-linux-gcc -static led_app.c -o led_app

5、测试代码。
5.1启动开发板,将led.ko 和 led_app放到rootfs文件夹下,用nfs挂接linux服务器下的文件夹
#mount -t nfs -o nolock 192.168.1.101:/home/win/code3/my2440/myroot/rootfs /mnt
#cd /mnt
5.2 加载内核模块led.ko
#insmod led.ko
5.3 查看myled主设备号
#cat /proc/devices
#252 myled
5.4 创建设备文件
#mknod /dev/myled c 252 0
5.5 运行 led_app
#./led_app 1  (点亮所有led)
#./led_app 0  (熄灭所有led)

阅读(1464) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~