imx6d视频相关分析(IPU、mipi csi2、v4l2、frame buffer)

MIPI_CSI HOST驱动

mipi_csi2_probe函数:

  1. 根据设备树获取id、channel、lane、时钟等
  2. 映射寄存器
  3. 使能时钟

 

mipi_csi2_get_error1函数:

获取MIPI_CSI2_ERR1寄存器信息

mipi_csi2_get_error2函数:

获取MIPI_CSI2_ERR2寄存器信息

 

Frame buffer驱动

mxcfb_probe函数:

  1. Initialize FB structures——》mxcfb_init_fbinfo
  2. Parse user specified options——》mxcfb_option_setup
  3. mxcfb_dispdrv_init
  4. ipu_test_set_usage
  5. ipu_get_soc
  6. mxcfb_register注册fb(mxcfb_check_var、mxcfb_set_fix、fb_var_to_videomode、fb_add_videomode、ipu_request_irq、register_framebuffer)
  7. mxcfb_setup_overlay

 

struct fb_ops mxcfb_ops结构体:

.fb_set_par = mxcfb_set_par,

.fb_check_var = mxcfb_check_var,

.fb_setcolreg = mxcfb_setcolreg,

.fb_pan_display = mxcfb_pan_display,

.fb_ioctl = mxcfb_ioctl,

.fb_mmap = mxcfb_mmap,

.fb_fillrect = cfb_fillrect,

.fb_copyarea = cfb_copyarea,

.fb_imageblit = cfb_imageblit,

.fb_blank = mxcfb_blank,

 

mxcfb_set_par函数:

  1. 设置fix的param(mxcfb_set_fix)
  2. 检查(mxcfb_check_resolve、mxcfb_check_yuv)
  3. 关中断
  4. 内存映射mxcfb_map_video_memory
  5. Alpha通道处理
  6. 设置ipu通道_setup_disp_channel1、_setup_disp_channel2
  7. 使能ipu通道ipu_enable_channel

 

mxcfb_check_var函数:

主要做参数检查与调整。

 

mxcfb_setcolreg函数:

 

mxcfb_pan_display函数:

Pan or Wrap the Display

 

mxcfb_mmap函数:

根据传入的vm_area_struct结构体参数进行映射。

 

cfb_fillrect函数:

Fbdev通用函数,填充图像矩阵。

cfb_copyarea函数:

Fbdev通用函数,区域拷贝

cfb_imageblit函数:

Fbdev通用函数,图像blit

 

mxcfb_blank函数:

空白显示。

 

mxcfb_ioctl函数:

处理framebuffer的ioctl

 

struct file_operations fb_fops结构体:

.read = fb_read,

.write = fb_write,

.unlocked_ioctl = fb_ioctl,

.compat_ioctl = fb_compat_ioctl,

.mmap = fb_mmap,

.open = fb_open,

.release = fb_release,

.get_unmapped_area = get_fb_unmapped_area,

.fsync = fb_deferred_io_fsync,

.llseek = default_llseek,

 

fb_read函数:

  1. 如果存在(struct fb_info *)info->fbops->fb_read,则调用此函数。从 mxcfb_ops结构体可以看出,并未实现。
  2. 循环,每次拷贝PAGE_SIZE,从ppos偏移处拷贝count大小到用户空间。

 

fb_write函数:

  1. 类似fb_read。
  2. 循环,每次写入PAGE_SIZE,写入count大小到framebuffer开始偏移ppos处

 

fb_ioctl函数:

调用do_fb_ioctl函数,根据命令进行ioctl处理,支持的命令包括:

FBIOGET_VSCREENINFO、FBIOPUT_VSCREENINFO、FBIOGET_FSCREENINFO、FBIOPUTCMAP、FBIOGETCMAP、FBIOPAN_DISPLAY、FBIOGET_CON2FBMAP、FBIOPUT_CON2FBMAP、FBIOBLANK;其余命令会调用struct fb_ops mxcfb_ops结构体的fb_ioctl函数处理。

 

fb_compat_ioctl函数:

略。主要是加一些兼容性处理。

 

fb_mmap、fb_open函数:

