mycdev.c
/*字元驅動模組程式 2023年04月21日 星期五*/
#include //模組所需的大量符號和函式定義
#include //指定初始化和清除函式
#include //dev_t 是用來在核心裡代表裝置號的型別.
#include //"檔案系統"標頭檔案是編寫裝置驅動需要的標頭檔案. 許多重要的函式和資料結構在此定義
#include
#include //cdev 結構管理的函式, 它代表核心中的字元裝置
#include
#include //printk()乙個傳統巨集定義, 可用來獲取乙個結構指標, 從它裡面包含的某個其他結構的指
#include
//#include //
#include //在核心和使用者空間中移動資料的函式copy_to_user和copy_from_user
module_license("leo bsd/gpl"); //許可證
#define mycdev_majob 231 /*給定的主裝置號*/
#define mycdev_size 2048
//open 方法提供給驅動來做任何的初始化來準備後續的操作.
static
int mycdev_open(struct inode *inode, struct file *fp)
//釋放 open 分配在 filp->private_data 中的任何東西,在最後的 close 關閉裝置
static
int mycdev_release(struct inode *inode, struct file *fp)
//檔案操作
static ssize_t mycdev_read(struct file *fp, char __user *buf, size_t size, loff_t *pos)
printk("reader: %d bytes was read...\n",count);
return count;
}static ssize_t mycdev_write(struct file *fp, const
char __user *buf, size_t size, loff_t *pos)
/*填充mycdev的file_operation結構*/
static
const
struct file_operations mycdev_fops = ;
/*模組初始化函式*/
static
int __init mycdev_init(void)
else
return
0;};
/*模組解除安裝函式*/
static
void __exit mycdev_exit(void)
module_init(mycdev_init);
module_exit(mycdev_exit);
test.c
#include
#include
int main()
/*寫入裝置*/
fwrite(buf, sizeof(buf), 1, fp0);
/*重新定位檔案位置(思考沒有該指令,會有何後果)*/
fseek(fp0,0,seek_set);
/*清除buf*/
strcpy(buf,"buf is null!");
printf("buf: %s\n",buf);
/*讀出裝置*/
fread(buf, sizeof(buf), 1, fp0);
/*檢測結果*/
printf("buf: %s\n",buf);
return
0;
}
裝置驅動例項 字元裝置驅動
在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...
字元裝置驅動筆記(二)
怎麼寫led驅動 寫框架 完善硬體的操作 1 看原理圖 2 看2440手冊 3 微控制器 直接操作實體地址 驅動程式 操作虛擬位址,實體地址用iorremap對映為虛擬位址 myleds.c include include include include include include includ...
字元裝置驅動筆記(二)
怎麼寫led驅動 寫框架 完善硬體的操作 1 看原理圖 2 看2440手冊 3 微控制器 直接操作實體地址 驅動程式 操作虛擬位址,實體地址用iorremap對映為虛擬位址 myleds.c include include include include include include includ...