medfield 平台 lvds bridge 驱动

himax hx8369a lcd driver 1. 注册设备 static int __init himax_hx8369a_init(void) { printk("%s\n", __FUNCTION__); return comipfb_dev_register(&himax_hx8369a_dev); //注册comipfb设备,即兼容与comipfb平台的lcd设备。 } 阅读详情

lvds bridge, 应该是一个I2C接口控制的,采用lvds数据接口,液晶屏驱动器桥。

这也是个I2C 驱动,挂接在 I2C_2 总线上。

1. 初始化如下:

    /* ************************************************************************* *\
     * FUNCTION: dsi_lvds_bridge_init
     *
     * DESCRIPTION: Driver Init function for lvds bridge
     *
    \* ************************************************************************* */
    static int __init dsi_lvds_bridge_init(void)
    {
        int ret = 0;
        struct i2c_adapter *adapter = NULL;
        struct i2c_client *client = NULL;
        struct i2c_board_info info;
        printk(KERN_INFO "[DISPLAY] %s: Enter\n", __func__);
        ret = misc_register(&dsi_lvds_bridge_dev);
        if (ret) {
            printk(KERN_ERR "[DISPLAY] %s: Can not register misc device.\n", __func__);
            return ret;
        }
        adapter = i2c_get_adapter(2); /*DV0 is on I2C bus 2 */
        if (!adapter) {
            printk(KERN_ERR "[DISPLAY] %s: Can not get bridge i2c adapter.\n", __func__);
            return 0;
        }
        /* Setup the i2c board info with the device type and
         the device address. */
        memset(&info, 0, sizeof(info));
        strlcpy(info.type, "i2c_disp_brig", sizeof(info.type));
        info.addr = 0x0F; /*I2C2 address 0x0F */
        /* Create the i2c client */
        client = i2c_new_device(adapter, &info);
        if (!client) {
            printk(KERN_ERR "[DISPLAY] %s: ERROR, i2c client=NULL\n", __func__);
            return -1;
        }
        ret = i2c_add_driver(&dsi_lvds_bridge_i2c_driver);
        printk(KERN_INFO "[DISPLAY] %s: Exit, ret = %d\n", __func__, ret);
        return 0;
    }

    /* ************************************************************************* *\
     * FUNCTION: dsi_lvds_bridge_exit
     *
     * DESCRIPTION: Driver exit function for lvds bridge
     *
    \* ************************************************************************* */
    static void __exit dsi_lvds_bridge_exit(void)
    {
        printk(KERN_INFO "[DISPLAY] %s\n", __func__);
        misc_deregister(&dsi_lvds_bridge_dev);
        i2c_del_driver(&dsi_lvds_bridge_i2c_driver);
    }
    module_init(dsi_lvds_bridge_init);
    module_exit(dsi_lvds_bridge_exit);
2. 初始化用到的几个结构体:

    static const struct i2c_device_id dsi_lvds_bridge_id[] = {
        { "i2c_disp_brig", 0 },
        { }
    };
    MODULE_DEVICE_TABLE(i2c, dsi_lvds_bridge_id);
    static struct i2c_driver dsi_lvds_bridge_i2c_driver = {
        .driver = {
            .name = "i2c_disp_brig",
        },
        .id_table = dsi_lvds_bridge_id,
        .probe = dsi_lvds_bridge_probe,
        .remove = dsi_lvds_bridge_remove,
    };

    static const struct file_operations mipi_dsi_dev_fops = {
        .owner = THIS_MODULE,
        .unlocked_ioctl = dsi_lvds_dev_ioctl,
    };
    static struct miscdevice dsi_lvds_bridge_dev = {
        .minor = MISC_DYNAMIC_MINOR,
        .name = "mipi_dsi",
        .fops = &mipi_dsi_dev_fops,
    };


dsi_lvds_bridge_probe()

    /* ************************************************************************* *\
     * FUNCTION: dsi_lvds_bridge_probe
     *
     * DESCRIPTION: Probe function for LVDS bridge.
     *
    \* ************************************************************************* */
    static int dsi_lvds_bridge_probe(struct i2c_client *client, const struct i2c_device_id *id)
    {
        printk(KERN_INFO "[DISPLAY] %s: Enter\n", __func__);
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
            printk(KERN_ERR "[DISPLAY] %s: Check I2C functionality failed.\n", __func__);
            return -ENODEV;
        }
        dsi_lvds_inst = kzalloc(sizeof(struct dsi_lvds_bridge_instance), GFP_KERNEL);
        if (dsi_lvds_inst == NULL) {
            printk(KERN_ERR "[DISPLAY] %s: Can not allocate memory.\n", __func__);
            return -ENOMEM;
        }
        dsi_lvds_inst->client = client;
        i2c_set_clientdata(client, dsi_lvds_inst);
        dsi_lvds_inst->client->addr = 0x0F;
        printk(KERN_INFO "[DISPLAY] %s: Exit\n", __func__);
        return 0;
    }
