SDK相关 - 修改帧率

RV1126 / RV1126B-p 注意区分
跳转到 RV1126 SDK | 跳转到 RV1126B-p SDK
这块板子走的是 rkipc.ini 的 src_frame_rate_num 不会把 sensor 拉到 60fps,必须换带 60fps 寄存器表的驱动。
IMX307 以这份驱动为准(仓库根目录 imx307.c),不要再按 SDK 原版 kernel-6.1/drivers/media/i2c/imx307.c 自己拼表。
| Sensor | 这份驱动里的现状 | 说明 |
|---|---|---|
| IMX307 | 已加 MIPI 1080p@60 寄存器,默认 mode 会下这套表 | 直接替换内核驱动即可 |
| IMX415 | SDK 原版仍是 4K / 1080p binning 30fps | 见文末,暂无改好的驱动 |
IMX307:驱动怎么用
下载地址
在左侧 资料下载 首页 / RV1126BP / 02.软件资料 / 驱动_imx307
1. 替换内核驱动
把 imx307.c 覆盖到 SDK:
# 在 SDK 根目录
cp /path/to/imx307.c kernel-6.1/drivers/media/i2c/imx307.c
若 kernel/ 是独立树而不是指向 kernel-6.1 的软链接,两边都要换成同一份。
然后重编内核并刷 boot.img:
make kernel
2. 这份驱动相对 SDK 原版改了什么
SDK 原版 MIPI 只有 30fps linear + HDR2。在 MIPI 侧补了 60fps 寄存器,并把它挂成 默认 mode(数组第 0 条)。
新增表:imx307_linear_1920x1080_60fps_mipi_regs
注释写的是:
- Xclk
37.125MHz max_framerate 60fpsmipi_datarate per lane 445.5Mbps,4-lane
probe() 里 MIPI 走 mipi_supported_modes,并且:
imx307->cur_mode = &imx307->support_modes[0];
find_best_fit() 按分辨率匹配,同分辨率会选 第一条。所以板端 MIPI 1080p linear 实际上会下 60fps 那套寄存器。
3. 60fps 相对 30fps 改了哪些寄存器
30fps 底表是原来的 imx307_linear_1920x1080_mipi_regs(222.75Mbps)。60fps 表在这个基础上改了 FRSEL、HMAX,以及 MIPI 445.5Mbps 的 CSI timing(和 HDR2 MIPI 那档对齐)。
| 寄存器 | 30fps MIPI | 60fps MIPI | 含义 |
|---|---|---|---|
0x3009 | 0x02 | 0x01 | FRSEL:30 → 60 |
0x301C / 0x301D | 0x30 / 0x11(HMAX=0x1130=4400) | 0x98 / 0x08(HMAX=0x0898=2200) | 行长减半,帧率翻倍 |
0x3018 / 0x3019 | 0x65 / 0x04(VMAX=0x0465=1125) | 保持 | 垂直不变 |
0x3405 | 0x20 | 0x10 | MIPI 速率档:222 → 445.5Mbps |
0x3446 | 0x47 | 0x57 | CSI 全局 timing |
0x3448 | 0x1F | 0x37 | 同上 |
0x344A | 0x17 | 0x1F | 同上 |
0x344C | 0x0F | 0x1F | 同上 |
0x344E | 0x17 | 0x1F | 同上 |
0x3450 | 0x47 | 0x77 | 同上 |
0x3452 | 0x0F | 0x1F | 同上 |
0x3443=0x03(4-lane)、0x3441/0x3442=0x0A(RAW10)、0x3046=0x00(MIPI)都没动。
完整 60fps 表在驱动里是这样的:
/*
* Xclk 37.125Mhz
* max_framerate 60fps
* mipi_datarate per lane 445.5Mbps 4 lane
*/
static const struct regval imx307_linear_1920x1080_60fps_mipi_regs[] = {
{0x3003, 0x01},
{REG_DELAY, 0x10},
{0x3000, 0x01},
{0x3001, 0x00},
{0x3002, 0x01},
{0x3005, 0x00},
{0x3007, 0x00},
{0x3009, 0x01},
{0x300A, 0x3c},
{0x3010, 0x21},
{0x3011, 0x0a},
{0x3018, 0x65},
{0x3019, 0x04},
{0x301C, 0x98},
{0x301D, 0x08},
{0x3046, 0x00},
{0x304B, 0x0A},
/* ... INCK / analog 与 30fps 相同 ... */
{0x3405, 0x10},
{0x3407, 0x03},
{0x3414, 0x0A},
{0x3418, 0x49},
{0x3419, 0x04},
{0x3441, 0x0a},
{0x3442, 0x0a},
{0x3443, 0x03},
{0x3444, 0x20},
{0x3445, 0x25},
{0x3446, 0x57},
{0x3447, 0x00},
{0x3448, 0x37},
{0x3449, 0x00},
{0x344A, 0x1F},
{0x344B, 0x00},
{0x344C, 0x1F},
{0x344D, 0x00},
{0x344E, 0x1F},
{0x344F, 0x00},
{0x3450, 0x77},
{0x3451, 0x00},
{0x3452, 0x1F},
{0x3453, 0x00},
{0x3454, 0x17},
{0x3455, 0x00},
{0x3472, 0x9c},
{0x3473, 0x07},
{0x3480, 0x49},
{0x3002, 0x00},
{REG_NULL, 0x00},
};
4. MIPI mode 表(以驱动为准)
static const struct imx307_mode mipi_supported_modes[] = {
{
/* 默认:下 60fps 寄存器 */
.bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
.width = 1948,
.height = 1097,
.max_fps = {
.numerator = 10000,
.denominator = 300000,
},
.exp_def = 0x03fe,
.hts_def = 0x1130,
.vts_def = 0x0465,
.reg_list = imx307_linear_1920x1080_60fps_mipi_regs,
.hdr_mode = NO_HDR,
.lanes = 4,
.freq_idx = 0,
.bpp = 10,
}, {
/* 原 30fps MIPI linear */
.reg_list = imx307_linear_1920x1080_mipi_regs,
.hdr_mode = NO_HDR,
.freq_idx = 0,
/* 分辨率同样是 1948x1097,不会被 find_best_fit 选中 */
}, {
/* HDR2 30fps */
.reg_list = imx307_hdr2_1920x1080_mipi_regs,
.hdr_mode = HDR_X2,
.freq_idx = 1,
},
};
驱动里另外还有一份 imx307_linear_1920x1080_30fps_mipi_regs,没有挂到 mode 表,实际不会用。
第一条 mode 的 reg_list 已经是 60fps,但 max_fps 仍是 300000/10000(对外报 30fps),hts_def 仍是 0x1130(30fps 的 HMAX),freq_idx 仍是 0(111.37MHz / 约 222Mbps)。
sensor 会按 60fps + 445.5Mbps 出图;V4L2 / AE 仍按 30fps、222Mbps 算。应用层要把码流改成 60 时,以这份驱动为准即可,不必再改寄存器。若后面要让 v4l2-ctl --list-frameintervals 也报 60,再把第一条改成:
.max_fps = { .numerator = 10000, .denominator = 600000 },
.hts_def = 0x0898,
.freq_idx = 1, /* IMX307_LINK_FREQ_222M */
5. 应用层 rkipc.ini
驱动换完后,码流帧率仍看 ini。板子上生效的是 /userdata/rkipc.iniRkLunch.sh 里若已有这份就不会再从 /oem 拷)。
IMX307 对应配置一般是 rkipc-imx307.ini,改:
[video.0]
src_frame_rate_den = 1
src_frame_rate_num = 60
dst_frame_rate_den = 1
dst_frame_rate_num = 60
gop = 120
子码流 [video.1] 同样把 src/dst_frame_rate_num 改成 60。不要只改 IQ json,IQ 不决定 sensor 帧率。
网页后台改分辨率/帧率后也会写回 /userdata/rkipc.ini。
6. 刷机后怎么确认
dmesg | grep imx307
# 应看到 Detected imx307 / driver version: 00.01.06
v4l2-ctl -d /dev/v4l-subdev0 --list-frameintervals
出图后看实际帧率(RTSP / rkipc 日志 / ISP 统计)。寄存器已经是 60fps 时,画面会按 60 出;若码流仍是 30,多半是 ini 没改到 /userdata/rkipc.ini。
IMX415(SDK 原版,尚未换驱动)
IMX415 仍用 SDK kernel-6.1/drivers/media/i2c/imx415.c:
| mode | 分辨率 | 帧率 | MIPI |
|---|---|---|---|
| linear 10/12bit | 3864x2192 | 30 | 891Mbps |
| HDR2 / HDR3 | 3864x2192 | 20/30 | 1485/1782Mbps |
| 2x2 binning 12bit | 1944x1097 | 30 | 594Mbps |
4K linear 的 VMAX 已经贴底(2250,最小约 2238),减 vblank 拉不到 60。要 60fps:
- 1080p binning(更稳):把现有
imx415_linear_12bit_1932x1096_594M_regs的 VMAX0x0C5D(3165) 改到约0x062E(1582),新 mode 放在同分辨率 30fps 前面。 - 4K@60:HMAX 1100→550,MIPI 891→1485Mbps,PHY timing 抄 HDR2 1485Mbps 那套,并保持 linear(不要开 DOL)。RV1126B ISP35 按约 8M@30 设计,4K@60 很容易顶满 ISP/编码。
应用层同样改 /userdata/rkipc.ini 的 src_frame_rate_num / dst_frame_rate_num。
落地顺序
IMX307 :用imx307.c替换内核驱动,重编boot.img,ini 改 60fps。- IMX415 1080p binning@60:等有对应驱动再换;不要只改 ini。
- IMX415 4K@60:先确认 ISP/VENC 掉不掉帧,再加 mode。