zoukankan      html  css  js  c++  java
  • 第七章心得

      本章中主要学到控制发光二极管,在本章会完成一个真正意义上的 Linux 驱动。该Linux驱动用来控制开发版上的4个LED 小灯。也就是说通过向Linux 驱动发送数据可以控制LED小灯的开关。  

    编写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" inintialized ");

        }

        module_init(leds_init);

    6、卸载设备文件

        static void leds_destroy_device(void)

        {

          device_destroy(leds_class,dev_number);//移除通过device_create函数建立的字符设备

          if(leds_calss)//销毁struct class

            class_destroy(leds_class);

           unregister_chrdev_region(dec_number,DEVICE_NUMBER);//注销字符设备区域

          return;

        }

        static void leds_exit(void)

        {

          leds_destroy_device();//卸载LED驱动的设备文件

          printk(DEVICE_NAME" exit! ");

        }

        module_exit(leds_exit);

    7、分配寄存器

        leds_init_gpm函数初始化寄存器

        在leds_init函数中调用leds_init_gpm函数完成寄存器的初始化

        static int leds_init(void)

        {

          int ret;

          ret=leds_create_device();

          leds_init_gpm(0xE);//初始化寄存器

          printk(DEVICE_NAME"tinitialized ");

          return ret;

        }

    8、控制LED

        两种方式:通过字符串控制(使用file_operations.write函数)

             AND 通过I/O命令控制LED(使用file_operations.ioctl函数)

    测试LED驱动

      最后进行测试led驱动,方法有一下几种:

      1.编写测试 f/0 控制命令的通用程序

      2.使用 NDK 测试 LED 驱动

      3.使用 Java 测试 LED 驱动

    LED驱动的移植

      LED 驱动最简单的移植就是将其 在不同 Lim版本下进行编译。

      

     http://www.cnblogs.com/wulilele/

  • 相关阅读:
    【python】UI自动化框架搭建.优化
    【fiddler】mock测试
    【postman】对于postman简单的理解
    【pycharm】报错:windows找不到文件chrome
    【python】UI自动化操作属于div标签的滚动条滚动
    【fiddler】fiddler监听local host和127.0.0.1
    【PLSQL】PLSQL过期解决方案(注册机或者修改注册表)
    【奇怪的知识四】:一些常用的下载网站地址
    【奇怪的知识三】:一个可以变色的心形.bat
    python中request获取json数据
  • 原文地址:https://www.cnblogs.com/wulilele/p/5560756.html
Copyright © 2011-2022 走看看