控制发光二极管
一 LED驅動的實現原理
盡管Linux驅動直接與硬件打交道,但并不是Linux驅動直接向硬件中的內存寫數據,而是與本機的I/O內存進行交互。每一個連接Linux的硬件在I/O內存中都會有映射首地址,開發板上的LED也有其映射首地址。
二 編寫LED驅動?
第一步:使用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;
}
第二步:指定設備號 ? ?用1個int類型表示,前12位表示主設備號,后20位表示次設備號
int dev_number=MKDEV(major,minor); //major表示主設備號,minor表示次設備號
int major=MAJOR(dev_number);
int minor=MAJOR(dev_number);
第三步:使用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);
}
第四步:使用class_create 宏創建struct class
struct class *leds_class = NULL;
leds_class=class_create(THIS_MODULE,"dev_name");
第五步:使用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);
第六步:卸載設備文件
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"\texit!\n");
}
module_exit(leds_exit);
第七步:分配寄存器
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\n");
return ret;
}
第八步:控制LED
兩種方式:通過字符串控制(使用file_operations.write函數)AND 通過I/O命令控制LED(使用file_operations.ioctl函數)
三 測試LED驅動
(參考上一篇博文)
四 LED驅動的移植
若將LED驅動安裝到另一個版本的Linux內核的系統上,首先要獲取新的Linux內核的源代碼,然后在新內核下重新編譯即可
轉載于:https://www.cnblogs.com/xiansheng/p/5532251.html
總結
- 上一篇: 小时候有个恐怖片是血液一样的怪物通过下水
- 下一篇: 关于江苏卫视《为她而战》的,楼主要急死了