3. use GPIO to reset lvds state
    /* ************************************************************************* *\
     * FUNCTION: dsi_lvds_set_bridge_reset_state
     *
     * DESCRIPTION: This function uses GPIO to force in and out of reset state.
    \* ************************************************************************* */
    void dsi_lvds_set_bridge_reset_state(int state)
    {
        printk(KERN_INFO "[DISPLAY ] %s: state = %d, gpio = %d\n", __func__, state, gpio_get_value(GPIO_MIPI_BRIDGE_RESET));
        if (state) {
            gpio_direction_output(GPIO_MIPI_BRIDGE_RESET, 0);
            gpio_set_value_cansleep(GPIO_MIPI_BRIDGE_RESET, 0);
            mdelay(10);
        } else {
            gpio_direction_output(GPIO_MIPI_BRIDGE_RESET, 0);
            gpio_set_value_cansleep(GPIO_MIPI_BRIDGE_RESET, 0); /*Pull MIPI Bridge reset pin to Low */
            mdelay(20);
            gpio_direction_output(GPIO_MIPI_BRIDGE_RESET, 1);
            gpio_set_value_cansleep(GPIO_MIPI_BRIDGE_RESET, 1); /*Pull MIPI Bridge reset pin to High */
            mdelay(40);
        }
    }
