多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php框架 > 框架設(shè)計(jì) > 如何寫(xiě)分層驅(qū)動(dòng)(復(fù)雜的字符驅(qū)動(dòng))----以lcd驅(qū)動(dòng)為例

如何寫(xiě)分層驅(qū)動(dòng)(復(fù)雜的字符驅(qū)動(dòng))----以lcd驅(qū)動(dòng)為例

來(lái)源:程序員人生   發(fā)布時(shí)間:2015-06-23 09:05:25 閱讀次數(shù):4094次

*********如何寫(xiě)分層驅(qū)動(dòng)(復(fù)雜的字符驅(qū)動(dòng))----以lcd驅(qū)動(dòng)為例**************


思路:復(fù)雜的驅(qū)動(dòng)都是建立在簡(jiǎn)單的驅(qū)動(dòng)的基礎(chǔ)上,所以首先要知道內(nèi)核簡(jiǎn)單字符裝備驅(qū)動(dòng)如何寫(xiě)
1.如何簡(jiǎn)單驅(qū)動(dòng)程序
1.1 構(gòu)造file_operations
.open = drv_open
.read = drv_read
1.2 告知內(nèi)核有1.1這個(gè)結(jié)構(gòu),register_chrdev(主裝備號(hào),fop,name)
上面可以被下面3句話代替
分配cdev
設(shè)置cdev
cdev_add
1.3 入口函數(shù):調(diào)用1.2的注冊(cè)函數(shù)
1.4 出口函數(shù):unregister_chrdev
2.復(fù)雜裝備驅(qū)動(dòng)程序:1.簡(jiǎn)單驅(qū)動(dòng)程序框架+分層
第1層:和簡(jiǎn)單驅(qū)動(dòng)程序框架類(lèi)似,這里以fbmem.c為例
2.1. 構(gòu)造file_operations 
open/read/write
2.2.register_chrdev
2.3.入口/出口
第2層:驅(qū)動(dòng)層:硬件相干(具體驅(qū)動(dòng)具體不同):3把斧
3.1. 分配1個(gè)fb_info結(jié)構(gòu)體: framebuffer_alloc
3.2. 設(shè)置
3.3. 注冊(cè): register_framebuffer: 實(shí)質(zhì):register_framebuffer做的事:設(shè)置registered_fb數(shù)組的值

3.4. 硬件相干的操作


****************************************************************************************

整體架構(gòu):



分析fbmem.c
static const struct file_operations fb_fops = { // ------⑵.1
.owner = THIS_MODULE,
.read = fb_read,
.write = fb_write,
.ioctl = fb_ioctl,
.mmap = fb_mmap,
.open = fb_open,
.release = fb_release,
};

static int __init
fbmem_init(void)// -----⑵.3
{
create_proc_read_entry("fb", 0, NULL, fbmem_read_proc, NULL);


if (register_chrdev(FB_MAJOR,"fb",&fb_fops)) // ---------⑵.2
printk("unable to get major %d for fb devs ", FB_MAJOR);


fb_class = class_create(THIS_MODULE, "graphics"); // 注冊(cè)裝備類(lèi)
if (IS_ERR(fb_class)) {
printk(KERN_WARNING "Unable to create fb class; errno = %ld ", PTR_ERR(fb_class));
fb_class = NULL;
}
return 0;
}

例子:具體分析:LCD驅(qū)動(dòng)程序   // 要具體由app到內(nèi)核到驅(qū)動(dòng)分析才知道全部架構(gòu)如何構(gòu)成

  假定:
