/*包含初始化巨集定義的標頭檔案,**中的module_init和module_exit在此檔案中*/
#include
/*包含初始化載入模組的標頭檔案,**中的module_license在此標頭檔案中*/
#include
/*定義module_param module_param_array的標頭檔案*/
#include
/*定義module_param module_param_array中perm的標頭檔案*/
#include
/*三個字元裝置函式*/
#include
/*mkdev轉換裝置號資料型別的巨集定義*/
#include
/*定義字元裝置的結構體*/
#include
/*分配記憶體空間函式標頭檔案*/
#include
/*包含函式device_create 結構體class等標頭檔案*/
#include
自己寫的煩盜一下
linux核心中:
a -- 使用cdev結構體來描述字元裝置;
b -- 通過其成員dev_t來定義裝置號(分為主、次裝置號)以確定字元裝置的唯一性;
c -- 通過其成員file_operations來定義字元裝置驅動提供給vfs的介面函式,如常見的open()、read()、write()等;
在linux字元裝置驅動中:
a -- 模組載入函式通過 register_chrdev_region( ) 或 alloc_chrdev_region( )來靜態或者動態獲取裝置號;
b -- 通過 cdev_init( ) 建立cdev與 file_operations之間的連線,通過 cdev_add( ) 向系統新增乙個cdev以完成註冊;
c -- 模組解除安裝函式通過cdev_del( )來登出cdev,通過 unregister_chrdev_region( )來釋放裝置號;
使用者空間訪問該裝置的程式:
a -- 通過linux系統呼叫,如open( )、read( )、write( ),來「呼叫」file_operations來定義字元裝置驅動提供給vfs的介面函式;
/*包含初始化巨集定義的標頭檔案,**中的module_init和module_exit在此檔案中*/
#include /*包含初始化載入模組的標頭檔案,**中的module_license在此標頭檔案中*/
#include /*定義module_param module_param_array的標頭檔案*/
#include /*定義module_param module_param_array中perm的標頭檔案*/
#include /*三個字元裝置函式*/
#include /*mkdev轉換裝置號資料型別的巨集定義*/
#include /*定義字元裝置的結構體*/
#include /*分配記憶體空間函式標頭檔案*/
#include /*包含函式device_create 結構體class等標頭檔案*/
#include #define device_name "chardevnode"
#define device_minor_num 2
#define dev_major 0
#define dev_minor 0
#define regdev_size 3000
module_license("dual bsd/gpl");
/*宣告是開源的,沒有核心版本限制*/
module_author("itopeet_dz");
/*宣告作者*/
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
;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)
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 scdev_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;i自己寫的**很繁瑣,**也盜了一下,這個最精簡
注意:
kmalloc(申請空間大小,許可權) gfp_kernel等待分配
memset(位址,內容,大小)
嵌入式linux字元裝置驅動
arm linux 驅動 抵岸科技 1.我們需要先呼叫register chrdev region 或 alloc chrdev region 來向系統申請裝置號 int register chrdev region dev t first,unsigned int count,char name ...
嵌入式linux字元裝置驅動
1.我們需要先呼叫register chrdev region 或 alloc chrdev region 來向系統申請裝置號 int register chrdev region dev t first,unsigned int count,char name 函式通過已知的裝置號first來註冊...
linux字元裝置註冊相關函式
本文介紹linux字元裝置註冊相關的四個函式 cdev alloc cdev init cdev add和cdev del。這四個函式在檔案 fs char dev.c中定義,在標頭檔案include linux cdev.h中宣告。其中cdev alloc和cdev init是一對 互斥 函式,以...