XS9922驱动

XS9922B 是一款四通道多合一模拟高清解码器,支持HDcctv高清协议CVBS标清协议。它最大支持1080p @ 30fps的视频分辨率,具有以下亮点:

  • 四通道视频输入
  • MIPI CSI-2 4-Lane视频输出
  • 支持音频传输
  • 封装:QFN88,尺寸为10mm x 10mm 1.

此芯片将接收到的高清模拟复合视频信号经过模数转化、视频解码以及2D图像处理之后,转化为YCbCr,并以MIPI CSI接口输出。

此外,XS9922A/B 是另一款四通道模拟复合视频解码芯片方案,同样支持HDcctv高清协议和CVBS标清协议,最高支持4路2M@30fps。它也将接收到的高清模拟复合视频信号转化为YCbCr并以MIPI CSI接口输出

硬件原理图连接:

设备树配置

RK3568 MIPI CSI RX端配置

&csi2_dphy_hw {status = "okay";
};&csi2_dphy0 {status = "okay";ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;#address-cells = <1>;#size-cells = <0>;mipi_in_ucam0: endpoint@1 {reg = <1>;remote-endpoint = <&ucam_out0>;data-lanes = <1 2 3 4>;}; };port@1 {reg = <1>;#address-cells = <1>;#size-cells = <0>;csidphy_out: endpoint@0 {reg = <0>;remote-endpoint = <&mipi_csi2_input>;};};};
};&mipi_csi2 {status = "okay";ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;#address-cells = <1>;#size-cells = <0>;mipi_csi2_input: endpoint@1 {reg = <1>;remote-endpoint = <&csidphy_out>;data-lanes = <1 2 3 4>;};};port@1 {reg = <1>;#address-cells = <1>;#size-cells = <0>;mipi_csi2_output: endpoint@0 {reg = <0>;remote-endpoint = <&cif_mipi_in>;};};};};&rkcif_mipi_lvds {status = "okay";port {cif_mipi_in: endpoint {remote-endpoint = <&mipi_csi2_output>;data-lanes = <1 2 3 4>;};};
};

