一、一个简单的驱动程序实例

led_drv.c 驱动文件:

#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 <asm/arch/regs-gpio.h>
#include <asm/hardware.h>

#define DEVICE_MAJOR 111
#define DRIVER_NAME "led_drv"

int led_open(struct inode *inode, struct file *file)
{
  printk(KERN_EMERG "led_drv_open.\n");
  return 0;
}

int led_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
  printk(KERN_EMERG "led_drv_write.\n");
  return 0;
}

int led_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
  printk(KERN_EMERG "led_drv_read.\n");
  return 0;
}

static struct file_operations led_fopt = {
  .open = led_open,
  .write = led_write,
  .read = led_read,
};

int __init led_init()
{
  int ret;
  ret = register_chrdev(DEVICE_MAJOR, DRIVER_NAME, &led_fopt);      //注册驱动
  if(ret<0)
  {
    printk(KERN_EMERG "can't register major number.\n");
    return ret;
  }
  return 0;
}

void __exit led_exit()
{
  unregister_chrdev(DEVICE_MAJOR, DRIVER_NAME);               //卸载驱动
}

module_init(led_init);

module_exit(led_exit);

MODULE_LICENSE("GPL");

Makefile 文件:

obj-m += led_drv.o

KERN_DIR = /work/system/linux-2.6.22.6

all:
  make -C $(KERN_DIR) M=`pwd` modules

clean:
  make -C $(KERN_DIR) M=`pwd` modules clean
  rm -rf modules.order

使用 make 命令编译,生成 led_drv.ko, 拷贝 led_drv.ko 至 U 盘, 使用 mount /dev/sda1 /mnt/usb 命令加载 U 盘( mnt 下无 usb 目录需提前新建 )

加载模块 insmod led_drv.ko

卸载模块 rmmod led_drv 

led_app 测试文件:  

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main(int argc, char **argv)
{
  int fd;
  int val = 1;
  fd = open("/dev/led_dev", O_RDWR);
  if(fd<0)
  {
    printf("can not open \n");
  }

  write(fd, &val, 4);
  read(fd, &val, 4);
  return 0;
}

使用 arm-linux-gcc -o led_app led_app.c 命令编译 ( 这里只有一个文件就不写 Makefile 了 ), 生成 led_app 拷贝至 U 盘, 并加载  U 盘

重新加载模块 insmod led_drv.ko

运行 ./led_app 发现控制台打印 can not open, 这是因为虽然有了设备驱动, 但是没有设备文件, 所以 open 失败, 因此要先创建设备文件

创建设备文件:

    mknod /dev/led_dev c 111 0

  其中led_dev为设备文件(设备节点)的名称, c表示次设备为字符设备, 111表示该设备所对应的主设备号为111, 0表示该设备的次设备号为0

  运行 ./led_app, 控制台输出:

    led_drv_open.

    led_drv_write.

    led_drv_read.

       

最新文章

  1. Java 密码扩展无限制权限策略文件
  2. linux 双网卡实现
  3. css定位左移动多少距离
  4. DB2数据库中SQL语句中使用or和and的关键字的时候注意事项
  5. CF 15/09/23
  6. Android(java)学习笔记117:英文朗诵android App编写实例
  7. JavaScript jQuery 事件、动画、扩展
  8. 【Web Service】WSDL文档
  9. 你真的了解volatile吗,关于volatile的那些事
  10. Count Color 线段树
  11. 【ASP.NET MVC 学习笔记】- 12 Filter
  12. 【一天一道LeetCode】#33. Search in Rotated Sorted Array
  13. (视频) 《快速创建网站》 3.2 WordPress多站点及Azure在线编辑器 - 扔掉你的ftp工具吧,修改代码全部云端搞定
  14. Objective-C的面向对象特性(一)
  15. JS自定义鼠标右击菜单
  16. grpc(一)grpc-java之helloworld
  17. 如何运用kali-xplico网络取证分析?点开看看吧
  18. Windows pip安装失败:no module named pkg_resources
  19. c/c++中的关键字(static、const、inline、friend)
  20. MYSQL BENCHMARK()函数

热门文章

  1. 文件上传中UUID的解读
  2. Vertical viewport was given unbounded height
  3. Linux 进程管理、系统状态查询
  4. String.split()与StringUtils.split()
  5. 了解C语言
  6. 剑指offer(41)和为S的连续正数序列
  7. JAVA中的责任链模式(CH02)
  8. 转 flowcanvas
  9. redis+spring 整合
  10. SOAPdenove 使用