app:  open("/dev/fb0", ...)   主裝備號(hào): 29, 次裝備號(hào): 0
--------------------------------------------------------------
kernel:
fb_open // 第1層的通用代碼作用:1.中轉(zhuǎn)作用:判斷參數(shù)和設(shè)置參數(shù),成為子類(lèi)的多態(tài)函數(shù)參數(shù)  2.提供通用的操作:如果子類(lèi)沒(méi)有覆蓋調(diào)用該方法,則使用通用代碼,實(shí)現(xiàn)多態(tài)
int fbidx = iminor(inode);    // 這個(gè)是register_framebuffer時(shí)候設(shè)置的,次裝備號(hào)就是數(shù)組的下標(biāo)
struct fb_info *info = = registered_fb[0];  // 獲得3.3驅(qū)動(dòng)注冊(cè)的結(jié)構(gòu)體
file->private_data = info;// 方法1:重新設(shè)置file的fop,設(shè)置成info里面提供的fop
// 方法2:不重新設(shè)置file的fop,根據(jù)次裝備號(hào)獲得驅(qū)動(dòng)設(shè)置的fop,調(diào)用驅(qū)動(dòng)提供的函數(shù)
if (info->fbops->fb_open) {
res = info->fbops->fb_open(info,1);
if (res)
module_put(info->fbops->owner);
}


app:  read()
---------------------------------------------------------------
kernel:
fb_read
int fbidx = iminor(inode);
struct fb_info *info = registered_fb[fbidx];// 同fb_open

if (!info || ! info->screen_base)// 中轉(zhuǎn)作用:參數(shù)合法性判斷
return -ENODEV;


if (info->state != FBINFO_STATE_RUNNING)
return -EPERM;



if (info->fbops->fb_read)// 多態(tài):子類(lèi)有自己實(shí)現(xiàn),那末用子類(lèi)函數(shù)
return info->fbops->fb_read(info, buf, count, ppos);

// 如果子類(lèi)沒(méi)有覆蓋掉該方法則用基類(lèi)提供通用方法
src = (u32 __iomem *) (info->screen_base + p);
dst = buffer;
*dst++ = fb_readl(src++);
copy_to_user(buf, buffer, c)        



附錄:register_framebuffer分析
int
register_framebuffer(struct fb_info *fb_info)
{
int i;
struct fb_event event;
struct fb_videomode mode;


if (num_registered_fb == FB_MAX)
return -ENXIO;
num_registered_fb++;
// 1.算法:找到次裝備號(hào)
for (i = 0 ; i < FB_MAX; i++)
if (!registered_fb[i])
break;
fb_info->node = i;


// 2.建立裝備節(jié)點(diǎn)
fb_info->dev = device_create(fb_class, fb_info->device,//以該次裝備號(hào)建立裝備節(jié)點(diǎn)
MKDEV(FB_MAJOR, i), "fb%d", i);// 在app open的時(shí)候fb%d,就有次裝備號(hào)就傳遞進(jìn)來(lái)了
// 驅(qū)動(dòng)可以利用該次裝備號(hào)
if (IS_ERR(fb_info->dev)) {
/* Not fatal */
printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld ", i, PTR_ERR(fb_info->dev));
fb_info->dev = NULL;
} else
fb_init_device(fb_info);




return 0;
}



忠于夢(mèng)想 勇于實(shí)踐

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 日本高清com| 亚洲不卡 | 久久精品蜜芽亚洲国产a | 欧美日韩成人高清在线播放 | 老司机免费福利视频无毒午夜 | 欧美一级高清在线观看 | 日韩视频在线观看一区 | 欧美做爰孕妇群 | 亚洲乱码专区一区二区三区 | 99久久精品国产一区二区成人 | 欧美精品网 | 波多野结衣在线观看一区 | 亚洲欧美一区二区三区另类 | 成人欧美精品久久久久影院 | 美国毛片免费看 | 国产永久免费爽视频在线 | 亚洲 春色 古典 小说 自拍 | 国产午夜精品不卡观看 | 国产高清精品91在线 | 性欧美xxx极品另类 性欧美暴力猛交69hd | 日本资源网 | babes性欧美高清 | 亚洲国产99在线精品一区二区 | 久久久久avav久久久 | 欧美激情精品久久久久久久久久 | 日本中文字幕免费 | 最好免费高清视频在线看 | 欧美性生交xxxxx久久久 | 九一精品 | 亚洲精品小说 | 中文字幕亚洲欧美 | 现代激情校园春色 | 九色最新 | v片在线播放 | 欧美刺激午夜性久久久久久久 | 性做久久久久久久久 | 亚洲精品久久一区毛片 | 福利片在线观看免费高清 | 国产精品视_精品国产免费 国产精品视频1区 | 日本免费观看网站 | 国产一区二区在线观看麻豆 |