3.1. 数字电视通用功能

3.1.1. DVB 设备

这些函数负责处理 DVB 设备节点。

enum dvb_device_type

数字电视设备类型

常量

DVB_DEVICE_SEC

数字电视独立公共接口 (CI)

DVB_DEVICE_FRONTEND

数字电视前端。

DVB_DEVICE_DEMUX

数字电视解复用器。

DVB_DEVICE_DVR

数字电视数字视频录像 (DVR)。

DVB_DEVICE_CA

数字电视条件访问 (CA)。

DVB_DEVICE_NET

数字电视网络。

DVB_DEVICE_VIDEO

数字电视视频解码器。已弃用。仅在 av7110-av 上使用。

DVB_DEVICE_AUDIO

数字电视音频解码器。已弃用。仅在 av7110-av 上使用。

DVB_DEVICE_OSD

数字电视屏幕显示 (OSD)。已弃用。仅在 av7110 上使用。

struct dvb_adapter

表示使用 Linux DVB API 的数字电视适配器

定义:

struct dvb_adapter {
    int num;
    struct list_head list_head;
    struct list_head device_list;
    const char *name;
    u8 proposed_mac [6];
    void* priv;
    struct device *device;
    struct module *module;
    int mfe_shared;
    struct dvb_device *mfe_dvbdev;
    struct mutex mfe_lock;
#if defined(CONFIG_MEDIA_CONTROLLER_DVB);
    struct mutex mdev_lock;
    struct media_device *mdev;
    struct media_entity *conn;
    struct media_pad *conn_pads;
#endif;
};

成员

num

适配器的编号

list_head

包含 DVB 适配器的列表

device_list

包含 DVB 设备的列表

name

适配器的名称

proposed_mac

适配器的建议 MAC 地址

priv

私有数据

device

指向 struct device 的指针

module

指向 struct module 的指针

mfe_shared

指示互斥前端。1 = 传统的排除行为:阻止任何 open() 调用;2 = 增强的排除行为,模拟繁忙前端的标准行为:允许只读共享,否则当任何前端已经以写入访问权限打开时,立即返回 -EBUSY。

mfe_dvbdev

正在使用的前端设备,在 MFE 的情况下

mfe_lock

锁定以防止在使用 MFE 时使用其他前端。

mdev_lock

保护对 mdev 指针的访问。

mdev

指向 struct media_device 的指针,在媒体控制器使用时使用。

conn

RF 连接器。仅在设备没有单独的调谐器时使用。

conn_pads

指向与 conn 关联的 struct media_pad 的指针;

struct dvb_device

表示 DVB 设备节点

定义:

struct dvb_device {
    struct list_head list_head;
    struct kref ref;
    const struct file_operations *fops;
    struct dvb_adapter *adapter;
    enum dvb_device_type type;
    int minor;
    u32 id;
    int readers;
    int writers;
    int users;
    wait_queue_head_t wait_queue;
    int (*kernel_ioctl)(struct file *file, unsigned int cmd, void *arg);
#if defined(CONFIG_MEDIA_CONTROLLER_DVB);
    const char *name;
    struct media_intf_devnode *intf_devnode;
    unsigned tsout_num_entities;
    struct media_entity *entity, *tsout_entity;
    struct media_pad *pads, *tsout_pads;
#endif;
    void *priv;
};

成员

list_head

包含所有 DVB 设备的列表头

ref

此设备的引用计数

fops

指向 struct file_operations 的指针

adapter

指向拥有此设备节点的适配器的指针

type

设备类型,由 enum dvb_device_type 定义。

minor

devnode 次要编号。主要编号始终为 DVB_MAJOR。

id

适配器内的设备 ID 号

readers

由调用者初始化。每次以只读模式调用 open() 时,此计数器都会减一。

writers

由调用者初始化。每次以读/写模式调用 open() 时,此计数器都会减一。

users

由调用者初始化。每次以任何模式调用 open() 时,此计数器都会减一。

wait_queue

等待队列,用于等待 DVB API 调用者之一内部的某些事件

kernel_ioctl

用于处理来自用户空间的 ioctl 调用的回调函数。

name

用于媒体控制器中设备的名称

intf_devnode

指向 media_intf_devnode 的指针。由 dvbdev 核心用于存储 MC 设备节点接口

tsout_num_entities

传输流输出实体的数量

entity

指向与设备节点关联的 struct media_entity 的指针

tsout_entity

包含与每个 TS 输出节点关联的 MC 实体的数组