4. dsi_lvds_configure_lvds_bridge () , 用I2C总线,配置lvds bridge设备。
    /* ************************************************************************* *\
     * FUNCTION: dsi_lvds_configure_lvds_bridge
     *
     * DESCRIPTION: This function uses I2C interface to set bridge registers.
     * to configure timings and MIPI lanes.
    \* ************************************************************************* */
    void dsi_lvds_configure_lvds_bridge(struct drm_device *dev)
    {
        if (lvds_disp_init) {
            printk(KERN_ALERT "[DISPLAY ] %s is already initialized\n", __func__);
            return;
        }
        printk(KERN_INFO "[DISPLAY ]%s: Enter\n", __func__);
        DSI_I2C_ByteWrite(0x013C, 0x00050006, 6); /*PPI_TX_RX_TA, BTA parameters */
        DSI_I2C_ByteRead(0x013C, 4);
        DSI_I2C_ByteWrite(0x0114, 0x00000004, 6); /*PPI_LPTXTIMCNT */
    #ifdef FIXME_MLD // DV0.9 changes
        DSI_I2C_ByteWrite(0x0164, 0x00000007, 6); /*PPI_D0S_CLRSIPOCOUNT */
        DSI_I2C_ByteWrite(0x0168, 0x00000007, 6); /*PPI_D1S_CLRSIPOCOUNT */
        DSI_I2C_ByteWrite(0x016c, 0x00000007, 6); /*PPI_D2S_CLRSIPOCOUNT */
        DSI_I2C_ByteWrite(0x0170, 0x00000007, 6); /*PPI_D3S_CLRSIPOCOUNT */
    #else
        DSI_I2C_ByteWrite(0x0164, 0x00000001, 6); /*PPI_D0S_CLRSIPOCOUNT */
        DSI_I2C_ByteWrite(0x0168, 0x00000001, 6); /*PPI_D1S_CLRSIPOCOUNT */
        DSI_I2C_ByteWrite(0x016c, 0x00000001, 6); /*PPI_D2S_CLRSIPOCOUNT */
        DSI_I2C_ByteWrite(0x0170, 0x00000001, 6); /*PPI_D3S_CLRSIPOCOUNT */
    #endif
        /*Enabling MIPI & PPI lanes, Enable 4 lanes */
        DSI_I2C_ByteWrite(0x0134, 0x0000001F, 6); /*PPI_LANEENABLE */
        DSI_I2C_ByteWrite(0x0210, 0x0000001F, 6); /*DSI_LANEENABLE */
        DSI_I2C_ByteWrite(0x0104, 0x00000001, 6); /*PPI_SARTPPI */
        DSI_I2C_ByteWrite(0x0204, 0x00000001, 6); /*DSI_SARTPPI */
    #ifdef FIXME_MLD
        /*Setting LVDS output frequency */
        DSI_I2C_ByteWrite(0x04A0, 0x00000006, 6); /*LVDS PHY Register 0 (LVPHY0) */
        /*Calculating video panel control settings */
        /*Setting video panel control register */
        DSI_I2C_ByteWrite(0x0450, 0x00000130, 6); /*VPCTRL, Video Path Control, VTGen=ON */
        /*Setting display timing registers */
        DSI_I2C_ByteWrite(0x0454, 0x0064000A, 6); /*HTIM1, HBPR=100, HPW=10 */
        DSI_I2C_ByteWrite(0x0458, 0x00BE0400, 6); /*HTIM2, HFPR=190, HDISPR=1024 */
        DSI_I2C_ByteWrite(0x045c, 0x000F0005, 6); /*VTIM1, VBPR=15, VPW=5 */
        DSI_I2C_ByteWrite(0x0460, 0x000F0258, 6); /*VTIM2, VFPR=15, VDISPR=600 */

    #else
        /*Setting LVDS output frequency */
        DSI_I2C_ByteWrite(0x04A0, 0x00048006, 6); /*LVDS PHY Register 0 (LVPHY0) */
        /*Calculating video panel control settings */
        /*Setting video panel control register */
        DSI_I2C_ByteWrite(0x0450, 0x00000120, 6); /*VPCTRL, Video Path Control, VTGen=ON */
        /*Setting display timing registers */
        DSI_I2C_ByteWrite(0x0454, 0x00280028, 6); /*HTIM1, HBPR=100, HPW=10 */
        DSI_I2C_ByteWrite(0x0458, 0x00500500, 6); /*HTIM2, HFPR=190, HDISPR=1024 */
        DSI_I2C_ByteWrite(0x045c, 0x000e000a, 6); /*VTIM1, VBPR=15, VPW=5 */
        DSI_I2C_ByteWrite(0x0460, 0x000e0320, 6); /*VTIM2, VFPR=15, VDISPR=600 */
    #endif
        DSI_I2C_ByteWrite(0x0464, 0x00000001, 6); /*VFUEN */
        /*Setting LVDS bit arrangement */
        DSI_I2C_ByteWrite(0x0480, 0x03020100, 6); /*LVMX0003 */
        DSI_I2C_ByteWrite(0x0484, 0x08050704, 6); /*LVMX0407 */
        DSI_I2C_ByteWrite(0x0488, 0x0F0E0A09, 6); /*LVMX0811 */
        DSI_I2C_ByteWrite(0x048C, 0x100D0C0B, 6); /*LVMX1215 */
        DSI_I2C_ByteWrite(0x0490, 0x12111716, 6); /*LVMX1619 */
        DSI_I2C_ByteWrite(0x0494, 0x1B151413, 6); /*LVMX2023 */
        DSI_I2C_ByteWrite(0x0498, 0x061A1918, 6); /*LVMX2427 */
    #ifdef FIXME_MLD //DV0.9 changes
        DSI_I2C_ByteWrite(0x049c, 0x00000101, 6); /*LVCFG */
    #else
        DSI_I2C_ByteWrite(0x049c, 0x00000001, 6); /*LVCFG */
    #endif
        DSI_I2C_ByteWrite(0x0288, 0xFFFFFFFF, 6); /*DSI_INTCLR */
        lvds_disp_init = 1;
        printk(KERN_INFO "[DISPLAY]%s: Exit\n", __func__);
    }
