hi3516cv610修改i2c0引脚位置

news/2025/2/25 13:13:07

hi3516cv610修改i2c引脚位置

我们i2c0位置改为

也就没用海思默认的Pin44 Pin43

Pin26、Pin65分别对应寄存器地址为

0x11130034_Pin26

0x17940004_Pin65

这里我们只需改 pin_mux.c文件

文件路径

./smp/a7_linux/source/interdrv/sysconfig

改为这样ok

pin_mux.c

#include "pin_mux.h"
#include <asm/barrier.h>

#include "sys_cfg.h"

/* mux with sensor0 slave/mipirx0/sensor0/i2c4 */
static void vi_bt1120_mode_mux(int board_type)
{
    void *iocfg2_base = sys_config_get_reg_iocfg2();

    if (board_type == BOARD_DMEB_BGA) {
        sys_writel(iocfg2_base, 0x0030, 0x1631); /* VI_DATA9 */
        sys_writel(iocfg2_base, 0x0034, 0x1631); /* VI_DATA8 */
        sys_writel(iocfg2_base, 0x0038, 0x1631); /* VI_DATA6 */
        sys_writel(iocfg2_base, 0x003c, 0x1631); /* VI_DATA7 */
        sys_writel(iocfg2_base, 0x0040, 0x16f1); /* VI_DATA2 */
        sys_writel(iocfg2_base, 0x0044, 0x1631); /* VI_DATA4 */
        sys_writel(iocfg2_base, 0x0048, 0x1631); /* VI_DATA3 */
        sys_writel(iocfg2_base, 0x004c, 0x16f1); /* VI_DATA1 */
        sys_writel(iocfg2_base, 0x0050, 0x1631); /* VI_DATA5 */
        sys_writel(iocfg2_base, 0x0054, 0x1631); /* VI_DATA0 */
        sys_writel(iocfg2_base, 0x0058, 0x1631); /* VI_CLK */
        sys_writel(iocfg2_base, 0x005c, 0x1631); /* VI_DATA10 */
        sys_writel(iocfg2_base, 0x0064, 0x1631); /* VI_DATA11 */
        sys_writel(iocfg2_base, 0x0068, 0x1631); /* VI_DATA15 */
        sys_writel(iocfg2_base, 0x006c, 0x1631); /* VI_DATA14 */
        sys_writel(iocfg2_base, 0x0070, 0x1631); /* VI_DATA12 */
        sys_writel(iocfg2_base, 0x0078, 0x1631); /* VI_DATA13 */
    } else {
        sys_writel(iocfg2_base, 0x0000, 0x1632); /* VI_DATA8 */
        sys_writel(iocfg2_base, 0x0004, 0x1632); /* VI_DATA9 */
        sys_writel(iocfg2_base, 0x0008, 0x1632); /* VI_DATA10 */
        sys_writel(iocfg2_base, 0x000c, 0x1632); /* VI_DATA11 */
        sys_writel(iocfg2_base, 0x0010, 0x1632); /* VI_DATA12 */
        sys_writel(iocfg2_base, 0x0014, 0x1632); /* VI_DATA13 */
        sys_writel(iocfg2_base, 0x0018, 0x1632); /* VI_DATA0 */
        sys_writel(iocfg2_base, 0x001c, 0x1632); /* VI_DATA1 */
        sys_writel(iocfg2_base, 0x0020, 0x1632); /* VI_DATA2 */
        sys_writel(iocfg2_base, 0x0024, 0x1632); /* VI_DATA3 */
        sys_writel(iocfg2_base, 0x0028, 0x1632); /* VI_DATA4 */
        sys_writel(iocfg2_base, 0x002c, 0x1632); /* VI_DATA5 */
        sys_writel(iocfg2_base, 0x0088, 0x1631); /* VI_DATA6 */
        sys_writel(iocfg2_base, 0x008c, 0x1631); /* VI_DATA7 */
        sys_writel(iocfg2_base, 0x0090, 0x1671); /* VI_CLK */
        sys_writel(iocfg2_base, 0x0094, 0x1631); /* VI_DATA14 */
        sys_writel(iocfg2_base, 0x0098, 0x1631); /* VI_DATA15 */
    }
}

