码迷,mamicode.com
首页 > 其他好文 > 详细

第七章

时间:2016-06-05 21:13:50      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

前面了解到了开发Linux驱动程序的步骤,也做了一个小的实例,现在要更进一步了,让LED等发亮。

首先来介绍一下LED发亮的实现原理:虽然linux驱动直接与硬件打交道,但并不是linux驱动直接向硬件中的内存写数据,而是与本机的I/O内存进行交互。Linux内核的内存管理模块负责同步I/O内存与硬件中的数据。每一个连接linux的硬件在I/O内存中都会有映射首地址。

编写LED驱动是主要的,步骤为:

1.使用cdev_init函数初始化cdev , 描述设备文件

struct cdev{

  struct kobject kobj;    //封装设备文件的对象

  struct module *owner;   //指向内核模块的指针

  const struct file_operations *ops;  //指向file_operations结构体的指针

  struct list_head list;   //指向上一个和下一个cdev结构体的指针

  dev_t dev;  // 表示设备号,int类型,前12位主设备号,后20位次设备号

  unsigned int count;  //请求的连接设备编号范围(最大值),在建立多个设备文件时使用

}

void cdev_init(struct cdev *cdev,const struct file_operations *fops)

{

  memset(cdev,0,sizeof *cdev);

  INIT_LIST_HEAD(&cdev->list);

  kobject_init(&cdev->kobj,&ktype_cdev_default);

  cdev->ops = fops;

}

2.指定设备号    用1个int类型表示,前12位表示主设备号,后20位表示次设备号

int dev_number=MKDEV(major,minor); //major表示主设备号,minor表示次设备号

int major=MAJOR(dev_number);

int minor=MAJOR(dev_number);

3.使用cdev_add函数将字符设备添加到内核中的字符设备数组中

int cdev_add(struct cdev *p,dev_t dev,unsigned count)

{

  p->dec=dev;

  p->count-count;

  return kobj_map(cdev_map,dev,count,NULL,exact_match,exact_lock,p);

}

4.使用class_create 宏创建struct class

struct class *leds_class = NULL;

leds_class=class_create(THIS_MODULE,"dev_name");

5.使用device_create函数创建设备文件

device_create函数的原型如下:struct device *device_create(struct class *class,struct device *parent,dev_t devt,void *drvdata,const chahr*fmt,...)

leds_init函数是LED驱动的初始化函数:

static in leds_init(void)

{

  int ret;

  ret=leds_create_device();// 创建设备文件

  printk(DEVICE_NAME"\tinintialized\n");

}

module_init(leds_init);

在控制LED灯时有两种法方,通过字符串控制(使用file_operations.write函数)和AND 通过I/O命令控制LED(使用file_operations.ioctl函数)。

LED驱动的移植,首先要获取新的Linux内核的源代码,然后在新内核下重新编译即可。

 

第七章

标签:

原文地址:http://www.cnblogs.com/xianrenzhilu/p/5561616.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!