5. panel on/off
    /* ************************************************************************* *\
     * FUNCTION: dsi_lvds_toshiba_bridge_panel_off
     *
     * DESCRIPTION: This function uses GPIO to turn OFF panel.
    \* ************************************************************************* */
    void dsi_lvds_toshiba_bridge_panel_off(void)
    {
        printk(KERN_INFO "[DISPLAY ] %s\n", __func__);
        gpio_direction_output(GPIO_MIPI_LCD_STBYB, 0);
        gpio_set_value_cansleep(GPIO_MIPI_LCD_STBYB, 0); /*Pull LCD_STBYB pin to Low */
        mdelay(1);
        gpio_direction_output(GPIO_MIPI_PANEL_RESET, 0);
        gpio_set_value_cansleep(GPIO_MIPI_PANEL_RESET, 0);
        mdelay(1);
    }
    /* ************************************************************************* *\
     * FUNCTION: dsi_lvds_toshiba_bridge_panel_on
     *
     * DESCRIPTION: This function uses GPIO to turn ON panel.
    \* ************************************************************************* */
    void dsi_lvds_toshiba_bridge_panel_on(void)
    {
        printk(KERN_INFO "[DISPLAY ] %s\n", __func__);
        /* set following pin to low */
        gpio_direction_output(GPIO_MIPI_LCD_STBYB, 0);
        gpio_set_value_cansleep(GPIO_MIPI_LCD_STBYB, 0); /*Pull LCD_STBYB pin to Low */
        gpio_direction_output(GPIO_MIPI_PANEL_RESET, 0);
        gpio_set_value_cansleep(GPIO_MIPI_PANEL_RESET, 0);
        gpio_direction_output(GPIO_MIPI_LCD_VADD, 0);
        gpio_set_value_cansleep(GPIO_MIPI_LCD_VADD, 0);
        gpio_direction_output(GPIO_MIPI_LCD_BIAS_EN, 0);
        gpio_set_value_cansleep(GPIO_MIPI_LCD_BIAS_EN, 0);
        mdelay(10);
        /* STBYB */
        gpio_direction_output(GPIO_MIPI_LCD_STBYB, 1);
        gpio_set_value_cansleep(GPIO_MIPI_LCD_STBYB, 1); /*Pull LCD_STBYB pin to High */
        mdelay(10);
        /* VADD */
        gpio_direction_output(GPIO_MIPI_LCD_VADD, 1);
        mdelay(50);
        /* RESET */
        gpio_direction_output(GPIO_MIPI_PANEL_RESET, 1);
        gpio_set_value_cansleep(GPIO_MIPI_PANEL_RESET, 1);
        mdelay(100);
        /* BIAS */
        gpio_direction_output(GPIO_MIPI_LCD_BIAS_EN, 1);
        gpio_set_value_cansleep(GPIO_MIPI_LCD_BIAS_EN, 1);
    }
6. init  / deinit
    /* ************************************************************************* *\
     * FUNCTION: dsi_lvds_init_lvds_bridge
     *
     * DESCRIPTION: This function does all one time init. Currently defining
     * GPIOs only.
    \* ************************************************************************* */
    void dsi_lvds_init_lvds_bridge(struct drm_device *dev)
    {
        /* request GPIOs */
        gpio_request(GPIO_MIPI_BRIDGE_RESET, "display");
        gpio_request(GPIO_MIPI_PANEL_RESET , "display");
        gpio_request(GPIO_MIPI_LCD_STBYB, "display");
        gpio_request(GPIO_MIPI_LCD_BIAS_EN, "display");
        gpio_request(GPIO_MIPI_LCD_VADD, "display");
    }
    /* ************************************************************************* *\
     * FUNCTION: dsi_lvds_deinit_lvds_bridge
     *
     * DESCRIPTION: This function does is called during deinit time.
     *
    \* ************************************************************************* */
    void dsi_lvds_deinit_lvds_bridge(struct drm_device *dev)
    {
        if (!lvds_disp_init) {
            printk(KERN_ALERT "[DISPLAY ] %s has not initialized\n", __func__);
            return;
        }
        printk(KERN_INFO "[DISPLAY ] Enter %s\n", __func__);
        lvds_disp_init = 0;
    }
