日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > 如何寫分層驅動(復雜的字符驅動)----以lcd驅動為例

如何寫分層驅動(復雜的字符驅動)----以lcd驅動為例

來源:程序員人生   發布時間:2015-06-23 09:05:25 閱讀次數:4098次

*********如何寫分層驅動(復雜的字符驅動)----以lcd驅動為例**************


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

3.4. 硬件相干的操作


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

整體架構:



分析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"); // 注冊裝備類
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驅動程序   // 要具體由app到內核到驅動分析才知道全部架構如何構成

  假定:
app:  open("/dev/fb0", ...)   主裝備號: 29, 次裝備號: 0
--------------------------------------------------------------
kernel:
fb_open // 第1層的通用代碼作用:1.中轉作用:判斷參數和設置參數,成為子類的多態函數參數  2.提供通用的操作:如果子類沒有覆蓋調用該方法,則使用通用代碼,實現多態
int fbidx = iminor(inode);    // 這個是register_framebuffer時候設置的,次裝備號就是數組的下標
struct fb_info *info = = registered_fb[0];  // 獲得3.3驅動注冊的結構體
file->private_data = info;// 方法1:重新設置file的fop,設置成info里面提供的fop
// 方法2:不重新設置file的fop,根據次裝備號獲得驅動設置的fop,調用驅動提供的函數
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)// 中轉作用:參數合法性判斷
return -ENODEV;


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



if (info->fbops->fb_read)// 多態:子類有自己實現,那末用子類函數
return info->fbops->fb_read(info, buf, count, ppos);

// 如果子類沒有覆蓋掉該方法則用基類提供通用方法
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.算法:找到次裝備號
for (i = 0 ; i < FB_MAX; i++)
if (!registered_fb[i])
break;
fb_info->node = i;


// 2.建立裝備節點
fb_info->dev = device_create(fb_class, fb_info->device,//以該次裝備號建立裝備節點
MKDEV(FB_MAJOR, i), "fb%d", i);// 在app open的時候fb%d,就有次裝備號就傳遞進來了
// 驅動可以利用該次裝備號
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;
}



忠于夢想 勇于實踐

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 黄色片在线免费观看 | 国产在线观看一区 | 一区二区电影 | 精品一区国产 | 成人永久视频 | 在线免费看黄网站 | 视频一区 国产精品 | 日韩精品成人一区二区在线观看 | 一区二区三区不卡在线观看 | 麻豆视频在线播放 | 色94色欧美sute亚洲线路一久 | 国产精品一区二区三区久久久 | 久久精品国产一区 | 黄色片免费在线观看 | 国产精品久久网 | 不卡一区二区在线 | 久久久久国产精品人 | 亚洲永久网站 | 久久99精品国产一区二区三区 | 亚洲成人精品一区 | 亚洲精品久久久久久久久久久久久 | 韩日精品一区 | 精品国产乱码一区二区三区 | 538国产精品视频一区二区 | 欧美 日韩 国产 成人 在线 91 | 日韩在线免费视频 | 国产真人真事毛片视频 | 亚洲精品高清视频 | 久久国产精品成人免费浪潮 | 亚洲精品国产综合区久久久久久久 | 伊人久久亚洲 | 国产精品成人自拍 | 国产精品综合久久 | 欧美综合久久 | 岛国免费av | 日韩电影精品 | 成人欧美一区二区三区在线播放 | 久久日韩精品 | 在线视频久久 | 久久男人| 久久免费国产视频 |