高通平台mipi panel kernel读包方法

本文介绍了一个在mipi_xxx.c文件中实现的函数,该函数用于从指定寄存器读取数据,并提供了完整的代码示例。此外,还展示了一个启动显示设备的函数。
       原文地址: http://www.educity.cn/wenda/98127.html

  在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;
}
开发高通平台上的屏幕驱动程序涉及多个关键环节,括对高通平台硬件架构的理解、屏幕接口协议的掌握、以及Linux内核中DRM/KMS框架的使用等。以下是一些主要步骤和指南,帮助开发者在高通平台上进行屏幕驱动开发: ### 3.1 高通平台屏幕接口支持 高通平台广泛支持多种显示接口,其中MIPI DSI(Mobile Industry Processor Interface - Display Serial Interface)是最常见的接口之一,尤其适用于高分辨率和高刷新率的移动设备显示屏。例如,高通骁龙410C集成了对DSI的支持,允许直接连接显示屏并进行高速数据传输[^2]。类似地,高通410C等中低端处理器也支持DSI接口,这使得开发者可以利用该接口进行屏幕驱动开发[^2]。 ### 3.2 MIPI DSI接口的基本原理 MIPI DSI是一种高速串行接口,用于连接显示控制器和显示屏。它支持多种模式,括命令模式(Command Mode)和视频模式(Video Mode)。在开发过程中,开发者需要根据所使用的显示屏类型和控制器配置选择合适的模式。此外,MIPI DSI接口使用较少的引脚实现高分辨率显示,这对于移动设备的设计紧凑性和性能优化具有重要意义[^3]。 ### 3.3 Linux内核中的DRM/KMS框架 在基于Linux的高通平台上,屏幕驱动通常基于DRM(Direct Rendering Manager)和KMS(Kernel Mode Setting)框架进行开发。DRM提供了一套统一的接口来管理显示资源,而KMS则用于设置显示模式和管理显示输出。开发者需要熟悉这些子系统,并编写相应的驱动代码以支持特定的屏幕设备。 一个典型的MIPI DSI驱动程序结构括以下几个部分: - **DSI控制器驱动**:负责初始化和配置DSI硬件控制器。 - **Panel驱动**:实现与特定显示屏的通信,括初始化序列、电源控制、模式设置等。 - **桥接器(Bridge)**:用于连接不同的显示子模块,如将DSI控制器与显示桥接器(如MIPI DBI或LVDS)连接。 - **DRM设备注册**:将驱动注册到DRM框架中,以便上层应用可以访问和控制显示设备。 ### 3.4 高通平台驱动开发实践 在实际开发中,开发者可以参考高通平台提供的开源驱动代码,例如在Linux内核源码树中的`drivers/gpu/drm/msm`目录下,含了高通Adreno GPU和DSI控制器的相关驱动代码。开发者可以基于这些代码进行修改和扩展,以适配特定的屏幕硬件。 以下是一个简化的MIPI DSI驱动初始化示例代码片段: ```c #include <drm/drm_mipi_dsi.h> #include <drm/drm_panel.h> struct my_dsi_panel { struct drm_panel base; struct mipi_dsi_device *dsi; }; static int my_dsi_panel_get_modes(struct drm_panel *panel, struct drm_connector *connector) { struct my_dsi_panel *my_panel = container_of(panel, struct my_dsi_panel, base); struct drm_display_mode *mode; mode = drm_mode_create(connector->dev); if (!mode) return -ENOMEM; mode->clock = 100000; // 设置像素时钟频率 mode->hdisplay = 1080; // 水平分辨率 mode->vdisplay = 1920; // 垂直分辨率 mode->vrefresh = 60; // 刷新率 drm_mode_set_name(mode); drm_mode_probed_add(connector, mode); return 1; } static const struct drm_panel_funcs my_dsi_panel_funcs = { .get_modes = my_dsi_panel_get_modes, }; static int my_dsi_probe(struct mipi_dsi_device *dsi) { struct my_dsi_panel *panel; panel = devm_kzalloc(&dsi->dev, sizeof(*panel), GFP_KERNEL); if (!panel) return -ENOMEM; panel->dsi = dsi; drm_panel_init(&panel->base, &dsi->dev, &my_dsi_panel_funcs, DRM_MODE_CONNECTOR_DSI); mipi_dsi_set_drvdata(dsi, panel); return 0; } static const struct of_device_id my_dsi_of_match[] = { { .compatible = "mycompany,my-dsi-panel" }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, my_dsi_of_match); static struct mipi_dsi_driver my_dsi_driver = { .driver = { .name = "my-dsi-panel", .of_match_table = my_dsi_of_match, }, .probe = my_dsi_probe, }; module_mipi_dsi_driver(my_dsi_driver); ``` ### 3.5 调试与测试 在驱动开发完成后,开发者需要进行详细的调试和测试。可以使用以下工具和方法: - **内核日志分析**:通过`dmesg`命令查看内核日志,检查驱动加载是否成功,是否有错误信息。 - **DRM调试接口**:利用`/sys/class/drm`目录下的接口进行显示模式切换、电源状态控制等操作。 - **用户空间工具**:如`modetest`和`kmscube`,可用于测试DRM/KMS功能是否正常。 ### 3.6 开发资源与文档 - **高通官方文档**:高通为开发者提供了详细的硬件参考手册和驱动开发指南,开发者可以从高通开发者网站获取。 - **开源社区资源**:Linux内核源码中的`Documentation/gpu/`目录下提供了DRM/KMS的开发文档。 - **开发板支持**:如正点原子ATK-DLRK3568等开发板提供了MIPI DSI接口的驱动实验环境,有助于开发者进行调试和验证[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值