xs9922设备树配置

		xs9922: xs9922@31 {compatible = "xs9922";status = "okay";reg = <0x31>;clocks = <&cru CLK_CAM0_OUT>; clock-names = "xvclk";pinctrl-names = "rockchip,camera_default";//使用CAM CLK0引脚pinctrl-0 = <&cam_clkout0>;power-domains = <&power RK3568_PD_VI>;//复位GPIOreset-gpios = <&gpio4 RK_PB7 GPIO_ACTIVE_HIGH>;//外接摄像头电源GPIOpower2-gpios = <&gpio4 RK_PD0 GPIO_ACTIVE_HIGH>;rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "front";rockchip,camera-module-name = "default";rockchip,camera-module-lens-name = "default";port {ucam_out0: endpoint {remote-endpoint = <&mipi_in_ucam0>;data-lanes = <1 2 3 4>;};};};

RK3568 SDK默认支持XS9922驱动:

drivers\media\i2c\xs9922\xs9922_reg_cfg.h

xs9922_init_cfg


typedef struct regval {unsigned short addr;  //芯片数据地址unsigned char val;    //i2c数据unsigned char nDelay; // 延时
}REG_VAL;xs9922 i2c初始化配置
REG_VAL xs9922_init_cfg[] = {{0x4200, 0x3f, 0x00},{0x4210, 0x3f, 0x00},{0x4220, 0x3f, 0x00},
...//图像调优参数//{0x0106, 0x80}, // contrast //{0x0107, 0x00}, // brightness//{0x0108, 0x80}, // staturation//{0x0109, 0x00}, // hue
...xs9922MIPI 输出速率,默认1.2G{0x511b, 0x36, 0x00},//0x78=1.5G,0x36=1.2G,0x34=1G,0x32=800M
...};
//1080p 配置
REG_VAL xs9922_1080p_4lanes_25fps[] = {
...
};//720p配置
REG_VAL xs9922_720p_4lanes_25fps[] = {	
...
};
//xs9922音频配置参数
REG_VAL xs9922_audio_codec[] = {...
};

xs9922.c

static const struct xs9922_mode supported_modes[] = {{//supported_modes[0] 720p配置.bus_fmt = MEDIA_BUS_FMT_UYVY8_2X8, // MEDIA_BUS_FMT_UYVY8_2X8,.width = 1280,.height = 720,.max_fps = {.numerator = 10000,.denominator = 150000,},.global_reg_list = xs9922_init_cfg,.reg_list = xs9922_720p_4lanes_25fps,...},{//supported_modes[1] 1920p配置.bus_fmt = MEDIA_BUS_FMT_UYVY8_2X8, // MEDIA_BUS_FMT_UYVY8_2X8,.width = 1920,.height = 1080,.max_fps = {.numerator = 10000,.denominator = 150000,},.global_reg_list = xs9922_init_cfg,.reg_list = xs9922_1080p_4lanes_25fps,...}};驱动配置函数
static int xs9922_probe(struct i2c_client *client,const struct i2c_device_id *id)
{...//走1080p,supported_modes[0]为720pxs9922->cur_mode = &supported_modes[1]; ...//上电时许  RK3568 CLK时钟初始化ret = __xs9922_power_on(xs9922);if (ret) {dev_err(dev, "Failed to power on xs9922\n");goto err_free_handler;}//读芯片ID 比较ret = check_chip_id(client);if (ret) {dev_err(dev, "Failed to check senosr id\n");goto err_free_handler;}//热插拔事件初始化 一般没啥用xs9922->input_dev = devm_input_allocate_device(dev);if (xs9922->input_dev == NULL) {dev_err(dev, "failed to allocate xs9922 input device\n");return -ENOMEM;}xs9922->input_dev->name = "xs9922_input_event";set_bit(EV_MSC, xs9922->input_dev->evbit);set_bit(MSC_RAW, xs9922->input_dev->mscbit);...//PM电源管理初始化pm_runtime_set_active(dev);pm_runtime_enable(dev);pm_runtime_idle(dev);//初始化I2C数据,启动热拔插线程read_config(xs9922);
}

static int read_config(void *data) //初始化I2C数据,启动热拔插线程

static int read_config(void *data)
{...//I2C 写入初始化配置xs9922_write_array(xs9922->client, xs9922->cur_mode->global_reg_list);....//打开驱动文件/etc/board.conf 获取走的分辨率配置,没有文件则走软件默认配置do {fp = filp_open(config_file, O_RDONLY, 0);...} while (tries > 0);if (IS_ERR(fp)) {printk(KERN_ERR "open " config_file " fail!!!\n");// return -1;} else {.....}//写入分辨率配置 数据switch_mode(xs9922);xs9922_write_array(xs9922->client, xs9922_lastInit);热拔插线程detect_thread_start(xs9922);printk("__xs9922_init out\n");return 0;
}

 xs9922_ioctl一般由RK热拔插capture.c调用

static long xs9922_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
{...//RK热拔插驱动获取热拔插状态case RKMODULE_GET_VICAP_RST_INFO:xs9922_get_vicap_rst_inf(xs9922, (struct rkmodule_vicap_reset_info *)arg);// printk("[chad] Get vicap reset info --->>> is_reset : %d\n", xs9922->is_reset);break;case RKMODULE_SET_VICAP_RST_INFO:xs9922_set_vicap_rst_inf(xs9922, *(struct rkmodule_vicap_reset_info *)arg);// printk("[chad] Set vicap reset info --->>> is_reset : %d\n", xs9922->is_reset);break;//由RK热拔插驱动调用,复位MIPI数据case RKMODULE_SET_QUICK_STREAM:stream = *((u32 *)arg);if (stream) {dev_info(&xs9922->client->dev,"[chad]======== quick stream on: do xs9922 mipi reset start =======\n");ret = xs9922_write_reg(xs9922->client, 0x5004,XS9922_REG_VALUE_08BIT, 0x00);...dev_info(&xs9922->client->dev,"[chad]======== quick stream on: do xs9922 mipi reset end =======\n");} else {xs9922_write_reg(xs9922->client, 0x0e08,XS9922_REG_VALUE_08BIT, 0x00);....dev_info(&xs9922->client->dev,"[chad]======== quick stream off:xs9922 mipi Disabled =======\n");usleep_range(100 * 1000, 110 * 1000);}// mutex_unlock(&xs9922->mutex);break;...return ret;
}

MIPI输出 关闭

static int __xs9922_start_stream(struct xs9922 *xs9922)
{struct i2c_client *client = xs9922->client;
#ifdef OPEN_XS9922_INITxs9922_write_array(xs9922->client, xs9922->cur_mode->global_reg_list);switch_mode(xs9922);xs9922_write_array(xs9922->client, xs9922_lastInit);
#endifxs9922_write_reg(client, 0x5004, XS9922_REG_VALUE_08BIT, 0x00);xs9922_write_reg(client, 0x5005, XS9922_REG_VALUE_08BIT, 0x00);xs9922_write_reg(client, 0x5006, XS9922_REG_VALUE_08BIT, 0x00);xs9922_write_reg(client, 0x5007, XS9922_REG_VALUE_08BIT, 0x01);usleep_range(220 * 1000, 230 * 1000);xs9922_write_reg(client, 0x0e08, XS9922_REG_VALUE_08BIT, 0x01);xs9922_write_reg(client, 0x1e08, XS9922_REG_VALUE_08BIT, 0x01);xs9922_write_reg(client, 0x2e08, XS9922_REG_VALUE_08BIT, 0x01);xs9922_write_reg(client, 0x3e08, XS9922_REG_VALUE_08BIT, 0x01);dev_dbg(&client->dev, "%s OUT---<<<\n", __func__);return 0;
}static int __xs9922_stop_stream(struct xs9922 *xs9922)
{struct i2c_client *client = xs9922->client;dev_dbg(&client->dev, "%s In---<<<\n", __func__);// usleep_range(50 * 1000, 60 * 1000);xs9922_write_reg(client, 0x0e08, XS9922_REG_VALUE_08BIT, 0x00);xs9922_write_reg(client, 0x1e08, XS9922_REG_VALUE_08BIT, 0x00);xs9922_write_reg(client, 0x2e08, XS9922_REG_VALUE_08BIT, 0x00);xs9922_write_reg(client, 0x3e08, XS9922_REG_VALUE_08BIT, 0x00);// usleep_range(150 * 1000, 160 * 1000);xs9922_write_reg(client, 0x5004, XS9922_REG_VALUE_08BIT, 0x00);xs9922_write_reg(client, 0x5005, XS9922_REG_VALUE_08BIT, 0x00);xs9922_write_reg(client, 0x5006, XS9922_REG_VALUE_08BIT, 0x00);xs9922_write_reg(client, 0x5007, XS9922_REG_VALUE_08BIT, 0x00);
#if __CLOSE_SENSOR__detect_thread_stop(xs9922);
#endifdev_dbg(&client->dev, "%s OUT---<<<\n", __func__);return 0;
}

BUG:

1.720P 也可用 xs9922_1080p_4lanes_25fps 配置,V4L2下发获取分辨率720P即可

2.图像有绿条,测试配置1.5G速率  {0x511b, 0x78, 0x00},//0x78=1.5G,0x36=1.2G,0x34=1G,0x32=800M 是否改善

3.I2C 数据无法写入,使用外部晶振确认是否起振,使用RK3568 CameraCLK引脚确认有无时钟

4.可以获取寄存器地址 1<<12 ,2<<12,3<<12,4<<12 ,获取接入摄像头的 分辨率

	for (i = 0; i < PAD_MAX; i++) {xs9922_read_reg(xs9922->client, 0x0001 | (i << 12), 1, &value);if (value == 64) {printk("i= %d,AutoPareVideoSize 720p\n",i);} else if (value == 68) {printk("i = %d 1080p\n",i);}
}

5.打开摄像头 预览画面出现图像断层,请尝试延长__xs9922_start_stream 里的延时 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/637086.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装IntelliJ IDEA

文章目录 一、前言二、下载IDEA三、安装四、破解 一、前言 工欲善其事必先利其器&#xff0c;学习JAVA的第一步&#xff0c;首先是安装IDE&#xff0c;配置环境&#xff1b; 常用的JAVA IDE是IntelliJ IDEA和eclipse&#xff0c;我选择IntelliJ IDEA 二、下载IDEA 官网下载&…

MT3023 歌词中找单词

1.暴力 10/12 #include <bits/stdc.h> using namespace std; int n; string a[10005]; int main() {cin >> n;for (int i 0; i < n; i)cin >> a[i];string ll;cin >> ll;for (int i 0; i < n; i){string u a[i];int num 0;int j 0;for (in…

算法课程笔记——STL题目

长度为2的字符串&#xff0c;当in下标为一&#xff0c;也就是\n,当i&#xff01;n&#xff0c;就是输出空格 &&且 city从citys里面取 加速后就不能混用scanf

MySql运维篇

目录 一.日志 1.1日志分类 1.2Error Log 1.3BinaryLog 1.4SlowQuery Log 二.备份 2.1备份原因 2.2备份目标 2.3备份技术 2.3.1物理备份 2.3.2逻辑备份 2.4备份方式 2.4.1完全备份 2.4.2增量备份 2.4.3差异备份 2.5备份环境准备 2.6完全备份实验 2.6.1完全备…

Jenkins服务器IP更换,Jenkins URL地址更换

服务器的网络地址发生变动&#xff0c;修改jenkins服务器IP地址后&#xff0c;jenkins网页能够打开&#xff0c;但是job中的配置钩子没有自动改变&#xff0c;如图所示&#xff1a; 经过查询资料了解&#xff0c;需要修改jenkins本地化配置地址才可以显示正确&#xff1a; 1、…

上位机图像处理和嵌入式模块部署(树莓派4b和驱动的编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 树莓派4b上面还支持驱动代码的编写&#xff0c;这是我没有想到的。这里驱动&#xff0c;更多的是一种框架的编写&#xff0c;不一定是编写真正的驱…

苹果开发初学者指南:Xcode 如何为运行的 App 添加环境变量(Environmental Variable)

概览 Xcode 15 在运行 SwiftUI 代码时突然报告如下警告&#xff1a; Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API and this value is being ignored. Please fix this problem. 不仅如此…

scratch图章画图 2024年3月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch图章画图 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、p…

mysql基础14——视图

视图 视图是一种虚拟表 可以把一段查询语句作为视图存储在数据库中 需要的时候把视图看作一个表&#xff0c;对里面的数据进行查询 视图并没有真正存储数据 避免了数据存储过程中可能产生的冗余 提高了存储的效率 子查询 嵌套在另一个查询中的查询 派生表 如果在查询中…

【linux】基础IO(软硬链接)

上一节我们已经搞懂了已经被打开的文件&#xff0c;还有没有被打开的文件都是怎样被管理起来的&#xff0c;同样&#xff0c;路径的重要性也不言而喻&#xff0c;是确定文件在那个分区&#xff0c;进而可以解析到目标文件与目录内容的关系&#xff0c;从而找到inode&#xff0c…

机器学习预测汽车油耗效率 MPG

流程 数据获取导入需要的包引入文件,查看内容划分训练集和测试集调用模型查看准确率 数据获取 链接&#xff1a;https://pan.baidu.com/s/1KeIJykbcVpsfEk0xjhiICA?pwd30oe 提取码&#xff1a;30oe --来自百度网盘超级会员V1的分享导入需要的包 import pandas as pd imp…

【QT学习】8.qt事件处理机制,事件过滤器,自定义事件

1.qt事件处理机制 事件处理&#xff1a; 当用户移动鼠标的时候 &#xff0c;创建一个 鼠标移动事件对象 然后把这个对象放到 事件队列里面去&#xff0c;事件管理器 从队列中 取出事件&#xff0c;然后 调用其对应的事件处理函数。 多态机制&#xff1a; &#x…