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是终止正在执行的命令。& 是用于使进程在后台运行
int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL, 终端级别
DEFAULT_MESSAGE_LOGLEVEL, 默认级别
MINIMUM_CONSOLE_LOGLEVEL,让用户使用的最小级别
DEFAULT_CONSOLE_LOGLEVEL, 默认终端级别
};
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函数