7. get params
    /* ************************************************************************* *\
     * FUNCTION: dsi_lvds_bridge_get_display_params
     *
     * DESCRIPTION: This function is a callback to get the panel resolution and
     * timing settings.
     *
    \* ************************************************************************* */
    void dsi_lvds_bridge_get_display_params(struct drm_display_mode *mode)
    {
    #ifdef FIXME_MLD // Changes for DV0.9 display
    /* This settings is for 1024*600 panel*/
        mode->hdisplay = 1024;
        mode->vdisplay = 600;
        mode->hsync_start = 1655;
        mode->hsync_end = 1665;
        mode->htotal = 1765;
        mode->vsync_start = 615;
        mode->vsync_end = 620;
        mode->vtotal = 635;
        mode->clock = 33324;
    #else
        mode->hdisplay = 1200;
        mode->vdisplay = 800;
        mode->hsync_start = 1360;
        mode->hsync_end = 1400;
        mode->htotal = 1440;
        mode->vsync_start = 814;
        mode->vsync_end = 824;
        mode->vtotal = 838;
        mode->clock = 33324;
    #endif //end FIXME_MLD
        printk(KERN_INFO "[DISPLAY]: hdisplay(w) is %d\n", mode->hdisplay);
        printk(KERN_INFO "[DISPLAY]: vdisplay(h) is %d\n", mode->vdisplay);
        printk(KERN_INFO "[DISPLAY]: HSS is %d\n", mode->hsync_start);
        printk(KERN_INFO "[DISPLAY]: HSE is %d\n", mode->hsync_end);
        printk(KERN_INFO "[DISPLAY]: htotal is %d\n", mode->htotal);
        printk(KERN_INFO "[DISPLAY]: VSS is %d\n", mode->vsync_start);
        printk(KERN_INFO "[DISPLAY]: VSE is %d\n", mode->vsync_end);
        printk(KERN_INFO "[DISPLAY]: vtotal is %d\n", mode->vtotal);
        printk(KERN_INFO "[DISPLAY]: clock is %d\n", mode->clock);
    }
8. 具体动作: read / write
    /* ************************************************************************* *\
     * FUNCTION: DSI_I2C_ByteRead
     *
     * DESCRIPTION: Local functions to read I2C registers
     *
    \* ************************************************************************* */
    static int DSI_I2C_ByteRead(u16 reg, int count)
    {
        if (dsi_lvds_inst->client)
            return __DSI_I2C_ByteRead(reg, count);
        else
            return -EIO;
    }

    /* ************************************************************************* *\
     * FUNCTION: __DSI_I2C_ByteRead
     *
     * DESCRIPTION: Local functions to process read req for I2C registers
     *
    \* ************************************************************************* */
    static int __DSI_I2C_ByteRead(u16 reg, int count)
    {
        char rxData[4] = {0};
        char regData[2] = {0};
        struct i2c_msg msgs[] = {
            {
             .addr = dsi_lvds_inst->client->addr,
             .flags = 0,
             .len = 2,
             },
            {
             .addr = dsi_lvds_inst->client->addr,
             .flags = I2C_M_RD,
             .len = count - 2,
             },
        };
        regData[0] = (reg & 0xFF00) >> 8;
        regData[1] = reg & 0xFF;
        msgs[0].buf = regData;
        msgs[1].buf = rxData;
        printk(KERN_INFO "Register: 0x%x\n", reg);
        if (i2c_transfer(dsi_lvds_inst->client->adapter, msgs, 2) < 0) {
            printk(KERN_ERR "[DISPLAY] %s: transfer error\n", __func__);
            return -EIO;
        } else if (count > 2) {
            int i = 0;
            for (i = count - 3; i > -1; --i)
                printk(KERN_INFO "%02x ", rxData[i]);
            printk(KERN_INFO "\n");
            return rxData[0];
        }
        return 0;
    }

    /* ************************************************************************* *\
     * FUNCTION: DSI_I2C_ByteWrite
     *
     * DESCRIPTION: Local functions to issue write req for I2C registers
     *
    \* ************************************************************************* */
    static int DSI_I2C_ByteWrite(u16 reg, u32 data, int count)
    {
        if (dsi_lvds_inst->client)
            return __DSI_I2C_ByteWrite(reg, data, count);
        else
            return -EIO;
    }

    /* ************************************************************************* *\
     * FUNCTION: __DSI_I2C_ByteWrite
     *
     * DESCRIPTION: Local functions to process write req for I2C registers
     *
    \* ************************************************************************* */
    static int __DSI_I2C_ByteWrite(u16 reg, u32 data, int count)
    {
        char txData[6] = {0};
        struct i2c_msg msg[] = {
            {
             .addr = dsi_lvds_inst->client->addr,
             .flags = 0,
             .len = count,
             },
        };
        /*Set the register */
        txData[0] = (reg & 0xFF00) >> 8;
        txData[1] = reg & 0xFF;
        if (count == 6) {
            /*Set the data */
            txData[2] = (data & 0xFF);
            txData[3] = (data & 0xFF00) >> 8;
            txData[4] = (data & 0xFF0000) >> 16;
            txData[5] = (data & 0xFF000000) >> 24;
        } else {
            /* Not valid for this bridge chipset */
        }
        printk(KERN_INFO "[DISPLAY] %s: addr = %x, reg = %x, data = %x\n",
            __func__, dsi_lvds_inst->client->addr, reg, data);
        msg[0].buf = txData;
        if (i2c_transfer(dsi_lvds_inst->client->adapter, msg, 1) < 0) {
            printk(KERN_ERR "[DISPLAY] %s: transfer error\n", __func__);
            return -EIO;
        } else {
            return 0;
        }
    }


