MIPI_CSI HOST驱动
mipi_csi2_probe函数:
- 根据设备树获取id、channel、lane、时钟等
- 映射寄存器
- 使能时钟
mipi_csi2_get_error1函数:
获取MIPI_CSI2_ERR1寄存器信息
mipi_csi2_get_error2函数:
获取MIPI_CSI2_ERR2寄存器信息
Frame buffer驱动
mxcfb_probe函数:
- Initialize FB structures——》mxcfb_init_fbinfo
- Parse user specified options——》mxcfb_option_setup
- mxcfb_dispdrv_init
- ipu_test_set_usage
- ipu_get_soc
- mxcfb_register注册fb(mxcfb_check_var、mxcfb_set_fix、fb_var_to_videomode、fb_add_videomode、ipu_request_irq、register_framebuffer)
- 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函数:
- 设置fix的param(mxcfb_set_fix)
- 检查(mxcfb_check_resolve、mxcfb_check_yuv)
- 关中断
- 内存映射mxcfb_map_video_memory
- Alpha通道处理
- 设置ipu通道_setup_disp_channel1、_setup_disp_channel2
- 使能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函数:
- 如果存在(struct fb_info *)info->fbops->fb_read,则调用此函数。从 mxcfb_ops结构体可以看出,并未实现。
- 循环,每次拷贝PAGE_SIZE,从ppos偏移处拷贝count大小到用户空间。
fb_write函数:
- 类似fb_read。
- 循环,每次写入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函数:
- 获取中断及寄存器地址
- 注册中断回调(sync:ipu_sync_irq_handler;err:ipu_err_irq_handler<产生一次异常中断就将中断屏蔽,所以只能获取一次中断,且只有一个warning打印,并未处理>)
- 计算并映射ipu内各个模块的基地址
- 使能时钟
- device_reset、ipu_mem_reset、ipu_disp_init
- idmac设置
- Enable error interrupts:5、6、9、10
- 注册ipu设备:register_ipu_device(register_chrdev、class_create、device_create、ipu_task_thread)
V4L2驱动
mxc_v4l2_probe函数:
- 创建cam_data结构体,并初始化(init_camera_struct)
- 设置v4l2 device,并注册(v4l2_int_device_register)
- 注册v4l video device(video_register_device)。cam->video_dev设置为VFL_TYPE_GRABBER类型,后面会创建“/dev/videoX”节点
- 创建设备节点,参照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函数:
- 根据入参file获取video_device,进而获取cam_data
- 设置busy
- 设置camera输入选择(mxc_cam_select_input)
- 设置ifparm(setup_ifparm)
- 使能时钟
- power_up_camera
mxc_v4l_close函数:
- 获取cam_data
- 设置busy
- 关闭viewfinder job(stop_preview)
- 关闭encoder job(mxc_streamoff)
- 取消camera输入
- 释放frame buffers(mxc_free_frame_buf)
- capture off(mxc_free_frames、power_off_camera)
- 取消设置busy
mxc_v4l_read函数:
- 获取cam_data
- 关闭viewfinder job(stop_preview)
- 设置回调prp_still_select——》prp_still_start中会大量调用ipu的接口函数完成从ipu获取数据
- 调用回调,参照3
- 数据拷贝到用户态copy_to_user
- 退出处理
mxc_v4l_ioctl函数:
调用v4l2框架函数video_usercopy拷贝命令及参数到kernel,并执行真正的ioctl函数mxc_v4l_do_ioctl,下面分析这个函数。
- 获取cam_data
- 根据不同的ioctl命令执行不同的处理
- 支持的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操作。