static void vi_bt656_mode_mux(int board_type)
{
    void *iocfg2_base = sys_config_get_reg_iocfg2();

    if (board_type == BOARD_DMEB_BGA) {
        sys_writel(iocfg2_base, 0x0054, 0x1631); /* VI_DATA0 */
        sys_writel(iocfg2_base, 0x004c, 0x1631); /* VI_DATA1 */
        sys_writel(iocfg2_base, 0x0040, 0x16f1); /* VI_DATA2 */
        sys_writel(iocfg2_base, 0x0048, 0x1631); /* VI_DATA3 */
        sys_writel(iocfg2_base, 0x0044, 0x1631); /* VI_DATA4 */
        sys_writel(iocfg2_base, 0x0050, 0x1631); /* VI_DATA5 */
        sys_writel(iocfg2_base, 0x0038, 0x1631); /* VI_DATA6 */
        sys_writel(iocfg2_base, 0x003c, 0x1631); /* VI_DATA7 */
        sys_writel(iocfg2_base, 0x0058, 0x1631); /* VI_CLK */
    } else {
        sys_writel(iocfg2_base, 0x0018, 0x1632); /* VI_DATA0 */
        sys_writel(iocfg2_base, 0x001c, 0x1632); /* VI_DATA1 */
        sys_writel(iocfg2_base, 0x0020, 0x1632); /* VI_DATA2 */
        sys_writel(iocfg2_base, 0x0024, 0x1632); /* VI_DATA3 */
        sys_writel(iocfg2_base, 0x0028, 0x1632); /* VI_DATA4 */
        sys_writel(iocfg2_base, 0x002c, 0x1632); /* VI_DATA5 */
        sys_writel(iocfg2_base, 0x0088, 0x1631); /* VI_DATA6 */
        sys_writel(iocfg2_base, 0x008c, 0x1631); /* VI_DATA7 */
        sys_writel(iocfg2_base, 0x0090, 0x1671); /* VI_CLK */
    }
}

#if SENSOR_SLAVE_EN
/* Share the same pin with i2c1 slave pin */
static void sensor0_slave_pin_mux(void)
{
    void *iocfg2_base = sys_config_get_reg_iocfg2();

    sys_writel(iocfg2_base, 0x0090, 0x1547); /* SENSOR0_HS */
    sys_writel(iocfg2_base, 0x0094, 0x1547); /* SENSOR0_VS */
}

/* Share the same pin with i2c0 slave pin */
// i2c0默认引脚
// static void sensor1_slave_pin_mux(void)
// {
//     void *iocfg2_base = sys_config_get_reg_iocfg2();

//     sys_writel(iocfg2_base, 0x0098, 0x1547); /* SENSOR1_HS */    // I2C0_SDA
//     sys_writel(iocfg2_base, 0x009C, 0x1547); /* SENSOR1_VS */    // I2C0_SCL
// }

/* Share the same pin with i2c0 slave pin */
static void sensor1_slave_pin_mux(void)
{
    void *iocfg3_base = sys_config_get_reg_iocfg3();
    void *iocfg2_base = sys_config_get_reg_iocfg2();    

    sys_writel(iocfg3_base, 0x0034, 0x1203); /* SENSOR1_HS */   // SDA
    sys_writel(iocfg2_base, 0x0004, 0x1204); /* SENSOR1_VS */   // SCL
    // sys_writel(iocfg1_base, 0x11110034, 0x1203); /* SENSOR1_HS */   // SDA
    // sys_writel(iocfg1_base, 0x17940004, 0x1204); /* SENSOR1_VS */   // SCL
}


static void sensor_slave_pin_mux(int sensor_index)
{
    switch (sensor_index) {
        case PIN_MUX_SENSOR0_SLAVE:
            sensor0_slave_pin_mux();
            break;
        case PIN_MUX_SENSOR1_SLAVE:
            sensor1_slave_pin_mux();
            break;
        default:
            break;
    }
}
#endif

static void sensor0_pin_mux(int board_type)
{
    void *iocfg2_base = sys_config_get_reg_iocfg2();

    if (board_type == BOARD_DMEB_BGA) {
        sys_writel(iocfg2_base, 0x0040, 0x1212); /* SENSOR0_CLK */
        sys_writel(iocfg2_base, 0x0050, 0x1137); /* SENSOR0_RSTN */
    } else {
        sys_writel(iocfg2_base, 0x0084, 0x1211); /* SENSOR0_CLK */
        sys_writel(iocfg2_base, 0x008C, 0x1135); /* SENSOR0_RSTN */
    }
}

