文章目录
- 前言
- 一、C语言左移位操作介绍
-
- 1. 左移位
- 二、左移位操作在kernel 驱动子系统中的应用
-
- 1. 左移位操作在 V4L2, Media 子系统中的应用实例
- 2.左移位操作在 DRM 子系统中的应用实例
- 2.1 左移位操作在struct drm_crtc 中的应用
- 2.2 左移位操作在struct drm_encoder 中的应用
- 总结
前言
`本文主要介绍C语言的移位操作(左移<<)在 Linux kernel 一些驱动子系统(V4L2, Media, DRM等)中的应用
一、C语言左移位操作介绍
1. 左移位
左移位就是将一个数的各二进制位全部左移若干位,右边空出的二进制位补0,每左移 1 位原数就相当于乘2;
例子:
5 左移两位 相当于 5 * 2 * 2 = 20
20 = 5 << 2
十进制5 等于 二进制 0b101
将 0b101 左移 2 位 后变为 0b10100
将二进制 0b10100 转成十进制就是20
即:x << n = x * 2^n (5 << 2 = 5 * 2^2)
二、左移位操作在kernel 驱动子系统中的应用
1. 左移位操作在 V4L2, Media 子系统中的应用实例
Media 子系统中有pipeline 的概念,如下图所示是一个具有多图层合成功能的硬件的 pipeline 框图(支持最多5个图层输入和1个图层输出)
5个输入图层和1个输出图层 分别和 6 个对应的**/dev/video***节点对应
如下是 pipeline 工作的主要代码逻辑
因为唯一的输出图层是一定在pipeline 里面的,固可以给这个pipe 赋值一个固定的pipe index, 这里赋为0,其他可选的输入图层如果参与
pipeline 的组成,那也需要赋一个特定的pipe index 值(非 0 值)
//初始化
pipeline->num_inputs = 0;
pipeline->buffers_ready = 0;
//给该 pipeline 中的各个图层赋一个index
output->pipe_index = 0; //给输出图层的index 赋值为0
//判断有哪些图层使能,并给其赋一个index
for(i=0; i < 5; i++) {
if (input[i]->pipe_enable) {
pipeline->num_inputs++;
input[i]->pipe_index