高通平台mipi panel kernel读包方法

本文介绍了一种在高通平台上针对MIPIPanel设备通过内核读取ID的方法,以此来区分不同的屏幕型号,避免更换boot.img。文章提供了具体的C代码实现细节,包括如何在mipi_xxx.c文件中加入读取寄存器值的函数,以及如何通过读取的ID值发送不同的初始化序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


熟悉高通平台mipi panel kernel读包方法,我想我们可以是的同一客户要是使用2块mipi panel的话我想我们可以通过读取id来下不同序列而不用更换boot.img,还有能否读id可以说明mipi通讯是否正常。

还有我们只需在lk下面读一次id再对全局变量赋值通过lk传递到kernel里面,通过不同赋值发送不同初始化序列,至于时序clk则调整好兼容2块屏的,也可以通过全局变量来区分。

在mipi_xxx.c中加入下面函数即可,很好用的!关键时候起作用。注意所读的寄存器必须是可读的,之前好几次读失败了原因就是这个。

static u32 mipi_truely_read_reg(struct msm_fb_data_type *mfd, u16 reg)

{
        u32 data;
        int len = 4;
        struct dsi_cmd_desc cmd_read_reg = {
                DTYPE_GEN_READ2, 1, 0, 1, 0, /* cmd 0x24 */
                        sizeof(reg), (char *) &reg};

        mipi_dsi_buf_init(&truly_tx_buf);
        mipi_dsi_buf_init(&truly_rx_buf);

        /* mutex had been acquried at dsi_on */
        len = mipi_dsi_cmds_rx(mfd, &truly_tx_buf, &truly_rx_buf,
                               &cmd_read_reg, len);

        data = *(u32 *)truly_rx_buf.data;

        if (len != 4)
        printk("%s: invalid rlen=%d, expecting 4.\n", __func__, len);

        printk("%s: reg=0x%x.data=0x%08x.\n", __func__, reg, data);


        return data;
}


static int mipi_truly_lcd_on(struct platform_device *pdev)
{
        struct msm_fb_data_type *mfd;
       u32 data;

        mfd = platform_get_drvdata(pdev);

        if (!mfd)
                return -ENODEV;
        if (mfd->key != MFD_KEY)
                return -EINVAL;
        if (display_n) {        
                if (mipi_truly_lcd_reset() < 0) {
                        pr_err("mipi_truly_lcd_reset error\n");
                        return -EINVAL;
                }

                msleep(20);
                mipi_dsi_cmds_tx(mfd, &truly_tx_buf,
truly_video_display_on_cmds,ARRAY_SIZE(truly_video_display_on_cmds));
                printk("mipi_dsi_cmds_tx called here");
               mdelay(20);

              //add for testdata=mipi_truely_read_reg(mfd,0xE1);


        printk("data =0x%x",data);
        }
                
        display_n = TRUE;

        
        return 0;
}

static char A13[5]={0xC1,0x17,0x30,0x0E,0x26};
static char A14[2]={0x5e,0x55};
static char
A15[17]={0xE1,0x00,0x0B,0x14,0x13,0x13,0x1F,0x0D,0x0B,0x00,0x04,0x00,0x11,0x0C,0x1C,0x17,0x00};

 

log:

<4>[    5.672508] [(1980-01-06 05:56:05.862078335 UTC)]
mipi_truely_read_reg: reg=0xc1.data=0x260e3017.
<4>[    5.672588] [(1980-01-06 05:56:05.862156668 UTC)]
mipi_truely_read_reg: reg=0x5f.data=0x00000055.
<4>[    5.672733] [(1980-01-06 05:56:05.862301668 UTC)]
mipi_truely_read_reg: reg=0xe1.data=0x13140b00.

还有一个函数也可以写法不一样而已:

 

static struct dsi_cmd_desc novatek_manufacture_id_cmd = {
DTYPE_DCS_READ, 1, 0, 1, 5, sizeof(a10), a10};

static uint32 mipi_novatek_manufacture_id(struct msm_fb_data_type *mfd)
{
struct dsi_buf *rp, *tp;
struct dsi_cmd_desc *cmd;
uint32 *lp;

tp = &ili_tx_buf;
rp = &ili_rx_buf;
cmd = &novatek_manufacture_id_cmd;
mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 3);
lp = (uint32 *)rp->data;
printk("%s: manufacture_id=%x", __func__, *lp);
return *lp;
}


