在寫字符設備驅動,通常都需要註冊設備與註銷設備操作,而終端設備也是字符設備的一種,也需要註冊與註銷,只是實現函數的不同而已
關鍵是學習註冊與註銷的整體框架
1、分配 tty 驅動
struct tty_driver *alloc_tty_driver(int lines);這個函數返回 tty_driver 指針,其參數爲要分配的設備數量,line 會被賦值給
tty_driver 的 num 成員,例如:
xxx_tty_driver = alloc_tty_driver(XXX_TTY_MINORS);
if (!xxx_tty_driver) //分配失敗
return -ENOMEM;
int tty_register_driver(struct tty_driver *driver);
註冊 tty 驅動成功時返回 0, 參數爲由 alloc_tty_driver ()分配的 tty_driver 結構體指
針,例如:
retval = tty_register_driver(xxx_tty_driver);
if (retval) //註冊失敗
{
printk(KERN_ERR "failed to register tiny tty driver");
put_tty_driver(xxx_tty_driver);
return retval;
}
int tty_unregister_driver(struct tty_driver *driver);
這個函數與 tty_register_driver ()對應, tty 驅動最終會調用上述函數註銷 tty_driver。
void tty_register_device(struct tty_driver *driver, unsigned index, struct device *device);
僅有 tty_driver 是不夠的,驅動必須依附於設備,tty_register_device()函數用於註冊關聯於 tty_driver 的設備,index 爲設備的索引(範圍是 0~driver->num) ,
例如:
for (i = 0; i < XXX_TTY_MINORS; ++i)tty_register_device(xxx_tty_driver, i, NULL);
重點:在以Linux2.6的設備驅動模型中,platform 總線將設備與驅動綁定,所以要進行具體設備與驅動的關聯。
void tty_unregister_device(struct tty_driver *driver, unsigned index);
上述函數與 tty_register_device()對應,用於註銷 tty 設備,其使用方法如下:
for (i = 0; i < XXX_TTY_MINORS; ++i)
tty_unregister_device(xxx_tty_driver, i);
參考資料:Linux 設備驅動開發詳解-宋寶華