pads

指向与 entity 关联的 struct media_pad 的指针;

tsout_pads

包含每个 tsout_entity 源焊盘的数组

priv

私有数据

描述

DVB 核心(前端、CA、网络、解复用器)使用此结构来创建设备节点。通常,驱动程序不应直接初始化此结构。

struct dvbdevfops_node

在 dvbdevfops_list 中注册的 fops 节点

定义:

struct dvbdevfops_node {
    struct file_operations *fops;
    enum dvb_device_type type;
    const struct dvb_device *template;
    struct list_head list_head;
};

成员

fops

为 ->owner 注册动态分配的 fops

type

dvb_device 的类型

template

用于注册的 dvb_device

list_head

dvbdevfops_list 的 list_head

struct dvb_device *dvb_device_get(struct dvb_device *dvbdev)

增加 dvb_device 引用

参数

struct dvb_device *dvbdev

指向 struct dvb_device 的指针

void dvb_device_put(struct dvb_device *dvbdev)

减少 dvb_device 引用

参数

struct dvb_device *dvbdev

指向 struct dvb_device 的指针

int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module, struct device *device, short *adapter_nums)

注册新的 DVB 适配器

参数

struct dvb_adapter *adap

指向 struct dvb_adapter 的指针

const char *name

适配器名称

struct module *module

在调用者处用 THIS_MODULE 初始化

struct device *device

指向与设备驱动程序对应的 struct device 的指针

short *adapter_nums

包含用于 dvb_register_adapter 的数字列表的数组;用于在它们之间选择。通常,使用以下内容初始化:DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nums)

int dvb_unregister_adapter(struct dvb_adapter *adap)

注销一个 DVB 适配器

参数

struct dvb_adapter *adap

指向 struct dvb_adapter 的指针

int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, const struct dvb_device *template, void *priv, enum dvb_device_type type, int demux_sink_pads)

注册一个新的 DVB 设备

参数

struct dvb_adapter *adap

指向 struct dvb_adapter 的指针

struct dvb_device **pdvbdev

指向存储新的 struct dvb_device 的位置的指针

const struct dvb_device *template

用于创建 pdvbdev 的模板;

void *priv

私有数据

enum dvb_device_type type

设备类型,由 enum dvb_device_type 定义。

int demux_sink_pads

解复用器输出的数量,用于通过媒体控制器创建 TS 输出。

void dvb_remove_device(struct dvb_device *dvbdev)

删除已注册的 DVB 设备

参数

struct dvb_device *dvbdev

指向 struct dvb_device 的指针

描述

这不会释放内存。当引用计数器为空时,dvb_free_device() 将执行此操作

void dvb_unregister_device(struct dvb_device *dvbdev)

注销一个 DVB 设备

参数

struct dvb_device *dvbdev

指向 struct dvb_device 的指针

int dvb_create_media_graph(struct dvb_adapter *adap, bool create_rf_connector)

为设备的数字电视部分创建媒体图。

参数

struct dvb_adapter *adap

指向 struct dvb_adapter 的指针

bool create_rf_connector

如果为 true,则也创建 RF 连接器

描述

此函数检查媒体控制器实体上的所有 DVB 相关函数,并为媒体图创建所需的链接。它能够处理多个调谐器或多个前端,但如果设备有多个调谐器和多个前端,或者如果设备有多个复用器,则不会创建链接。在这种情况下,调用方驱动程序应手动创建其余链接。

void dvb_register_media_controller(struct dvb_adapter *adap, struct media_device *mdev)

在 DVB 适配器上注册一个媒体控制器

参数

struct dvb_adapter *adap

指向 struct dvb_adapter 的指针

struct media_device *mdev

指向 struct media_device 的指针

struct media_device *dvb_get_media_controller(struct dvb_adapter *adap)

获取关联的媒体控制器

参数

struct dvb_adapter *adap

指向 struct dvb_adapter 的指针

int dvb_generic_open(struct inode *inode, struct file *file)

DVB 设备使用的数字电视打开函数

参数

struct inode *inode

指向 struct inode 的指针。

struct file *file

指向 struct file 的指针。

描述

检查 DVB 设备节点是否仍然有效,权限是否正常,并增加负使用计数。

int dvb_generic_release(struct inode *inode, struct file *file)

DVB 设备使用的数字电视关闭函数

参数

struct inode *inode

指向 struct inode 的指针。

struct file *file

指向 struct file 的指针。

描述

检查 DVB 设备节点是否仍然有效,权限是否正常,并递减负使用计数。

