This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] PROCESSOR-SDK-AM68A:如何使用 DCC 调优工具从图像传感器获取 I2C 数据

Guru**** 2037690 points
Other Parts Discussed in Thread: SK-AM68, AM68A
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1301898/processor-sdk-am68a-how-to-get-an-i2c-data-from-image-sensor-with-dcc-tuning-tool

器件型号:PROCESSOR-SDK-AM68A
主题中讨论的其他器件:SK-AM68AM68A

您好!  

当我尝试使用 DCC 调优工具从图像传感器获取 i2c 数据时遇到问题。  

我似乎"/dev/i2c-4 "很忙。  

您是否会为我提供解决此问题的指南?  

下面是我检查的内容和设置信息。

  • 在我这边办理入住
    • 在具有 DCC 工具的 PC 与 TI EVK 工具的 PC 之间执行 Ping 操作、
    • 通过控制台命令成功捕获原始数据
    • GStreamer 运行命令:  
      • gst-launch-1.0 v4l2src device=/dev/video2 io-mode=dmabuf! video/x-bayer、width=1920、height=1080、framerate=30/1、format=rggb10! tiovxisp sensor-name=sensor_Sony_IMX219_RPI DCC-ISP-file=/opt/imaging/imx219/dcc_viss_10b.bin 格式-msb=9 sink_0::DCC-2a-file=/opt/imaging/imx219/dcc_2a_10b.bin sink_0::device=/dev/v4l-subdev2! video/x-raw、format=NV12! v4l2h264enc output-io-mode=dmabuf-import extra-controls="控件,h264_I_FRAME_PERIOD=60,video_bitrate=20000000 "! rtph264pay! udpsink 端口=5000主机=192.168.0.85
  • 我试过的  
    • 更改了 IMX219的代码。 (文件:ti-firmware-builder-j721s2-evm-09_00_00_02/images/utils/itt_server/itt_ctrl_handle_sensor.c src)
      #define I2C_bus 9 => #define I2C_bus 4  
      #define SLAVE_REG 0x4a => #define SLAVE_REG 0x10
    • 构建(./make_sdk.sh)并将"libtivision_apps.so.9.0.0"复制到目标板上的 rootfs (/usr/lib)。  
  • 设置信息
    • EVK:TI SK-AM68
    • SDK 版本:  ti-processor-sdk-linux-edgeai-j721s2-evm-09_00_00_08-Linux-x86-Install.bin
    • SDK 映像:tisdk-edgeai-image-j721s2-evm.wic.xz (预编译的 EdgeAI 映像)
    • DCC 调优工具版本: 3.1版
    • 图像传感器: IMX219原始传感器(RPiV2)
  • 错误日志  
    • root@am68a-sk:/sys/class/i2c-dev # ls -al
      总计0
      drwxr-xr-x 2 root root 0Apr 28 2022。
      drwxr-xr-x 78 root root 0Apr 28 2022。
      lrwxrwxrwx 1根根根0 Apr 28 2022 i2c-0 ->../../devices/platform/bus@100000/bus@100000:bus@28380000/42120000.i2c/i2c-0/i2c-dev/i0
      lrwxrwxrwx 1根根根0 Apr 28 2022 i2c-1 ->../../devices/platform/bus@100000/bus@100000:bus@28380000/40b1000.i2c/i2c-1/i2c-dev/i1
      lrwxrwxrwx 1根根根0 Apr 28 2022 i2c-2 ->../../devices/platform/bus@100000/2000000.i2c/i2c-2/i2c-dev/i2c-2
      lrwxrwxrwx 1根根根0 Apr 28 2022 i2c-3 ->../../devices/platform/bus@100000/2010000.i2c/i2c-3/i2c-dev/i2c-3
      lrwxrwxrwx 1根根根0 Apr 28 2022 i2c-4 ->../../devices/platform/bus@100000/2010000.i2c/i2c-3/i2c-4/i2c-dev/i2C-4
      lrwxrwxrwx 1根根根0 Apr 28 2022 i2c-5 ->../../devices/platform/bus@100000/2010000.i2c/i2c-3/i2c-5/i2c-dev/i2C-5
      lrwxrwxrwx 1根根根0 Apr 28 2022 i2c-6 ->../../devices/platform/bus@100000/2040000.i2c/i2c-6/i2c-dev/i2c-6
    • 应用程序:初始化...完成!!
      250912.042196 s:vx_zone_init:已启用
      250912.042203 s:vx_zone_error:已启用
      250912.042209 s:vx_zone_warning:已启用
      250912.042963 s:vx_zone_init:[tivxInitLocal:130]初始化已完成!!
      250912.043370 s:vx_zone_init:[tivxHostInitLocal:101]已针对主机完成初始化!!
      正在将管道设置为暂停...
      管道是活跃的,不需要 PREROLL ...
      管道是 PREROLLED ..
      正在设置管道播放...
      新时钟:GstSystemClock
      重新分配延迟...
      IttCtrl_registerHandler:在位置0处注册的命令回显
      IttCtrl_registerHandler:已在位置1注册的命令 iss_read_2a_params
      IttCtrl_registerHandler:已在位置2注册的命令 iss_WRITE_2a_params
      IttCtrl_registerHandler:命令 iss_raw_save 已注册、位于位置3
      IttCtrl_registerHandler:命令 ISS_YUV_SAVE 已在位置4注册
      IttCtrl_registerHandler:已在位置5注册命令 iss_read_sensor_reg
      IttCtrl_registerHandler:已在位置6注册命令 iss_write_sensor_reg
      IttCtrl_registerHandler:在位置7注册的命令 DEV_Ctrl
      IttCtrl_registerHandler:已在位置8注册的命令 iss_send_DCC_file
      网络:在以下地址打开:IP Addr = 192.168.0.88、套接字端口=5000!!!
      重新分配延迟...
      测试数据路径为 NULL。 默认为当前文件夹
      测试数据路径为 NULL。 默认为当前文件夹
      原始文件名.//img_0000.raw
      YUV 文件名.//img_viss_0000.yUV
      写入0000时出错
      错误: i2c16BitRegRead 返回-1
      写入0001时出错
      错误: i2c16BitRegRead 返回-1

