你的位置:首页 > 软件开发 > 操作系统 > OK6410内核驱动分析(转)

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中

  1. static int __init s3cfb_map_video_memory(s3cfb_info_t *fbi)
  2. {
  3.     fbi->map_size_f1 = PAGE_ALIGN(fbi->fb.fix.smem_len);    //480*272*n对齐到4K
  4.     //index=0时在DMA空间分配480*272*4=0x7f800=对齐后0x80000大小的DMA内存
  5.     //index=1,2,3时在DMA空间分配480*272*2=0x3fc00=对齐后0x40000大小的DMA内存
  6.     fbi->map_cpu_f1 = dma_alloc_writecombine(fbi->dev, fbi->map_size_f1, &fbi->map_dma_f1, GFP_KERNEL); //分配dma内存
  7.     fbi->map_size_f1 = fbi->fb.fix.smem_len;                //480*272*n原始大小,不对齐到4K
  8.     if (fbi->map_cpu_f1) {                                  //map_cpu_f1是将dma映射到虚拟内存空间的地址
  9.         memset(fbi->map_cpu_f1, 0xf0, fbi->map_size_f1);    //初始化成0xf0?这儿为什么不是0?
  10.         fbi->screen_dma_f1 = fbi->map_dma_f1;
  11.         fbi->fb.screen_base = fbi->map_cpu_f1;
  12.         fbi->fb.fix.smem_start = fbi->screen_dma_f1;
  13.     }
  14.     //下面的指针指向第二个 buffer
  15. #if defined(CONFIG_FB_S3C_EXT_DOUBLE_BUFFERING)
  16.     if (fbi->win_id<2 && fbi->map_cpu_f1) {
  17.         fbi->map_size_f2 = (fbi->fb.fix.smem_len / 2);
  18.         fbi->map_cpu_f2 = fbi->map_cpu_f1 + fbi->map_size_f2;
  19.         fbi->map_dma_f2 = fbi->map_dma_f1 + fbi->map_size_f2;
  20.         fbi->screen_dma_f2 = fbi->map_dma_f2;
  21.     }
  22. #endif
  23.     return 0;
  24. }
6. 规定范围 

  1. static int s3cfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
  2. {
  3.     s3cfb_info_t *fbi = (s3cfb_info_t *) info;
  4.     switch (var->bits_per_pixel) {
  5.         case 16:
  6.             var->red = s3cfb_rgb_16.red;          //{.offset = 11, .length = 5,},
  7.             var->green = s3cfb_rgb_16.green;      //{.offset = 5,  .length = 6,},
  8.             var->blue = s3cfb_rgb_16.blue;        //{.offset = 0,  .length = 5,},
  9.             var->transp = s3cfb_rgb_16.transp;    //{.offset = 0,  .length = 0,},
  10.             s3cfb_fimd.bytes_per_pixel = 2;   //每个像素2个字节        
  11.             break;        
  12.     }
  13.     //对窗口0进行特殊处理
  14.     if( (fbi->win_id == 0) && (var->bits_per_pixel == 28) )
  15.         var->transp.length = 0;
  16.     
  17.     return 0;
  18. }
在driver/video/fbcmap.c中

  1. int fb_alloc_cmap_gfp(struct fb_cmap *cmap, int len, int transp, gfp_t flags)
  2. {
  3.     int size = len * sizeof(u16);
  4.     if (cmap->len != len) {
  5.         fb_dealloc_cmap(cmap);               //把以前申请的rgb内存kfree掉
  6.         cmap->red = kmalloc(size, flags);    //重新分配内存,GFP_ATOMIC
  7.         cmap->green = kmalloc(size, flags);  //重新分配内存,GFP_ATOMIC
  8.         cmap->blue = kmalloc(size, flags);   //重新分配内存,GFP_ATOMIC
  9.         if (transp) {
  10.             cmap->transp = kmalloc(size, flags);
  11.         } else {
  12.             cmap->transp = NULL;             //transp设为NULL
  13.         }
  14.     }
  15.     cmap->start = 0;
  16.     cmap->len = len;
  17.     ret = fb_copy_cmap(fb_default_cmap(len), cmap);  //把default的cmap复制到新分配的cmap中
  18.     return 0;
  19. }

原标题:OK6410内核驱动分析(转)

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录