long dvb_generic_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

DVB 设备使用的数字电视关闭函数

参数

struct file *file

指向 struct file 的指针。

unsigned int cmd

Ioctl 名称。

unsigned long arg

Ioctl 参数。

描述

检查 DVB 设备节点和 struct dvbdev.kernel_ioctl 是否仍然有效。 如果是,则调用 dvb_usercopy()

int dvb_usercopy(struct file *file, unsigned int cmd, unsigned long arg, int (*func)(struct file *file, unsigned int cmd, void *arg))

当发出 ioctl 命令时,在用户空间内存和内核空间之间复制数据。

参数

struct file *file

指向 file 结构体的指针。

unsigned int cmd

Ioctl 名称。

unsigned long arg

Ioctl 参数。

int (*func)(struct file *file, unsigned int cmd, void *arg)

实际处理 ioctl 的函数。

描述

辅助函数,使用 ioctl 的方向和大小从用户空间复制数据。然后,它调用 func,如果需要,将数据复制回用户空间。

struct i2c_client *dvb_module_probe(const char *module_name, const char *name, struct i2c_adapter *adap, unsigned char addr, void *platform_data)

用于探测 I2C 模块的辅助例程。

参数

const char *module_name

要探测的 I2C 模块的名称。

const char *name

I2C 模块的可选名称。用于调试目的。如果 NULL,则默认为 module_name

struct i2c_adapter *adap

指向 struct i2c_adapter 的指针,该结构描述了将要绑定模块的 I2C 适配器。

unsigned char addr

适配器的 I2C 地址,采用 7 位表示法。

void *platform_data

要传递给探测的 I2C 模块的平台数据。

描述

此函数将 I2C 设备绑定到 DVB 核心。所有使用 I2C 总线控制硬件的驱动程序都应使用此函数。使用 dvb_module_probe() 绑定的模块应使用 dvb_module_release() 来取消绑定。

注意

过去,DVB 模块(主要是前端)通过 dvb_attach() 宏绑定,该宏使用 I2C 底层函数进行丑陋的 hack。这种用法已被弃用,并将很快被删除。请改用此例程。

返回值

成功时,返回一个指向绑定的 I2C 设备的 struct i2c_client。否则返回 NULL

void dvb_module_release(struct i2c_client *client)

释放使用 dvb_module_probe() 分配的 I2C 设备。

参数

struct i2c_client *client

指向 struct i2c_client 的指针,其中包含要释放的 I2C 客户端。可以为 NULL

描述

此函数应用于释放 dvb_module_probe() 保留的所有资源,并解除 I2C 硬件的绑定。

dvb_attach

dvb_attach (FUNCTION, ARGS...)

将 DVB 前端连接到 DVB 核心。

参数

FUNCTION

要调用的前端模块上的函数。

ARGS...

FUNCTION 参数。

描述

此辅助函数在运行时加载前端模块并在那里使用 ARGS 运行 FUNCTION 函数。由于它增加了符号的使用计数,因此在取消注册时,应调用 dvb_detach()

注意

过去,DVB 模块(主要是前端)通过 dvb_attach() 宏绑定,该宏使用 I2C 底层函数进行丑陋的 hack。这种用法已被弃用,并将很快被删除。相反,您应该使用 dvb_module_probe()

dvb_detach

dvb_detach (FUNC)

分离通过 dvb_attach() 加载的 DVB 前端。

参数

FUNC

连接函数

描述

减少先前通过 dvb_attach() 调用的函数的使用计数。

3.1.2. 数字电视环形缓冲区

这些例程实现用于处理数字电视数据并将其从/复制到用户空间的环形缓冲区。

注意

  1. 出于性能原因,读取和写入例程不检查缓冲区大小和/或可用/空闲字节数。这必须在调用这些例程之前完成。例如

/* write @buflen: bytes */
free = dvb_ringbuffer_free(rbuf);
if (free >= buflen)
        count = dvb_ringbuffer_write(rbuf, buffer, buflen);
else
        /* do something */

/* read min. 1000, max. @bufsize: bytes */
avail = dvb_ringbuffer_avail(rbuf);
if (avail >= 1000)
        count = dvb_ringbuffer_read(rbuf, buffer, min(avail, bufsize));
else
        /* do something */
  1. 如果只有一个读取器和一个写入器,则无需锁定读取或写入操作。必须锁定两个或多个读取器以防止互相干扰。刷新缓冲区算作读取操作。重置缓冲区算作读取和写入操作。必须锁定两个或多个写入器以防止互相干扰。