谢谢。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jang:

    进行这些更改的目的是什么?

    更改了 IMX219的代码。 (文件:ti-firmware-builder-j721s2-evm-09_00_00_02/images/utils/itt_server/itt_ctrl_handle_sensor.c src)
    #define I2C_bus 9 => #define I2C_bus 4  
    #define SLAVE_REG 0x4a => #define SLAVE_REG 0x10
    [/报价]

    据我所知、如果特定 RTOS 传感器驱动程序支持传感器寄存器、调优工具可以通过 PSDK RTOS 上的 I2C 读取传感器寄存器。

    在 edgeai 平台上、我首先请同事 确认调优工具是否支持在不进行以上更改的情况下读取 IMX219寄存器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gang:

    IMX390支持传感器寄存器读取/写入、但可以支持任何进行修改的摄像头。

    你好,张。

    您可以使用以下脚本读取和写入传感器寄存器。 您还必须修改传感器的总线和芯片变量:

    https://git.ti.com/cgit/glsdk/util-scripts/tree/debug/ovcam.sh

    此致!

    布兰登

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gang:  

    目的是使用 DCC 工具针对我们自己的板进行传感器调优。  

    贝洛斯是我的状态顺序。  

    1.我完成了自己板的调音 ,有 AM68A 和 IMX415。  

    2.尝试使用我们自己的板进行传感器调节。 但无法从我们自己的板获得 i2c 数据。  

    3.尝试从具有 IMX219的 TI AM68A EVK 获取 i2c 数据。 但也无法从 TI AM68A EVK 获取 i2c 数据。  

    谢谢。  

    张。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Brandon:  

    我检查了是否可以使用您已添加的 ovcam.sh 访问 i2c 数据。 它工作正常。  

    但我想知道是否可以使用 DCC 工具访问 i2c。 我在使用 DCC 工具获取 i2c 数据时仍然遇到问题。

    您能否确保以下内容?

    是否可以在不从 DCC 工具进行 i2c 访问的情况下进行传感器调优?  

    谢谢。  

    张。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jang:

    是否可以在不从 DCC 工具进行 i2c 访问的情况下进行传感器调优?  

    [/报价]

    调优工具主要用于 AM62A VPAC 调优、不需要通过 i2c 读取/写入传感器寄存器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gang:  

    感谢您的确认。 我认为 i2c 数据访问对于传感器调优是必需的。

    无论如何、我修改了一些代码、我可以从 DCC 工具访问 i2c 数据。

    int i2cInit()
    {
    int 文件;
    int adapter_nr = I2C_bus;
    char 文件名[20];

    snprintf (文件名、19、"/dev/i2c-%d"、adapter_nr);
    file = open (fileName、O_RDWR);
    if (file <0){
    printf("错误:无法在%s\n",文件名中打开 i2c 总线);
    返回-1;

    file_g = file;
    #if 0 /* nhn_debug */
    if (ioctl (file、I2C_SLAVE、slave_REG)< 0){
    printf ("错误:不能指定地址0x%x\n"、slave_REG);
    返回-1;

    #endif
    返回0;

    int i2c16BitRegRead (uint16_t regAddr、uint8_t * regData)
    {
    #if 1 /* nhn_debug */
    结构 i2c_rdwr_ioctl_data msg_rdwr;
    结构 i2c_msg i2cmsg;
    unsigned char i2c_buffer [64];

    /* i2c 写入*/
    memset (i2c_buffer、0x00、sizeof (i2c_buffer));
    I2C_buffer[0]=(uint8_t)((regAddr & 0xFF00)>>8);
    I2C_BUFFER[1]=(uint8_t)(regAddr & 0x00FF);
    msg_rdwr.msgs =&i2cmsg;
    MSG_rdwr.nmsgs = 1;
    i2cmsg.addr = SLAVE_REG;
    i2cmsg.flags = 0;
    i2cmsg.len = sizeof (uint16_t);
    i2cmsg.buf = i2c_buffer;
    if (ioctl (file_g、I2C_RDWR、&msg_rdwr)<0){
    printf ("写入时出错\n");
    返回-1;

    /* i2c 读取*/
    memset (i2c_buffer、0x00、sizeof (i2c_buffer));
    msg_rdwr.msgs =&i2cmsg;
    MSG_rdwr.nmsgs = 1;
    i2cmsg.addr = SLAVE_REG;
    i2cmsg.flags = I2C_M_RD;
    i2cmsg.len = sizeof (uint8_t);
    i2cmsg.buf = i2c_buffer;
    if (ioctl (file_g、I2C_RDWR、&msg_rdwr)<0){
    printf ("错误:不能读取地址0x%04x\n"、regAddr);
    返回-1;

    *regData = i2c_buffer[0];
    printf ("从寄存器0x%x\n"、i2c_buffer[0]、regAddr);
    #else
    uint8_t tx [2];
    tx[0]=(uint8_t)((regAddr & 0xFF00)>> 8);
    tx[1]=(uint8_t)(regAddr & 0x00FF);

    /* i2c 写入、未进行实际写入*/
    if (write (file_g、&tx[0]、2)!= 2){
    printf ("写入时出错\n");
    返回-1;

    /*读取地址*/
    if (read (file_g、tx、2)!= 2){
    printf ("错误:无法读取地址0x%.2x%.2x\n"、TX[0]、TX[1]中的文件);
    返回-1;

    *regData = TX[0];
    // itt_printf ("read:0x%.2x\n\n"、TX[0]);
    ITT_printf ("从寄存器0x%x\n 中读取0x%x "、TX[0]、*regAddr);
    返回0;
    #endif
    返回0;

    int i2c16BitRegWrite (uint16_t regAddr、uint8_t regData)
    {
    #if 1 /* nhn_debug */
    结构 i2c_rdwr_ioctl_data msg_rdwr;
    结构 i2c_msg i2cmsg;
    unsigned char i2c_buffer [64];

    memset (i2c_buffer、0x00、sizeof (i2c_buffer));
    I2C_buffer[0]=(uint8_t)((regAddr & 0xFF00)>>8);
    I2C_BUFFER[1]=(uint8_t)(regAddr & 0x00FF);
    I2C_BUFFER[2]= regData;

    msg_rdwr.msgs =&i2cmsg;
    MSG_rdwr.nmsgs = 1;
    i2cmsg.addr = SLAVE_REG;
    i2cmsg.flags = 0;
    i2cmsg.len = 3;
    i2cmsg.buf = i2c_buffer;

    if (ioctl (file_g、I2C_RDWR、&msg_rdwr)<0){
    printf ("写入时出错\n");
    返回-1;

    printf ("从寄存器0x%x\n"、i2c_buffer[0]、regAddr);
    #else
    uint8_t tx [3];
    tx[0]=(uint8_t)((regAddr & 0xFF00)>> 8);
    tx[1]=(uint8_t)(regAddr & 0x00FF);
    TX[2]= regData;

    if (write (file_g、&TX[0]、3)!= 3){
    printf ("写入时出错\n");
    返回-1;

    regData = TX[0];
    ITT_printf ("从寄存器0x%x\n 中读取0x%x "、TX[0]、*regAddr);

    返回0;
    #endif
    返回0;


    张。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jang:

    非常感谢您确认并分享您的更改!

    我们将关闭该主题。