### 高通 MIPI CLK 配置使用说明 高通平台MIPI 时钟配置涉及多个层次的设置,括设备树、内核驱动以及寄存器配置。以下是对高通 MIPI CLK 配置方法的详细说明: #### 1. 设备树中的 MIPI 配置 在高通平台上,MIPI 时钟配置通常需要通过设备树文件进行定义。以 Kona 平台为例,在设备树文件 `kona-sde-pll.dtsi` 中,可以通过添加或修改 DSI SSC(Spread Spectrum Clocking)代码来实现 MIPI 时钟的展频功能[^1]。具体路径如下: ``` /LINUX/android/vendor/qcom/proprietary/devicetree-4.19/qcom/kona-sde-pll.dtsi ``` 在该文件中,针对 `dsi0` 或 `dsi1` 接口,可以添加或调整相关的 SSC 参数以抑制 EMI。 #### 2. 内核驱动中的 MIPI 时钟设置 MIPI 时钟的具体配置通常由内核驱动完成。以高通 SM8475 平台为例,MIPI DSI 的实际输出时序可以通过调试工具取,并解析其寄存器数据。以下是获取 DSI 控制器寄存器数据的方法[^2]: ```bash adb root adb shell "echo 0 400 > /d/dri/0/debug/dsi0_ctrl_off ; cat /d/dri/0/debug/dsi0_ctrl_reg > /sdcard/dsi0_ctrl_reg.txt;" adb shell "echo 0 400 > /d/dri/0/debug/dsi1_ctrl_off ; cat /d/dri/0/debug/dsi1_ctrl_reg > /sdcard/dsi1_ctrl_reg.txt;" adb pull /sdcard/dsi0_ctrl_reg.txt ./ adb pull /sdcard/dsi1_ctrl_reg.txt ./ ``` 取到的寄存器数据可以通过分析 `Vendor/LINUX/android/kernel/msm-4.19/techpack/display/msm/dsi/dsi_ctrl_reg.h` 文件中的地址定义来理解其含义。 #### 3. 示例代码:MIPI PHY 时钟配置 以下是一个基于高通 7x27a 平台MIPI PHY 时钟配置示例[^3]。该配置位于文件 `Mipi_hx_customer_video_pt.c` 中: ```c static struct mipi_dsi_phy_ctrl dsi_video_mode_phy_db_2lane_500M = { /* DSI Bit Clock at 500 MHz, 2 lane, RGB888 */ /* regulator */ {0x03, 0x01, 0x01, 0x00}, /* timing */ {0xb9, 0x8e, 0x1f, 0x00, 0x98, 0x9c, 0x22, 0x90, 0x18, 0x03, 0x04}, /* phy ctrl */ {0x7f, 0x00, 0x00, 0x00}, /* strength */ {0xbb, 0x02, 0x06, 0x00}, /* pll control */ {0x40, 0xf9, 0xb0, 0xda, 0x00, 0x50, 0x48, 0x63, 0x30, 0x07, 0x03, 0x05, 0x14, 0x03, 0x0, 0x0, 0x54, 0x06, 0x10, 0x04, 0x0} }; ``` 上述代码定义了 MIPI PHY 的时钟参数,括调节器、定时器、PHY 控制、信号强度和 PLL 控制等。 #### 4. 展频功能的启用 为了抑制 EMI,可以启用 MIPI 的展频功能(SSC)。具体操作是在设备树文件中为 `dsi0` 或 `dsi1` 接口添加 SSC 相关代码[^1]。例如: ```dts &dsi0 { ssc_enable = <1>; // 启用展频功能 ssc_center = <1>; // 设置展频模式为中心调制 ssc_freq = <30000>; // 设置展频频率为 30 kHz }; ``` #### 5. 总结 高通 MIPI CLK 的配置主要括设备树中的 SSC 参数设置、内核驱动中的寄存器解析以及 MIPI PHY 的时钟参数定义。通过这些步骤,可以实现对 MIPI 时钟的精确控制并优化系统的电磁兼容性。 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值