日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

控制发光二极管

發(fā)布時間:2023/11/27 生活经验 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 控制发光二极管 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一 LED驅動的實現(xiàn)原理

盡管Linux驅動直接與硬件打交道,但并不是Linux驅動直接向硬件中的內存寫數(shù)據(jù),而是與本機的I/O內存進行交互。每一個連接Linux的硬件在I/O內存中都會有映射首地址,開發(fā)板上的LED也有其映射首地址。

二 編寫LED驅動?

第一步:使用cdev_init函數(shù)初始化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;

}

第二步:指定設備號 ? ?用1個int類型表示,前12位表示主設備號,后20位表示次設備號

int dev_number=MKDEV(major,minor); //major表示主設備號,minor表示次設備號

int major=MAJOR(dev_number);

int minor=MAJOR(dev_number);

第三步:使用cdev_add函數(shù)將字符設備添加到內核中的字符設備數(shù)組中

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);

}

第四步:使用class_create 宏創(chuàng)建struct class

struct class *leds_class = NULL;

leds_class=class_create(THIS_MODULE,"dev_name");

第五步:使用device_create函數(shù)創(chuàng)建設備文件

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

leds_init函數(shù)是LED驅動的初始化函數(shù):

static in leds_init(void)

{

  int ret;

  ret=leds_create_device();// 創(chuàng)建設備文件

  printk(DEVICE_NAME"\tinintialized\n");

}

module_init(leds_init);

第六步:卸載設備文件

static void leds_destroy_device(void)

{

  device_destroy(leds_class,dev_number);//移除通過device_create函數(shù)建立的字符設備

  if(leds_calss)//銷毀struct class

    class_destroy(leds_class);

   unregister_chrdev_region(dec_number,DEVICE_NUMBER);//注銷字符設備區(qū)域

  return;

}

static void leds_exit(void)

{

  leds_destroy_device();//卸載LED驅動的設備文件

  printk(DEVICE_NAME"\texit!\n");

}

module_exit(leds_exit);

第七步:分配寄存器

leds_init_gpm函數(shù)初始化寄存器

在leds_init函數(shù)中調用leds_init_gpm函數(shù)完成寄存器的初始化

static int leds_init(void)

{

  int ret;

  ret=leds_create_device();

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

  printk(DEVICE_NAME"tinitialized\n");

  return ret;

}

第八步:控制LED

兩種方式:通過字符串控制(使用file_operations.write函數(shù))AND 通過I/O命令控制LED(使用file_operations.ioctl函數(shù))

三 測試LED驅動

(參考上一篇博文)

四 LED驅動的移植

若將LED驅動安裝到另一個版本的Linux內核的系統(tǒng)上,首先要獲取新的Linux內核的源代碼,然后在新內核下重新編譯即可

轉載于:https://www.cnblogs.com/xiansheng/p/5532251.html

總結

以上是生活随笔為你收集整理的控制发光二极管的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。