前言

`本文主要介绍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***节点对应
C 语言左移位操作在kernel驱动子系统中的特殊用途-LMLPHP
如下是 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
11-03 06:13