struct dvb_ringbuffer

描述 DVB 框架中使用的环形缓冲区。

定义:

struct dvb_ringbuffer {
    u8 *data;
    ssize_t size;
    ssize_t pread;
    ssize_t pwrite;
    int error;
    wait_queue_head_t queue;
    spinlock_t lock;
};

成员

data

写入环形缓冲区数据的区域。

size

环形缓冲区的大小。

pread

下一个读取位置。

pwrite

下一个写入位置。

error

环形缓冲区客户端用于指示发生错误。

queue

环形缓冲区客户端用于指示缓冲区何时已满的等待队列。

lock

用于保护环形缓冲区的自旋锁。

void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)

初始化环形缓冲区、锁和队列。

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

void *data

指向存储数据的缓冲区的指针。

size_t len

从环形缓冲区到 buf 的字节数。

int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf)

测试缓冲区是否为空。

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf)

返回缓冲区中的可用字节数

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

返回值

缓冲区中可用的字节数

ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf)

返回缓冲区中等待的字节数

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

返回值

缓冲区中等待的字节数

void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf)

将环形缓冲区重置为初始状态

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

描述

将读取和写入指针重置为零并刷新缓冲区。

这算作一次读取和写入操作

void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf)

刷新缓冲区

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf)

刷新受自旋锁保护的缓冲区并唤醒等待的任务

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

DVB_RINGBUFFER_PEEK

DVB_RINGBUFFER_PEEK (rbuf, offs)

查看缓冲区中偏移量为 **offs** 的字节

参数

rbuf

指向 struct dvb_ringbuffer 的指针。

offs

环形缓冲区内的偏移量

DVB_RINGBUFFER_SKIP

DVB_RINGBUFFER_SKIP (rbuf, num)

将读取指针前进 **num** 个字节

参数

rbuf

指向 struct dvb_ringbuffer 的指针。

num

要前进的字节数

ssize_t dvb_ringbuffer_read_user(struct dvb_ringbuffer *rbuf, u8 __user *buf, size_t len)

将缓冲区读取到用户指针

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

u8 __user *buf

指向存储数据的缓冲区的指针。

size_t len

从环形缓冲区到 buf 的字节数。

描述

此变体假设缓冲区位于用户空间的内存中。因此,它将在内部调用 copy_to_user()。

返回值

传输的字节数或 -EFAULT

void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf, size_t len)

将缓冲区读取到指针

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

u8 *buf

指向存储数据的缓冲区的指针。

size_t len

从环形缓冲区到 buf 的字节数。

描述

此变体假设缓冲区位于内核空间的内存中

返回值

传输的字节数或 -EFAULT

DVB_RINGBUFFER_WRITE_BYTE

DVB_RINGBUFFER_WRITE_BYTE (rbuf, byte)

将单个字节写入环形缓冲区

参数

rbuf

指向 struct dvb_ringbuffer 的指针。

byte

要写入的字节

ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf, size_t len)

将缓冲区写入环形缓冲区

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

const u8 *buf

指向将从中读取数据的缓冲区的指针

size_t len

从环形缓冲区到 buf 的字节数。

描述

此变体假设缓冲区位于内核空间的内存中

返回值

传输的字节数或 -EFAULT

ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf, const u8 __user *buf, size_t len)

写入通过用户指针接收的缓冲区

参数

struct dvb_ringbuffer *rbuf

指向 struct dvb_ringbuffer 的指针。

const u8 __user *buf

指向将从中读取数据的缓冲区的指针

size_t len

从环形缓冲区到 buf 的字节数。

描述

此变体假设缓冲区位于用户空间的内存中。因此,它将在内部调用 copy_from_user()。

返回值

传输的字节数或 -EFAULT

ssize_t dvb_ringbuffer_pkt_write(struct dvb_ringbuffer *rbuf, u8 *buf, size_t len)

将数据包写入环形缓冲区。

参数

struct dvb_ringbuffer *rbuf

要写入的环形缓冲区。

u8 *buf

要写入的缓冲区。

size_t len

缓冲区长度(目前最大限制为 65535 字节)。

返回值

写入的字节数,或 -EFAULT、-ENOMEM、-EINVAL。

ssize_t dvb_ringbuffer_pkt_read_user(struct dvb_ringbuffer *rbuf, size_t idx, int offset, u8 __user *buf, size_t len)

从环形缓冲区中的数据包读取。

参数