万能 USB 驱动程序 USB TO IDE BRIDGE驱动 for XP 等. 万能 USB 驱动程序 USB TO IDE BRIDGE驱动 for XP 等. 有个外置硬盘盒无法驱动,这个就行 立即下载

相关推荐

工业预测模型避坑指南:PHM2012轴承数据实战中,LSTM、CNN、Transformer到底怎么选?

本文深入探讨了工业预测模型在PHM2012轴承数据下的选型策略,对比了LSTM、CNN和Transformer等主流模型在轴承寿命预测任务中的表现。通过真实实验数据,提供了可复现的选型决策框架,帮助工程师根据数据规模、硬件条件和精度要求选择最佳模型。文章还揭示了工程落地中的隐藏陷阱,如数据不均衡和工况迁移挑战,并提出了解决方案。

weixin_33694172的博客 493

LVDS

一、LVDS简介 LVDS:Low Voltage Differential Signaling,是一种低压低摆幅的差分信号技术, 典型信号摆幅为 350mv,对应的功耗很低,它使得信号能在差分PCB线对或平衡电缆上以几百Mbps的速率传输, 其低压幅和低电流驱动输出实现了低噪声和低功耗。 因此,LVDS 是一种效率极高的技术。LVDS传输支持速率一般在155Mbps(大约为77MHZ)以上。 I...

|~~~热爱生活、努力学习的小伙汁~~~| 1万+

LS-DYNA超高速碰撞仿真入门:从SPH算法配置到铝靶板穿孔分析(附K文件模板)

本文详细介绍了使用LS-DYNA中的SPH(光滑粒子流体动力学)算法进行超高速碰撞仿真的完整流程。以铝弹丸撞击铝靶板为例,从SPH算法原理、LS-PrePost前处理、材料模型与状态方程设置,到接触定义、边界条件及K文件生成,提供了系统的入门指导和关键参数调试经验,帮助工程师高效模拟材料破碎、穿孔等极端变形问题。

h0i1j2k3l的博客 726

Multimedia

9.1 Video Graphics Sub System 芯片视频图形子系统由以下专用模块组成: 1. 视频处理单元(VPU):多标准高性能视频/图像编解码器; 2. 两个图形处理单元(GPUs): 3D GPU:加速3D图形的生成(OpenGL/ES); 2D GPU:加速2D图形的生成。 3. 一个图像处理单元(IPU):提供摄像头和显示器的连接,相关的处理,同步和控制。 4. 显示接口的桥梁:提供从IPU支持的数字显示接口到其他接口的可选...

四季帆的博客 2115

主流算力卡性能对比分析

超大规模AI训练/HPC:优先选择NVIDIA H100或AMD MI300X,需关注显存带宽和多卡互联能力。企业级AI训练:NVIDIA A100性价比更高,生态成熟。国内自主可控需求:华为昇腾910B是首选,支持液冷和低功耗设计。本地AI推理/游戏:NVIDIA RTX 4090或RTX 5090性价比突出,但需注意显存容量限制。边缘计算/低功耗场景:华为昇腾310或清微智能TX536(能效比6.3TOPS/W@INT8)更合适。

m0_69867914的博客 7800

【重识云原生】第四章云网络4.9.5.1节下一代智能网卡——DPU综述

