乙個裝置節點的屬性有:
裝置型別,讀寫許可權,主裝置號,次裝置號等等。次裝置號的作用是什麼呢?
舉個例子:
假如有兩個串列埠,它們共用乙個裝置驅動(主裝置號),當具體的操作的時候,如何判斷操作的是哪乙個串列埠呢?這就使用到了次裝置號。
功能如下:
1.次裝置號為0的裝置節點功能為操作所有的led燈
2.測裝置號為1,2,3,4分別代表各個單獨的led燈,可以對他們單獨進行操作。
**如下:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct class *first_dev_class;
//struct device *first_dev;
struct device *led_devs[5];
volatile unsigned long *gpmcon = null;
volatile unsigned long *gpmdat = null;
int major;
int minor;
static int first_drv_open(struct inode *inode, struct file *file)
case 1:
case 2:
case 3:
case 4:
} return 0;
}static int first_drv_write(struct file *filp, char __user *buff,
size_t count, loff_t *offp)
else if(val == 0)
break;
}case 1:
else if(val == 0)
break;
}case 2:
else if(val == 0)
break;
}case 3:
else if(val == 0)
break;
}case 4:
else if(val == 0)
break;}}
return 0;
}static struct file_operations first_drv_fops = ;
static int __init first_drv_init(void)
gpmcon = (volatile unsigned long *)ioremap(0x7f008820, 16);
gpmdat = gpmcon + 1;
// register_chrdev(111,"first_drv",&first_drv_fops);
return 0;
}static void __exit first_drv_exit(void)
// device_destroy(first_dev_class, mkdev(major,0));
class_destroy(first_dev_class);
unregister_chrdev(major,"first_drv");
iounmap(gpmcon);
}module_init(first_drv_init);
module_exit(first_drv_exit);
module_license("gpl");
測試程式:
#include #include int main(int argc ,char **argv)
if(argc != 3)
if(strcmp(argv[2],"on") == 0)else
write(fd,&val,4);
return 0;
}
從上面的驅動程式可以看到,在open,read,write函式中獲取次裝置號的方法為:
open函式: 通過minor(inode->i_rdev);獲取
read,write函式: 通過minor(filp->f_dentry->d_inode->i_rdev);獲取
主裝置號和次裝置號
上圖中,紅色方塊內為裝置的主裝置號,黃色方塊內為裝置的次裝置號。主裝置號是表示系統訪問這個裝置的 核心驅動 驅動程式是unix系統核心 中的一部分,其作用是用來控制一種特殊裝置的輸入輸出。大多數的unix系統都有多種裝置驅動程式,每乙個裝置檔名中的主裝置號就代表這個裝置使用的是哪個裝置驅動程式。次裝...
6410之字元裝置驅動的框架
寫乙個驅動的框架的步驟 file operations,用上面的裝置操作函式來填充它 2.通過 register chrdev將這個file operations結構體告訴核心。3.在驅動的入口函式中呼叫register chrdev,比如first drv init 4.用module init ...
linux裝置號之操作
在linux裝置驅動中,裝置號設乙個很重要的概念和變數。不論是主裝置號,還是次裝置號,在裝置驅動中都佔據了很重要的地位。那麼他在kernel中是如何操作的?這個資料結構都是通過那些函式可以很容易的在我們寫linux裝置驅動模組時被我們所使用呢?在include linux type.h檔案中我們能看...