結合前面介紹的linux字元驅動編寫的流程(申請裝置號-裝置註冊-生成裝置節點),開始對led驅動進行編寫。編寫驅動的流程:檢視原理圖以及資料手冊-核心尋找相似驅動進行開發,有時從零開始-字元驅動編寫以及實現功能,方便呼叫-編譯核心或者insmod載入-測試驅動。
檢視原理圖以及資料手冊(如下圖),從圖中可以看出kp_col0和vdd50_en控制led的點亮。
當kp_col0 和vdd50_en 網路時高電平的時候,三極體l9014 的be 導通,ce 導通,相當於5v 的vsys 電壓加到1k 和led 小燈上,小燈就會亮;當kp_col0 和vdd50_en 網路時低電平的時候,三極體l9014 的be 會截止,ce 截止,相當於5v 的vsys 電壓加到1k、led 小燈和乙個無限大的電阻上,電流為零,小燈就會滅。
從上圖可以看出led巨集定義為exynos4_gpl2(0),exynos4_gpk1(1)。
標頭檔案char_driver.h
驅動程式char_driver.c#ifndef _char_driver_leds_h_
#define _char_driver_leds_h_
#ifndef device_name
#define device_name "chdriver"
#endif
#ifndef device_minor_num
#define device_minor_num 2
#endif
#ifndef dev_major
#define dev_major 0
#endif
#ifndef dev_minor
#define dev_minor 0
#endif
#ifndef regdev_size
#define regdev_size 3000
#endif
struct reg_dev
;#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "char_driver.h"
module_license("dual bsd/gpl");
module_author("flywang");
static
int led_gpios = ;
#define led_num array_size(led_gpios)
int numdev_major = dev_major;
int numdev_minor = dev_minor;
module_param(numdev_major,int,s_irusr);
module_param(numdev_minor,int,s_irusr);
static
struct
class *myclass;
struct reg_dev *my_devices;
static
int chardevnode_open(struct inode *inode, struct file *file)
/*關閉操作*/
static
int chardevnode_release(struct inode *inode, struct file *file)
/*io操作*/
static
long chardevnode_ioctl(struct file *file, unsigned
int cmd, unsigned
long arg)
gpio_set_value(led_gpios[arg], cmd);
break;
default:
return -einval;
}printk(kern_emerg "chardevnode_ioctl is success! cmd is %d,arg is %d \n",cmd,arg);
return0;}
ssize_t chardevnode_read(struct file *file, char __user *buf, size_t count, loff_t *f_ops)
ssize_t chardevnode_write(struct file *file, const
char __user *buf, size_t count, loff_t *f_ops)
loff_t chardevnode_llseek(struct file *file, loff_t offset, int ence)
struct file_operations my_fops = ;
/*裝置註冊到系統*/
static
void reg_init_cdev(struct reg_dev *dev,int index)
else
}static
int gpio_init(void)
else
}return0;}
static
int led_init(void)
else
if(ret<0)
myclass = class_create(this_module,device_name);
my_devices = kmalloc(device_minor_num * sizeof(struct reg_dev),gfp_kernel);
if(!my_devices)
memset(my_devices,0,device_minor_num * sizeof(struct reg_dev));
/*裝置初始化*/
for(i=0;imemset(my_devices[i].data,0,regdev_size);
/*裝置註冊到系統*/
reg_init_cdev(&my_devices[i],i);
device_create(myclass,null, mkdev(numdev_major,numdev_minor+i),
null,device_name"%d",i);
}ret = gpio_init();
if(ret)
printk(kern_emerg "scdev_init!\n");
return
0;fail:
/*登出裝置號*/
unregister_chrdev_region(mkdev(numdev_major,numdev_minor),device_minor_num);
printk(kern_emerg "kmalloc is fail!\n");
return ret;
}static
void led_exit(void)
else
close(fd);
}
led驅動程式
led drv.c檔案如下 include include include include include include include include include include include include include include include include led opr....
led 驅動程式測試
1.首先驅動程式檔案通過tftp傳輸到開發板上,然後執行insmod s3c led.ko 裝載led驅動模組 2.cat proc devices grep led,顯示led 250 3.建立裝置節點 mknod dev led0 c 250 0 mknod dev led1 c 250 1 m...
字元裝置驅動 LED驅動程式
int main open sys.open led.open write sys.write led.write 第一步 驅動功能實現 static int first drv open struct inode inode,struct file file static ssize t firs...