新聞中心
隨著智能終端及物聯(lián)網(wǎng)設(shè)備的普及,越來(lái)越多的軟件和硬件基于linux環(huán)境進(jìn)行開(kāi)發(fā)。特別是在涉及外設(shè)設(shè)備及固件開(kāi)發(fā)時(shí),編寫(xiě)兼容Linux的底層驅(qū)動(dòng)是必不可少的環(huán)節(jié)。本文的目的旨在介紹如何編寫(xiě)一個(gè)簡(jiǎn)單的驅(qū)動(dòng)框架。

創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷(xiāo)、軟文推廣等專(zhuān)業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專(zhuān)業(yè)設(shè)計(jì)制作為您帶來(lái)效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。
首先,我們來(lái)分析一下Linux驅(qū)動(dòng)的結(jié)構(gòu)。大多數(shù)Linux驅(qū)動(dòng)都具有類(lèi)似的結(jié)構(gòu),具體可以分解為:頭文件、數(shù)據(jù)結(jié)構(gòu)定義以及驅(qū)動(dòng)函數(shù)。
從數(shù)據(jù)結(jié)構(gòu)定義開(kāi)始,我們要定義驅(qū)動(dòng)和外設(shè)訪問(wèn)所需要的相關(guān)變量,有下面三個(gè)數(shù)據(jù)結(jié)構(gòu):
1.設(shè)備對(duì)象:
struct MY_dev{
//設(shè)備號(hào)
int devno;
//設(shè)備名
char dev_name[32];
//API接口定義
struct my_dev_operations *ops;
//設(shè)備私有數(shù)據(jù)
void *priv;
};
2.設(shè)備操作:
struct my_dev_operations {
int (*open)(struct my_dev* dev);
int (*close)(struct my_dev* dev);
int (*ioctl)(struct my_dev* dev);
int (*read)(struct my_dev* dev, int *buf);
int (*write)(struct my_dev* dev, int *buf);
};
3.字符設(shè)備:
struct my_dev_char{
struct cdev cdev;
int buf[64];
//......
};
然后,要定義相應(yīng)的驅(qū)動(dòng)函數(shù),比如open函數(shù)。該函數(shù)用于將設(shè)備驅(qū)動(dòng)注冊(cè)到系統(tǒng)并生成一個(gè)對(duì)應(yīng)的設(shè)備對(duì)象,然后將該對(duì)象綁定到相應(yīng)的設(shè)備號(hào)下:
int my_dev_open(struct inode* inode, struct file* filp)
{
//定義一個(gè)設(shè)備對(duì)象
struct my_dev *dev;
//分配一個(gè)設(shè)備號(hào)
int devno = get_devnumber();
//為設(shè)備對(duì)象分配內(nèi)存
dev = (struct my_dev*)kmalloc(sizeof(struct my_dev));
//為設(shè)備對(duì)象制定設(shè)備名
sprintf(dev->dev_name, “my_dev%04d”, devno);
//注冊(cè)字符設(shè)備
register_chrdev_region(MKDEV(devno, 0), 1, dev->dev_name);
//分配一個(gè)字符設(shè)備
struct my_dev_char *my_char_dev = (struct my_dev_char *) kmalloc(sizeof(struct my_dev_char), GFP_KERNEL);
//初始化字符設(shè)備
cdev_init(&my_char_dev->cdev, &my_dev_fops);
//將設(shè)備綁定到設(shè)備號(hào)下
cdev_add(&my_char_dev->cdev, MKDEV(devno, 0), 1);
//保存設(shè)備號(hào)
dev->devno = devno;
//將設(shè)備對(duì)象放入filp中
filp->private_data = dev;
return 0;
}
最后,在驅(qū)動(dòng)入口函數(shù)中定義驅(qū)動(dòng)的相關(guān)操作,注冊(cè)驅(qū)動(dòng)并完成相應(yīng)的操作:
int __init my_dev_init(void)
{
int ret;
//注冊(cè)驅(qū)動(dòng)
ret = register_chrdev(MY_DEV_MAJOR, MY_DEV_NAME, &my_dev_fops);
if(ret
{
printk(KERN_ERR "register Gec6818 nand stor err\n");
return ret;
}
//完成相應(yīng)的操作
//...
return 0;
}
經(jīng)過(guò)上面的操作,一個(gè)簡(jiǎn)單的Linux驅(qū)動(dòng)框架就被成功搭建起來(lái)了。通過(guò)上面的步驟,成功搭建了一個(gè)基本的驅(qū)動(dòng)框架,可以更多地關(guān)注驅(qū)動(dòng)程序的功能性。如此,一個(gè)穩(wěn)健的Linux驅(qū)動(dòng)就可以在Linux系統(tǒng)上運(yùn)行了。
成都網(wǎng)站設(shè)計(jì)制作選創(chuàng)新互聯(lián),專(zhuān)業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專(zhuān)注成都高端網(wǎng)站建設(shè)定制開(kāi)發(fā)服務(wù),為客戶提供專(zhuān)業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開(kāi)發(fā),營(yíng)銷(xiāo)網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。
分享標(biāo)題:Linux驅(qū)動(dòng)開(kāi)發(fā):簡(jiǎn)易框架使用指南(linux驅(qū)動(dòng)使用)
文章出自:http://m.5511xx.com/article/cddgehs.html


咨詢
建站咨詢