struct dvb_ringbuffer *rbuf

相关的环形缓冲区。

size_t idx

dvb_ringbuffer_pkt_next() 返回的数据包索引。

int offset

要读取的数据包偏移量。

u8 __user *buf

数据目标缓冲区。

size_t len

目标缓冲区的大小。

返回值

读取的字节数,或 -EFAULT。

描述

注意

dvb_ringbuffer_read() 不同,此函数**不**更新环形缓冲区中的读取指针。您必须使用 dvb_ringbuffer_pkt_dispose() 将数据包标记为不再需要。

ssize_t dvb_ringbuffer_pkt_read(struct dvb_ringbuffer *rbuf, size_t idx, int offset, u8 *buf, size_t len)

从环形缓冲区中的数据包读取。

参数

struct dvb_ringbuffer *rbuf

相关的环形缓冲区。

size_t idx

dvb_ringbuffer_pkt_next() 返回的数据包索引。

int offset

要读取的数据包偏移量。

u8 *buf

数据目标缓冲区。

size_t len

目标缓冲区的大小。

注意

dvb_ringbuffer_read_user() 不同,此函数**确实**更新环形缓冲区中的读取指针。

返回值

读取的字节数,或 -EFAULT。

void dvb_ringbuffer_pkt_dispose(struct dvb_ringbuffer *rbuf, size_t idx)

处理环形缓冲区中的数据包。

参数

struct dvb_ringbuffer *rbuf

相关的环形缓冲区。

size_t idx

dvb_ringbuffer_pkt_next() 返回的数据包索引。

ssize_t dvb_ringbuffer_pkt_next(struct dvb_ringbuffer *rbuf, size_t idx, size_t *pktlen)

获取环形缓冲区中下一个数据包的索引。

参数

struct dvb_ringbuffer *rbuf

相关的环形缓冲区。

size_t idx

上一个数据包的索引,如果需要返回第一个数据包的索引,则为-1。

size_t *pktlen

如果成功,将更新为包含数据包的字节长度。返回数据包索引(如果 >= 0),如果没有可用的数据包,则返回 -1。

3.1.3. 数字电视 VB2 处理程序

enum dvb_buf_type

数字电视内存映射缓冲区的类型

常量

DVB_BUF_TYPE_CAPTURE

缓冲区由内核填充,包含接收到的数字电视流

enum dvb_vb2_states

控制 VB2 状态机的状态

常量

DVB_VB2_STATE_NONE

VB2 引擎尚未初始化、初始化失败或 VB2 已释放。

DVB_VB2_STATE_INIT

VB2 引擎已初始化。

DVB_VB2_STATE_REQBUFS

已请求缓冲区

DVB_VB2_STATE_STREAMON

VB2 正在流式传输。调用者不应直接检查它。相反,他们应该使用 dvb_vb2_is_streaming()

注意

描述

调用者不应直接接触状态机。这在 dvb_vb2.c 中处理。

struct dvb_buffer

v4l2 的视频缓冲区信息。

定义:

struct dvb_buffer {
    struct vb2_buffer       vb;
    struct list_head        list;
};

成员

vb

嵌入式结构 vb2_buffer

list

struct dvb_buffer 的列表。

struct dvb_vb2_ctx

VB2 处理程序的控制结构

定义:

struct dvb_vb2_ctx {
    struct vb2_queue        vb_q;
    struct mutex            mutex;
    spinlock_t slock;
    struct list_head        dvb_q;
    struct dvb_buffer       *buf;
    int offset;
    int remain;
    int state;
    int buf_siz;
    int buf_cnt;
    int nonblocking;
    enum dmx_buffer_flags flags;
    u32 count;
    char name[DVB_VB2_NAME_MAX + 1];
};

成员

vb_q

指向带有 videobuf2 队列的 struct vb2_queue 的指针。

mutex

用于序列化 vb2 操作的互斥锁。由 vb2 核心 wait_preparewait_finish 操作使用。

slock

用于保护 dvb_vb2.c 中缓冲区填充的自旋锁。

dvb_q

尚未填充的缓冲区列表。

buf

指向当前正在填充的缓冲区的指针。

offset

要填充的 buf 中下一个位置的索引。

remain

还剩多少字节要填充到 buf 中。

state

enum dvb_vb2_states 定义的缓冲区状态的位掩码。

buf_siz

每个 VB2 缓冲区的大小。

buf_cnt

VB2 缓冲区的数量。

nonblocking

如果大于零,则设备以非阻塞模式运行。