/* bt1120 and bt656 rely on sensor 0 */
static void sensor0_bt_pin_mux(int board_type)
{
    void *iocfg2_base = sys_config_get_reg_iocfg2();

    if (board_type == BOARD_DMEB_BGA) {
        sys_writel(iocfg2_base, 0x0084, 0x1211); /* SENSOR0_CLK */
        sys_writel(iocfg2_base, 0x008c, 0x1135); /* SENSOR0_RSTN */
    } else {
        sys_writel(iocfg2_base, 0x0084, 0x1211); /* SENSOR0_CLK */
        sys_writel(iocfg2_base, 0x0080, 0x11f7); /* SENSOR0_RSTN */
    }
}

static void sensor1_pin_mux(int board_type)
{
    void *iocfg2_base = sys_config_get_reg_iocfg2();

    if (board_type == BOARD_DMEB_BGA) {
        sys_writel(iocfg2_base, 0x004c, 0x1212); /* SENSOR0_CLK */
        sys_writel(iocfg2_base, 0x0054, 0x1137); /* SENSOR0_RSTN */
    } else {
        sys_writel(iocfg2_base, 0x0080, 0x1211); /* SENSOR1_CLK */
        sys_writel(iocfg2_base, 0x0088, 0x1135); /* SENSOR1_RSTN */
    }
}

static void sensor_pin_mux(int sensor_index, int board_type)
{
    switch (sensor_index) {
        case PIN_MUX_SENSOR_0:
            sensor0_pin_mux(board_type);
            break;
        case PIN_MUX_SENSOR_1:
            sensor1_pin_mux(board_type);
            break;
        case PIN_MUX_SENSOR_0_BT:
            sensor0_bt_pin_mux(board_type);
            break;
        default:
            break;
    }
}

static inline void set_phy_reg_isb(void)
{
    isb();
#ifdef CONFIG_64BIT
    dsb(sy);
#else
    dsb();
#endif
#ifdef CONFIG_64BIT
    dmb(sy);
#else
    dmb();
#endif
}

/* Share the same pin with sensor1 slave pin */
// 默认的 i2c0的引脚
// static void i2c0_pin_mux(void)
// {
//     void *iocfg2_base = sys_config_get_reg_iocfg2();

//     sys_writel(iocfg2_base, 0x0098, 0x1135); /* I2C0_SDA */
//     sys_writel(iocfg2_base, 0x009C, 0x1135); /* I2C0_SCL */
// }

/* Share the same pin with sensor1 slave pin */
static void i2c0_pin_mux(void)
{
    void *iocfg3_base = sys_config_get_reg_iocfg3();        // 没有 sys_config_get_reg_iocfg1只有 sys_config_get_reg_iocfg
    void *iocfg2_base = sys_config_get_reg_iocfg2();        //

    sys_writel(iocfg3_base, 0x0034, 0x1203); /* I2C0_SDA */
    sys_writel(iocfg2_base, 0x0004, 0x1204); /* I2C0_SCL */
}

/* Share the same pin with sensor0 slave pin */
static void i2c1_pin_mux(void)
{
    void *iocfg2_base = sys_config_get_reg_iocfg2();

    sys_writel(iocfg2_base, 0x0090, 0x1175); /* I2C1_SDA */
    sys_writel(iocfg2_base, 0x0094, 0x1135); /* I2C1_SCL */
}

static void i2c2_pin_mux(void)
{
#ifndef OT_FPGA
    void *iocfg_base = sys_config_get_reg_iocfg3();

    sys_writel(iocfg_base, 0x0050, 0x1133); /* I2C2_SDA */
    sys_writel(iocfg_base, 0x0054, 0x1133); /* I2C2_SCL */
#endif
}

