JZ2440 摄像头驱动之实现数据传输1_框架_学习笔记

1、往期回顾

(1)根据描述符可知道摄像头支持哪几种格式(YUV、RGB、MJPEG)的视频数据,某一种格式下有哪几种分辨率(4:3),摄像头是否支持某些属性。


(2)我们在PC上做实验,为了看到内核打印(printk)的信息,我们用的是dmesg命令。这 种方法有两个缺点:一个是需要不断输入dmesg命令,另一个是驱动程序有问题,导致内核崩溃,就没有机会执行dmesg命令。所以要把输出方式改为文件输出。

2、把输出方式改为文件输出
 设置ubuntu让它从串口0输出printk信息
a. 设置vmware添加serial port, 使用文件作为串口(不使用物理串口,因为输出信息比较慢,所以输出到文件(以.txt为文件后缀))


b. 启动ubuntu,修改/etc/default/grub(开机引导文件
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"//console=ttyS0是指从串口0(波特率是115200,n表示没有校验位,数据位是8)输出信息,console=tty0是指从终端0输出信息
sudo update-grub//grub是启动引导文件,因而更新
sudo reboot  //重启系统(然后查看我们输出的.txt的log文件)

dmesg命令可以查看内核打印信息,但是信息同步不到我们之前设置的.txt文件

//修改内核打印级别,把4改成8,就可以打印所有的信息,为0时禁止打印信息。


//用su命令切换到root用户,但是切换后不成功,因为ubuntu禁止root用户登录。

c. ubuntu禁止root用户登录
先修改root密码: sudo passwd root   (重新修改密码后就可以切换为root用户)????
然后执行"su root"就可以用root登录了
退出ROOT模式的话,可以输入exit 回车

Ctrl + D

Ctrl + C是终止正在执行的命令。
& 是用于使进程在后台运行

d. echo "8 4 1 7" > /proc/sys/kernel/printk //修改内核打印级别,把4改成8,就可以打印所有的信息,为0时禁止打印信息。

int console_printk[4] = {

       DEFAULT_CONSOLE_LOGLEVEL,  终端级别

       DEFAULT_MESSAGE_LOGLEVEL,  默认级别

       MINIMUM_CONSOLE_LOGLEVEL,让用户使用的最小级别

       DEFAULT_CONSOLE_LOGLEVEL,  默认终端级别

};




再次重启后,只要执行这2个命令就可以:

su root //切换到root用户
echo "8 4 1 7" > /proc/sys/kernel/printk



3、写代码

(1)框架
1.构造一个usb_driver
2.设置
   probe:
        2.1. 分配video_device:video_device_alloc
        2.2. 设置
           .fops
           .ioctl_ops (里面需要设置11项)
           如果要用内核提供的缓冲区操作函数,还需要构造一个videobuf_queue_ops
        2.3. 注册: video_register_device      
  id_table: 表示支持哪些USB设备(逻辑上的设备(接口))      
3.注册: usb_register


(2)调用过程

file_operation结构体(myuvc_fops)里面的open函数调用ioctl函数(video_ioctl2)


ioctl函数调用_video_do_ioctl函数从而调用v4l2_ioctl_ops结构体




A7 APP调用该ioctl让驱动程序分配若干个缓存, APP将从这些缓存中读到视频数据 

A8 查询缓存状态, 比如地址信息(APP可以用mmap进行映射) 

A9 把缓存映射到APP的空间,以后APP就可以直接操作这块缓存 

A10 把缓冲区放入队列, 底层的硬件操作函数将会把数据放入这个队列的缓存 

A11 启动传输 

应用程序怎么知道缓冲区里面有数据,利用poll函数



猜你喜欢

转载自blog.csdn.net/weixin_38807927/article/details/87871575