flags

enum dmx_buffer_flags 定义的缓冲区标志。仅在 DMX_DQBUF 中填充。DMX_QBUF 应将此字段置零。

count

用于填充缓冲区的单调计数器。有助于识别数据流丢失。仅在 DMX_DQBUF 中填充。DMX_QBUF 应将此字段置零。

name

设备类型的名称。当前,它可以是“dvr”或“demux_filter”。

int dvb_vb2_init(struct dvb_vb2_ctx *ctx, const char *name, int non_blocking)

初始化 VB2 处理程序

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

const char *name

VB2 处理程序的名称

int non_blocking

如果不为零,则表示设备处于非阻塞模式

int dvb_vb2_release(struct dvb_vb2_ctx *ctx)

释放 VB2 处理程序分配的资源并将 ctx 置于 DVB_VB2_STATE_NONE 状态。

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

int dvb_vb2_is_streaming(struct dvb_vb2_ctx *ctx)

检查 VB2 处理程序是否正在流式传输

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

返回值

如果未流式传输,则为 0,否则为 1。

int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, const unsigned char *src, int len, enum dmx_buffer_flags *buffer_flags)

填充 VB2 缓冲区

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

const unsigned char *src

存储数据的位置

int len

要从 src 复制的字节数

enum dmx_buffer_flags *buffer_flags

指向由 enum dmx_buffer_flags 定义的缓冲区标志的指针。可以为 NULL。

__poll_t dvb_vb2_poll(struct dvb_vb2_ctx *ctx, struct file *file, poll_table *wait)

用于数字电视缓冲区处理的 vb2_core_streamon() 的包装器。

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

struct file *file

传递给 poll 文件操作处理程序的 struct file 参数。

poll_table *wait

传递给 poll 文件操作处理程序的 poll_table wait 参数。

描述

实现 poll syscall() 逻辑。

int dvb_vb2_stream_on(struct dvb_vb2_ctx *ctx)

用于数字电视缓冲区处理的 vb2_core_streamon() 的包装器。

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

描述

启动 DVB 流传输

int dvb_vb2_stream_off(struct dvb_vb2_ctx *ctx)

用于数字电视缓冲处理的 vb2_core_streamoff() 的封装。

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

描述

停止 DVB 流传输

int dvb_vb2_reqbufs(struct dvb_vb2_ctx *ctx, struct dmx_requestbuffers *req)

用于数字电视缓冲处理的 vb2_core_reqbufs() 的封装。

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

struct dmx_requestbuffers *req

为了处理 DMX_REQBUFS,从用户空间传递的 struct dmx_requestbuffers

描述

通过请求一定数量的缓冲区来启动流传输。 如果 req->count 为零,也用于释放先前请求的缓冲区。

int dvb_vb2_querybuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b)

用于数字电视缓冲处理的 vb2_core_querybuf() 的封装。

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

struct dmx_buffer *b

为了处理 DMX_QUERYBUF,从用户空间传递的 struct dmx_buffer

int dvb_vb2_expbuf(struct dvb_vb2_ctx *ctx, struct dmx_exportbuffer *exp)

用于数字电视缓冲处理的 vb2_core_expbuf() 的封装。

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

struct dmx_exportbuffer *exp

为了处理 DMX_EXPBUF,从用户空间传递的 struct dmx_exportbuffer

描述

将缓冲区导出为文件描述符。

int dvb_vb2_qbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b)

用于数字电视缓冲处理的 vb2_core_qbuf() 的封装。

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

struct dmx_buffer *b

为了处理 DMX_QBUF,从用户空间传递的 struct dmx_buffer

描述

按照用户空间请求,将一个数字电视缓冲区入队。

int dvb_vb2_dqbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b)

用于数字电视缓冲处理的 vb2_core_dqbuf() 的封装。

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

struct dmx_buffer *b

为了处理 DMX_DQBUF,从用户空间传递的 struct dmx_buffer

描述

将一个数字电视缓冲区出队到用户空间。

int dvb_vb2_mmap(struct dvb_vb2_ctx *ctx, struct vm_area_struct *vma)

用于数字电视缓冲处理的 vb2_mmap() 的封装。

参数

struct dvb_vb2_ctx *ctx

VB2 处理程序的控制结构

struct vm_area_struct *vma

指向 struct vm_area_struct 的指针,其中 vma 被传递给驱动程序中 mmap 文件操作处理程序。

描述

将数字电视视频缓冲区映射到应用程序地址空间。