前面提到,核心內部使用struct cdev結構來表示字元裝置。在核心呼叫裝置的操作之前,必須分配並註冊乙個或者多個上述結構。在<linux/cdev.h>中定義了這個結構以及與其相關的一些輔助函式。
如果需要動態的初始化,應該編寫如下**:
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &my_ops;
這時,你可以將cdev結構嵌入到自己的裝置特定結構中。這種情況下,我們需要用下面的**來初始化已分配到的結構:
void cdev_init(struct cdev *cdev, struct file_operations *fops);
另外還需要初始化乙個所有者,可以設定為this_module。
在cdev結構設定好之後,最後的步驟是通過下面的呼叫來告訴核心該結構的資訊:
int cdev_add(struct cdev *dev, dev_t num, unsigned int count);
num:裝置編號
count:經常為1
移除乙個字元裝置
void cdev_del(struct cdev *dev);
還有比較老的註冊字元裝置的方式如下:
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
major:主裝置號
name:驅動名稱(出現在/proc/devices)
fops:file_operations結構
對應的移除函式:
int unregister_chrdev(unsigned int major, const char *name);
其中major和name必須要和register_chrdev傳遞的一致。
static
void
scull_setup_cdev
(struct scull_dev *dev,
int index)
intscull_init_module
(void
)memset
(scull_devices,
0, scull_nr_devs *
sizeof
(struct scull_dev));
for(i =
0; i < scull_nr_devs; i++
)/* ...others code... */
}
字元裝置的註冊
核心中每個字元裝置都對應乙個 cdev 結構的變數,下面是它的定義 struct cdev 乙個 cdev 一般它有兩種定義初始化方式 靜態的和動態的。靜態記憶體定義初始化 struct cdev my cdev cdev init my cdev,fops my cdev.owner this m...
字元裝置編號的註冊分配
核心中所有已分配的字元裝置編號都記錄在乙個名為 chrdevs 雜湊表裡。該雜湊表中的每乙個元素是乙個 char device struct 結構,它的定義如下 static struct char device struct chrdevs chrdev major hash size 注意,核心...
Linux字元裝置驅動的註冊
很多學習linux程式設計的新人都會被字元裝置註冊搞糊塗了,我剛開始也一樣糊里糊塗的,看到網上例程有各種版本,就是呼叫module init時傳遞的實參,先記為 init 大家可能還會看到雜項裝置驅動misc register 平台裝置驅動platform device register 但是作為l...