生活随笔
收集整理的這篇文章主要介紹了
Linux设备驱动-platform虚拟总线dya02
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
參考書:<linux設(shè)備驅(qū)動開發(fā)詳解>宋寶華
上一篇介紹了platform的基本構(gòu)成與源碼,本篇用實(shí)例來說明platform的實(shí)現(xiàn).
參考書中介紹了一個(gè)名為globalfifo的驅(qū)動,以他為例,來說明作為platfrom設(shè)備如何實(shí)現(xiàn)驅(qū)動和設(shè)備的匹配.
將globalfifo驅(qū)動掛接到platform總線上,要完成兩部分工作:
(1)將globalfifo移植為platform驅(qū)動
(2)在板文件中添加globalfifo這個(gè)platform設(shè)備
1.移植
為完成globalfifo移植到platform驅(qū)動的工作,需要在原始的字符設(shè)備globalfifo驅(qū)動中套一層platfrom_driver外殼. 這一步驟并沒有改變globalfifo字符設(shè)備的本質(zhì),只是將其掛接到了platform總線上.
static int globalfifo_probe(struct platform_device *pdev)
{int ret;dev_t devno = MKDEV(globalfifo_major,0); //定義設(shè)備號,數(shù)據(jù)類型dev_t,32位數(shù)if (globalfifo_major) //靜態(tài)申請ret = register_chrdev_region(devno,1,"globalfifo");//申請字符設(shè)備驅(qū)動,1表示申請的連續(xù)設(shè)備編號的個(gè)數(shù),globalfifo是設(shè)備名稱else{ //靜態(tài)申請失敗ret = alloc_chrdev_region(&devno,0,1,"globalfifo"); //0表示請求的第一個(gè)次設(shè)備號,1表示個(gè)數(shù)globalfifo_major = MAJOR(devno);}if (ret < 0)return ret;globalfifo_devp = devm_kzalloc(&pdev->dev,sizeof(*globalfifo_devp),GFP_KERNEL);if (!globalfifo_devp) {ret = -ENOMEM;goto fail_malloc;
}globalfifo_setup_cdev(globalfifo_devp,0); //cdev初始化和添加mutex_init( &globalfifo_devp->mutex);init_waitqueue_head(&globalfifo_devp->r_wait); //初始化隊(duì)列頭init_waitqueue_head(&globalfifo_devp->w_wait);return 0;
fail_malloc:unregister_chrdev_region(devno,1);return ret;
}static int globalfifo_remove(struct platform_device *pdev)
{cdev_del(&globalfifo_devp->cdev);//刪除cdev結(jié)構(gòu)體unregister_chrdev_region(MKDEV(globalfifo_major,0),1);//注銷設(shè)備區(qū)域return 0;
}static struct platform_driver globalfifo_driver = {.driver = {.name = "globalfifo",.owner = THIS_MODULE,},.probe = globalfifo_probe,.remove = globalfifo_remove,
};module_platform_driver(globalfifo_driver);
注冊完globalfifo對應(yīng)的platform_driver后,會發(fā)現(xiàn)/sys/bus/platform/drivers目錄下多出一個(gè)名叫g(shù)lobalfifo的子目錄.
板文件arch/arm/mach-<soc名>/mach-<板名>.c中添加如下代碼:
static struct platform_device globalfifo_device = {.name = "globalfifo",.id = -1,
};
如果一切順利,會在/sys/devices/platform目錄下看到一個(gè)名為globalfifo的子目錄
/sys/devices/platfrom/globalfifo中會有一個(gè)driver文件,指向/sys/bus/platform/drivers/globalfifo的符號鏈接, 證明驅(qū)動和設(shè)備匹配上了.
總結(jié)
以上是生活随笔為你收集整理的Linux设备驱动-platform虚拟总线dya02的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。