OK6410内核驱动分析(转)
发布时间:2016-02-04 22:58:38
一. 理论分析1. 几个概念:FIMC : Fully Interactive Mobile Camera (完全交互式移动摄像机)FIMD: Fully Interactive Mobile Display (完全交互式移动显示设备 ...
一. 理论分析1.分配内存第1次初始化 第2次初始化3.1.2 gpio口初始化在drivers/vidoe/samsun/s3cfb.c中
- static int __init s3cfb_map_video_memory(s3cfb_info_t *fbi)
- {
- fbi->map_size_f1 = PAGE_ALIGN(fbi->fb.fix.smem_len); //480*272*n对齐到4K
- //index=0时在DMA空间分配480*272*4=0x7f800=对齐后0x80000大小的DMA内存
- //index=1,2,3时在DMA空间分配480*272*2=0x3fc00=对齐后0x40000大小的DMA内存
- fbi->map_cpu_f1 = dma_alloc_writecombine(fbi->dev, fbi->map_size_f1, &fbi->map_dma_f1, GFP_KERNEL); //分配dma内存
- fbi->map_size_f1 = fbi->fb.fix.smem_len; //480*272*n原始大小,不对齐到4K
- if (fbi->map_cpu_f1) { //map_cpu_f1是将dma映射到虚拟内存空间的地址
- memset(fbi->map_cpu_f1, 0xf0, fbi->map_size_f1); //初始化成0xf0?这儿为什么不是0?
- fbi->screen_dma_f1 = fbi->map_dma_f1;
- fbi->fb.screen_base = fbi->map_cpu_f1;
- fbi->fb.fix.smem_start = fbi->screen_dma_f1;
- }
- //下面的指针指向第二个 buffer
- #if defined(CONFIG_FB_S3C_EXT_DOUBLE_BUFFERING)
- if (fbi->win_id<2 && fbi->map_cpu_f1) {
- fbi->map_size_f2 = (fbi->fb.fix.smem_len / 2);
- fbi->map_cpu_f2 = fbi->map_cpu_f1 + fbi->map_size_f2;
- fbi->map_dma_f2 = fbi->map_dma_f1 + fbi->map_size_f2;
- fbi->screen_dma_f2 = fbi->map_dma_f2;
- }
- #endif
- return 0;
- }
6. 规定范围 - static int s3cfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
- {
- s3cfb_info_t *fbi = (s3cfb_info_t *) info;
- switch (var->bits_per_pixel) {
- case 16:
- var->red = s3cfb_rgb_16.red; //{.offset = 11, .length = 5,},
- var->green = s3cfb_rgb_16.green; //{.offset = 5, .length = 6,},
- var->blue = s3cfb_rgb_16.blue; //{.offset = 0, .length = 5,},
- var->transp = s3cfb_rgb_16.transp; //{.offset = 0, .length = 0,},
- s3cfb_fimd.bytes_per_pixel = 2; //每个像素2个字节
- break;
- }
- //对窗口0进行特殊处理
- if( (fbi->win_id == 0) && (var->bits_per_pixel == 28) )
- var->transp.length = 0;
-
- return 0;
- }
在driver/video/fbcmap.c中
- int fb_alloc_cmap_gfp(struct fb_cmap *cmap, int len, int transp, gfp_t flags)
- {
- int size = len * sizeof(u16);
- if (cmap->len != len) {
- fb_dealloc_cmap(cmap); //把以前申请的rgb内存kfree掉
- cmap->red = kmalloc(size, flags); //重新分配内存,GFP_ATOMIC
- cmap->green = kmalloc(size, flags); //重新分配内存,GFP_ATOMIC
- cmap->blue = kmalloc(size, flags); //重新分配内存,GFP_ATOMIC
- if (transp) {
- cmap->transp = kmalloc(size, flags);
- } else {
- cmap->transp = NULL; //transp设为NULL
- }
- }
- cmap->start = 0;
- cmap->len = len;
- ret = fb_copy_cmap(fb_default_cmap(len), cmap); //把default的cmap复制到新分配的cmap中
- return 0;
- }
原标题:OK6410内核驱动分析(转)
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。