调用struct fb_ops mxcfb_ops结构体的fb_mmap、fb_open函数。

 

IPU驱动

ipu_probe函数:

  1. 获取中断及寄存器地址
  2. 注册中断回调(sync:ipu_sync_irq_handler;err:ipu_err_irq_handler<产生一次异常中断就将中断屏蔽,所以只能获取一次中断,且只有一个warning打印,并未处理>)
  3. 计算并映射ipu内各个模块的基地址
  4. 使能时钟
  5. device_reset、ipu_mem_reset、ipu_disp_init
  6. idmac设置
  7. Enable error interrupts:5、6、9、10
  8. 注册ipu设备:register_ipu_device(register_chrdev、class_create、device_create、ipu_task_thread)

 

V4L2驱动

mxc_v4l2_probe函数:

  1. 创建cam_data结构体,并初始化(init_camera_struct)
  2. 设置v4l2 device,并注册(v4l2_int_device_register)
  3. 注册v4l video device(video_register_device)。cam->video_dev设置为VFL_TYPE_GRABBER类型,后面会创建“/dev/videoX”节点
  4. 创建设备节点,参照3

 

struct v4l2_file_operations mxc_v4l_fops结构体:

.open = mxc_v4l_open,

.release = mxc_v4l_close,

.read = mxc_v4l_read,

.ioctl = mxc_v4l_ioctl,

.mmap = mxc_mmap,

.poll = mxc_poll,

 

mxc_v4l_open函数:

  1. 根据入参file获取video_device,进而获取cam_data
  2. 设置busy
  3. 设置camera输入选择(mxc_cam_select_input)
  4. 设置ifparm(setup_ifparm)
  5. 使能时钟
  6. power_up_camera

 

mxc_v4l_close函数:

  1. 获取cam_data
  2. 设置busy
  3. 关闭viewfinder job(stop_preview)
  4. 关闭encoder job(mxc_streamoff)
  5. 取消camera输入
  6. 释放frame buffers(mxc_free_frame_buf)
  7. capture off(mxc_free_frames、power_off_camera)
  8. 取消设置busy

 

mxc_v4l_read函数:

  1. 获取cam_data
  2. 关闭viewfinder job(stop_preview)
  3. 设置回调prp_still_select——》prp_still_start中会大量调用ipu的接口函数完成从ipu获取数据
  4. 调用回调,参照3
  5. 数据拷贝到用户态copy_to_user
  6. 退出处理

 

mxc_v4l_ioctl函数:

调用v4l2框架函数video_usercopy拷贝命令及参数到kernel,并执行真正的ioctl函数mxc_v4l_do_ioctl,下面分析这个函数。

  1. 获取cam_data
  2. 根据不同的ioctl命令执行不同的处理
  3. 支持的ioctl命令包括:VIDIOC_QUERYCAP、VIDIOC_G_FMT、VIDIOC_S_FMT、VIDIOC_REQBUFS、VIDIOC_QUERYBUF、VIDIOC_QBUF、VIDIOC_DQBUF、VIDIOC_STREAMON、VIDIOC_STREAMOFF、VIDIOC_G_CTRL、VIDIOC_S_CTRL、VIDIOC_CROPCAP、VIDIOC_G_CROP、VIDIOC_S_CROP、VIDIOC_OVERLAY、VIDIOC_G_FBUF、VIDIOC_S_FBUF、VIDIOC_G_PARM、VIDIOC_S_PARM、VIDIOC_ENUMSTD、VIDIOC_G_STD、VIDIOC_S_STD、VIDIOC_ENUMOUTPUT、VIDIOC_G_OUTPUT、VIDIOC_S_OUTPUT、VIDIOC_ENUMINPUT、VIDIOC_G_INPUT、VIDIOC_S_INPUT、VIDIOC_ENUM_FMT、VIDIOC_ENUM_FRAMESIZES、VIDIOC_ENUM_FRAMEINTERVALS、VIDIOC_DBG_G_CHIP_IDENT、VIDIOC_SEND_COMMAND

 

mxc_mmap函数:

根据传入的vm_area_struct结构体参数进行映射。

mxc_poll函数:

执行poll_wait操作。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值