随着数据中心的高速发展,通信能力和计算能力成为数据中心基础设施的相辅相成的两个重要发展方向。若数据中心仅关注计算能力的提升,通信基础设施的提升跟不上,那么数据中心的整体系统性能依然受限,无法发挥出真正的潜力。DPU的提出背景就是应对这些数据量和复杂性的指数级增长。未来,需要将计算移至接近数据的位置,这是目前业界所公认的以数据为中心的体系结构下的创新。综上,DPU对数据中心来说,是通过更明细的分工来实现效率的提升、实现总体系统的成本最优化。...

junbaozi的专栏 1725

液晶屏MIPI接口与LVDS接口区别(总结)

液晶屏接口类型有LVDS接口、MIPI DSIDSI接口(下文只讨论液晶屏LVDS接口,不讨论其它应用的LVDS接口,因此说到LVDS接口时无特殊说明都是指液晶屏LVDS接口),它们的主要信号成分都是5组差分对,其中1组时钟CLK,4组DATA(MIPI DSI接口中称之为lane),它们到底有什么区别,能直接互联么?在网上搜索“MIPI DSI接口与LVDS接口区别”找到的答案基本上是描述MIP

bingqingsuimeng的专栏 5万+

用 PERFORM ... ON COMMIT / ON ROLLBACK 把收尾工作做干净:从 SAP LUW 到 Update Task 的事务钩子实践

ABAP事务钩子机制解析 本文深入探讨SAP ABAP开发中的事务边界管理问题,重点分析PERFORM ... ON COMMIT/ROLLBACK机制: 事务分层:区分Database LUW(数据库提交)和SAP LUW(业务逻辑单元),后者通过COMMIT WORK触发多种收尾动作 钩子机制:PERFORM...ON COMMIT将子程序注册为事务结束回调,在提交/回滚时执行清理工作而非业务更新 执行顺序:钩子程序先于Update Task执行,仍保留当前会话内存上下文 现代实践:建议将FORM仅作为

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3994

PPI_DPI 对比

PPI --- 每英寸所拥有的像素数目。pixels per inch所表示的是每英寸所拥有的像素(pixel)数目。因此PPI数值越高,即代表显示屏能够以越高的密度显示图像。当然,显示的密度越高,拟真度就越高。   pixels per inch是图像分辨率的单位,图像ppi值越高,画面的细节就越丰富,因为单位面积的像素数量更多,数码相机拍出来的图片因品牌或生产时间不同可能有所不同,常见的有7

1万+

【人工智能】提示词避坑指南:为什么大模型越让它“禁止”,它越要“唱反调”?

和 AI 沟通就像和聪明但直脑筋的工科生说话——

奶爸的编程之路,也就一周冷个三天 224

串行RapidIO(Serial RapidIO,SRIO):协议介绍

目录一、RapidIO背景介绍二、RapidIO协议概述2.1 包与控制符号2.2 包格式2.4 消息传递2.5 全局共享存储器2.6 流量控制2.7 串行物理层三、I/O逻辑操作与包格式四、维护操作与包格式五、消息操作与包格式六、总结 本文是基于Xilinx平台SRIO介绍(一)RapidIO协议介绍的内容作读书笔记。 一、RapidIO背景介绍 RapidIO采用三层分级体系结构,包括逻辑层、传输层和物理层该分级结的如下图所示: ● 逻辑层:位于最高层,定义全部协议和包的格式,它们为端点器件发起和完

Starry__的博客 1万+

Gralloc 模块

1. 在Android Eclair 及其之后的版本中,显示系统增加了一个名为Gralloc的硬件模块。 Gralloc的含义为, Graphics Alloc(图形分配),这个模块位于libui和显示设备的驱动程序之间。 Gralloc模块被放在/system/lib/hw/下,下面是omap3的一个gralloc: $ ls system/lib/hw -l 总用量 14

1702

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 304

Gralloc与上层libui/libsurfaceflinger的关系

如前所述,Gralloc模块主要由 gralloc_module_t 模块,alloc_device_t 设备和 framebuffer_device_t 设备3个结构体来描述。 1. Gralloc模块的主要调用者是ui库中的以下文件: frameworks/base/libs/ui/FramebufferNativeWindow.cpp FramebufferNativeWindow

1592

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

