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 first_drv_write(struct file *file,
const
char __user *buf,
size_t count,
loff_t * ppos)
//第二步:定義結構體,並把驅動函式填充進去
static
struct file_operations first_drv_fops = ;
//第四步:實現驅動入口函式
int major;
static
int first_drv_init(void)
static
void first_drv_exit(void)
//第五步:修飾入口函式,及退出函式
module_init(first_drv_init);
module_exit(first_drv_exit);
驅動程式可以自動分配主裝置號, 也可以手工指定
// 設定為 0 時是系統自動分配主裝置號
major = register_chrdev(0, "first_drv", &first_drv_fops);
// 通過 [cat /proc/device] 看一下系統為我們的first_drv分配的裝置號是多少
// 手動分配 111主裝置號給 first_drv
register_chrdev(111, "first_drv", &first_drv_fops);
當應該程式 執行 open(「/dev/xyz」) 操作時,這個/dev/xyz怎麼來的
2.1 手動建立
// 建立裝置節點
mknod /dev/xyz c(表示是字元裝置) 主裝置號 次裝置號
//檢視裝置資訊:
ls -l /dev/xyz
int major;
static
int first_drv_init(void)
static
void first_drv_exit(void)
虛擬位址怎麼來的,用 ioremap( ) 函式來對映,對映完後操作虛擬位址就像操作實體地址一樣。
static
int first_drv_init(void)
static int first_drv_open(struct inode *inode, struct file *file)
static ssize_t first_drv_write(struct file *file,
const
char __user *buf,
size_t count, loff_t * ppos)
else
return
0;}
裝置驅動 字元裝置驅動程式
linux下的應用程式在訪問字元裝置時,一般都是通過裝置檔案訪問的。裝置檔案一般都存放在 dev目錄下。字元裝置檔案的第乙個標誌是c,如下所示 總結 每乙個檔案代表乙個裝置,在時間前面有兩個用逗號隔開的數字,第乙個數字是主裝置號,第二個數字是次裝置號。一般認為乙個主裝置號對應乙個驅動程式,這裡列出的...
linux裝置驅動程式 字元裝置驅動程式
先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...
Linux裝置驅動程式 字元裝置驅動程式
1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...