static void i2c0_bt_pin_mux(void)
{
    void *iocfg3_base = sys_config_get_reg_iocfg3();
    void *iocfg2_base = sys_config_get_reg_iocfg2();

    sys_writel(iocfg3_base, 0x0034, 0x1203); /* I2C0_SDA */
    sys_writel(iocfg2_base, 0x0004, 0x1204); /* I2C0_SCL */
    // sys_writel(iocfg3_base, 0x11110034, 0x1203); /* I2C0_SDA */
    // sys_writel(iocfg3_base, 0x17940004, 0x1204); /* I2C0_SCL */
}

static void i2c_pin_mux(int i2c_index)
{
    switch (i2c_index) {
        case PIN_MUX_I2C_0:
            i2c0_pin_mux();
            break;
        case PIN_MUX_I2C_1:
            i2c1_pin_mux();
            break;
        case PIN_MUX_I2C_2:
            i2c2_pin_mux();
            break;
        case PIN_MUX_I2C_0_BT:
            i2c0_bt_pin_mux();
            break;
        default:
            break;
    }
}

static void mipi0_rx_pin_mux(void)
{
    void *iocfg2_base = sys_config_get_reg_iocfg2();

    sys_writel(iocfg2_base, 0x0000, 0x1430); /* MIPI_RX0_CK1N */
    // sys_writel(iocfg2_base, 0x0004, 0x1430); /* MIPI_RX0_CK1P */
    sys_writel(iocfg2_base, 0x0008, 0x1430); /* MIPI_RX0_D3N */
    sys_writel(iocfg2_base, 0x000C, 0x1430); /* MIPI_RX0_D3P */
    sys_writel(iocfg2_base, 0x0010, 0x1430); /* MIPI_RX0_D1N */
    sys_writel(iocfg2_base, 0x0014, 0x1430); /* MIPI_RX0_D1P */
    sys_writel(iocfg2_base, 0x0018, 0x1430); /* MIPI_RX0_CK0N */
    sys_writel(iocfg2_base, 0x001C, 0x1430); /* MIPI_RX0_CK0P */
    sys_writel(iocfg2_base, 0x0020, 0x1430); /* MIPI_RX0_D0N */
    sys_writel(iocfg2_base, 0x0024, 0x1430); /* MIPI_RX0_D0P */
    sys_writel(iocfg2_base, 0x0028, 0x1430); /* MIPI_RX0_D2N */
    sys_writel(iocfg2_base, 0x002C, 0x1430); /* MIPI_RX0_D2P */
}

static void mipi_rx_pin_mux(int mipi_rx_type)
{
    switch (mipi_rx_type) {
        case MIPI_RX_0:
            mipi0_rx_pin_mux();
            break;
        default:
            break;
    }
}

static void vi_pin_mux(int vi_intf_type, int board_type)
{
    switch (vi_intf_type) {
        case VI_MIPI_RX_MODE:
            i2c_pin_mux(PIN_MUX_I2C_0);
            i2c_pin_mux(PIN_MUX_I2C_1);
            i2c_pin_mux(PIN_MUX_I2C_2);
            mipi_rx_pin_mux(MIPI_RX_0);
            break;
        case VI_CMOS_BT1120_MODE:
            sensor_pin_mux(PIN_MUX_SENSOR_0_BT, board_type);
            i2c_pin_mux(PIN_MUX_I2C_0_BT);
            vi_bt1120_mode_mux(board_type);
            break;
        case VI_CMOS_BT656_MODE:
            sensor_pin_mux(PIN_MUX_SENSOR_0_BT, board_type);
            i2c_pin_mux(PIN_MUX_I2C_0_BT);
            vi_bt656_mode_mux(board_type);
            break;
        default:
            break;
    }
}

#if I2S0_EN
static void i2s0_pin_mux(int board_type)
{
    void *iocfg_base = sys_config_get_reg_iocfg3();

    if (board_type == BOARD_SCK) {
        sys_writel(iocfg_base, 0x0048, 0x1503); /* I2S0_SD_RX */
        sys_writel(iocfg_base, 0x0044, 0x1663); /* I2S0_WS */
        sys_writel(iocfg_base, 0x0040, 0x1523); /* I2S0_BCLK */
        sys_writel(iocfg_base, 0x003c, 0x1523); /* I2S0_SD_TX */
        sys_writel(iocfg_base, 0x0038, 0x1523); /* I2S0_MCLK */
    }
}
#endif

