日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Linux驅(qū)動(dòng)開(kāi)發(fā):簡(jiǎn)易框架使用指南(linux驅(qū)動(dòng)使用)

隨著智能終端及物聯(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