像素深度_比特每像素bpp

比特每像素bpp ---bit per pixel.   表示图像像素值的位数叫做图像的像素深度,又称为位/像素(BPP)。这个数值用来表示图像的每个像素值所需要的位数(bits per pixel),它决定了该图像的类别。   一个像素所能表达的不同颜色数取决于比特每像素(BPP)。这个最大数可以通过取二的色彩深度次幂来得到。例如,常见的取值有 : 8 bpp [28=256;(256色

1573

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android是怎么整合framebuffer显示驱动的

在linux中,framebuffer驱动是标准的显示设备的驱动;对于pc系统,framebuffer驱动是显卡的驱动;对于嵌入式系统的SOC处理器,framebuffer通常作为其LCD控制器或者其它显示设备的驱动。      Framebuffer驱动是一个字符设备,这个驱动在文件系统中的设备节点通常是:/dev/fbX 主设备号是29,次设备号递增生成(由每个Framebuffe

1484

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Gralloc.default.so 的实现

默认的Gralloc模块实现的代码路径如下: hardware/libhardware/modules/gralloc/* $ ls hardware/libhardware/modules/gralloc/Android.mk framebuffer.cpp gralloc.cpp gralloc_priv.h gr.h mapper.cpp 1. gralloc.c,

1453

LCD 的各种接口

目前一般彩色LCD的连接方式有这么几种:MCU模式,RGB模式,SPI模式,VSYNC模式,MDDI模式等。还有的用MIPI接口。 MCU模式:目前最常用的连接模式,一般是80系统(68系统已经不存在了)。数据位传输有8位,9位,          16位和18位。连线分为:CS/,RS(寄存器选择),RD/,WR/,再就是数据线了。优点是:控          制简单方便,无需时钟和同步

1295

18_2_帧缓冲

帧缓冲 framebuffer : 是linux系统为显示设备提供的一个接口。 帧缓冲是显示缓冲区的抽象,而不需要考虑底层硬件的差异,允许上层应用在图形模式下,直接对显示缓冲区进行读写操作。 屏幕上的显示点,与显示缓冲区一一对应,可以通过读写显示缓冲区的操作,来控制屏幕上的显示输出。、 帧缓冲设备为标准字符设备,主设备号29,对应于/dev/fb%d设备文件。 1. fb_

1006

Led Blinking 功能驱动设计

这是OBM里的一段代码,实现了LED 闪烁的功能,下面是LED原理图: Led blinking  The LEDR, LEDG, LEDB, controlled by the 8806, can be programed to blinking by set the 8806 internal regs. Such as 0x0c,0x0d,0x0e,0x0f. the

877

WVGA LCD density

一般大的屏幕 density值需要改下,来调节icon在屏幕上显示的大小。 1. 这个数值一般都在 system.prop 或 build.prop 中设置. 如/device/***/system.prop ro.sf.lcd_density = 160    //一般3.5寸屏就可以设成160 WVGA 屏, 比如 480x800分辨率下: ro.sf.lcd_d

875

linux中测试LCD 显示功能

echo "LCD display log" > /dev/tty0 LCD屏上就会显示 LCD display log

859

18_1_LCD硬件原理

早期的LCD显示器有以下几种类型:   1. TN   2. STN   3. TFT   TFT屏好像也有些过时了,但是原理还是差不多:   时序图中都会有以下3个信号:   1. VCLK, 像素时钟信号,用于锁存图像数据的像素时钟。   2. HSYNC, 行同步信号, 每发出一个行同步脉冲,就表示新的一行图像数据开始发送。   3. VSYNC. 帧同步信号

812

HDMI_VGA_CBVS同时显示

STi7105同一时间只能播放一个视频文件。 但是可以用2个播放处理器同时播放该视频文件。一个高清通道(主),一个标清通道(辅)。 每个通道,可以设置不同的VTG(即分辨率格式)。 HDMI和VGA共用一个主通道。CVBS用辅通道。 ST7105 > VID_INJSTART 1 "/18T_D1_NTSC.264" 0 V_ES V_AUX   //只输出辅通道 ST7105 > vi

642
上一篇: pmic芯片lp3925驱动_i2c接口
下一篇: Medfield 平台 I2C 驱动配置
lamdoc
博客等级 码龄18年 155粉丝 655原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值