static void amp_unmute_pin_mux(void)
{
#ifndef OT_FPGA
    void *iocfg_base = sys_config_get_reg_iocfg3();
    void *gpio_base = sys_config_get_reg_gpio();

    /* GPIO1_4 */
    sys_writel(iocfg_base, 0x0004, 0x1200);

    /* output high */
    sys_writel(gpio_base, 0x1400, 0x10);
    sys_writel(gpio_base, 0x1040, 0x10);
#endif
}

void pin_mux(void)
{
    int vi_intf_type = sys_config_get_vi_intf_type();
    void *reg_misc_base = sys_config_get_reg_misc();
    int board_type = sys_config_get_board_type();

    sensor_pin_mux(PIN_MUX_SENSOR_0, board_type);
    sensor_pin_mux(PIN_MUX_SENSOR_1, board_type);
#if SENSOR_SLAVE_EN
    sensor_slave_pin_mux(PIN_MUX_SENSOR0_SLAVE);
    sensor_slave_pin_mux(PIN_MUX_SENSOR1_SLAVE);
#endif

    vi_pin_mux(vi_intf_type, board_type);

    /* audio */
#if I2S0_EN
    i2s0_pin_mux(BOARD_SCK);
#endif

    amp_unmute_pin_mux();

    sys_writel(reg_misc_base, 0x170, 0x0);  /* VGS & GZIP */
    sys_writel(reg_misc_base, 0x174, 0x0);  /* ddrt MUX */
}


http://www.niftyadmin.cn/n/5865539.html

相关文章

《云豹录屏大师:免费解锁高清录屏新体验》

今天我给大家带来一款超棒的免费录屏软件&#xff0c;它能轻松录制出MP4、AVI、WMV格式的标清、高清甚至原画视频&#xff0c;完全满足你的各种需求。 这款软件的界面简洁明了&#xff0c;即使是新手也能轻松上手&#xff0c;但它的功能却非常强大&#xff0c;一点都不简单&am…

Leetcode 0001 level - easy

题目&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返…

DeepSeek在MATLAB上的部署与应用

在科技飞速发展的当下&#xff0c;人工智能与编程语言的融合不断拓展着创新边界。DeepSeek作为一款备受瞩目的大语言模型&#xff0c;其在自然语言处理领域展现出强大的能力。而MATLAB&#xff0c;作为科学计算和工程领域广泛应用的专业软件&#xff0c;拥有丰富的工具包和高效…

AWS云从业者认证题库 AWS Cloud Practitioner(2.21)

题库持续更新&#xff0c;上方二维码查看完整题库&#xff01; 公司希望减少开发人员用于运行代码的物理计算资源,通过启用无服务器架构&#xff0c;哪种服务可以满足该需求? A&#xff1a; Amazon Elastic Compute Cloud (Amazon EC2) B&#xff1a; AWS Lambda C&#xff1a…

【复习】Redis

数据结构 Redis常见的数据结构 String&#xff1a;缓存对象Hash&#xff1a;缓存对象、购物车List&#xff1a;消息队列Set&#xff1a;点赞、共同关注ZSet&#xff1a;排序 Zset底层&#xff1f; Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…

基于Spark的电商供应链系统的设计与实现

目录 1.研究背景与意义 2、国内外研究现状 3、相关理论与技术 &#xff08;一&#xff09;分布式计算系统Spark &#xff08;二&#xff09;数据仓库Hive &#xff08;三&#xff09;读取服务器本地磁盘的日志数据Flume &#xff08;四&#xff09;分布式消息队列Kafka …

【CSS】HTML元素布局基础总结

HTML默认布局和元素显示 CSS 元素显示 { HTML 默认布局&#xff1a; 流式布局 { 从左到右&#xff0c;从上到下 随页面宽度变化动态排列元素 文档流&#xff1a;整个 H T M L 文档的流式布局 HTML 元素分为 { 块级元素 &#xff1a;默认占满一行 行内元素 &#xff1a;在行内最…

软考——WWW与HTTP

1.万维网&#xff08;world wide web&#xff09; 是一个规模巨大的、可以资源互联的资料空间。由URL进行定位&#xff0c;通过HTTP协议传送给使用者&#xff0c;又由HTML来进行文件的展现。 它的主要组成部分是&#xff1a;URL、HTTP、HTML。 &#xff08;1&#xff09;URL…