readl(), writel() 函数使用举例

本文介绍了如何使用MSM7627A平台的显示子系统接口(DSI)配置视频模式。通过设置不同的寄存器来定义显示参数,如分辨率、同步信号等。涉及寄存器的直接写入操作。

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

static inline void writeb(unsigned val, unsigned addr)
{

//  首先强制类型转换为  unsigned char *  类型指针,再取这个地址的值, 最后赋值。


    (*(volatile unsigned char *) (addr)) = (val);


 
   
}


static inline unsigned readl(unsigned addr)

{


//  首先强制类型转换为  unsigned char *  类型指针,再取这个地址的值, 最后赋值。同理。

    return (*(volatile unsigned *) (addr));

}


#define MDP_DSI_VIDEO_EN                      (0xAA2F0000)
#define MDP_DSI_VIDEO_HSYNC_CTL               (0xAA2F0004)
#define MDP_DSI_VIDEO_VSYNC_PERIOD            (0xAA2F0008)
#define MDP_DSI_VIDEO_VSYNC_PULSE_WIDTH       (0xAA2F000C)
#define MDP_DSI_VIDEO_DISPLAY_HCTL            (0xAA2F0010)
#define MDP_DSI_VIDEO_DISPLAY_V_START         (0xAA2F0014)
#define MDP_DSI_VIDEO_DISPLAY_V_END           (0xAA2F0018)
#define MDP_DSI_VIDEO_BORDER_CLR              (0xAA2F0028)
#define MDP_DSI_VIDEO_HSYNC_SKEW              (0xAA2F0030)
#define MDP_DSI_VIDEO_CTL_POLARITY            (0xAA2F0038)
#define MDP_DSI_VIDEO_TEST_CTL                (0xAA2F0034)


void config_msm7627a_dsi_video_mode(unsigned short display_wd,
									unsigned short display_ht,
									unsigned short image_wd,
									unsigned short image_ht,
									unsigned short hsync_porch_fp,
									unsigned short hsync_porch_bp,
									unsigned short vsync_porch_fp,
									unsigned short vsync_porch_bp,
									unsigned short hsync_width,
									unsigned short vsync_width,
									unsigned char lane_en)
{

	unsigned char dst_format = 3;	/* RGB888 */
	unsigned char traffic_mode = 2;	/* non burst mode with sync start events */
	unsigned long low_pwr_stop_mode = 1;
	unsigned char eof_bllp_pwr = 0x9;	/* Needed or else will have blank line at top of display */
	unsigned char interleav = 0;

	dprintf(SPEW, "DSI_Video_Mode - Dst Format: RGB888\n");
	dprintf(SPEW, "Traffic mode: burst mode\n");
	dprintf(SPEW, "Data Lane: %d lane\n", lane_en);
// 下面都是用的writel 函数进行寄存器的赋值操作。
	writel(0x00000000, MDP_DSI_VIDEO_EN);
上面这个把MDP_DSI_VIDEO_EN 宏的值写到0x00000000 这个地址的寄存器里面

	writel(0x00000000, DSI_CLK_CTRL);
	writel(0x00000000, DSI_CLK_CTRL);
	writel(0x00000000, DSI_CLK_CTRL);
	writel(0x00000000, DSI_CLK_CTRL);
	writel(0x00000002, DSI_CLK_CTRL);
	writel(0x00000006, DSI_CLK_CTRL);
	writel(0x0000000e, DSI_CLK_CTRL);
	writel(0x0000001e, DSI_CLK_CTRL);
	writel(0x0000003e, DSI_CLK_CTRL);

	writel(0, DSI_CTRL);

	writel(0, DSI_ERR_INT_MASK0);

	writel(0x02020202, DSI_INT_CTRL);

	writel(((hsync_porch_bp + display_wd) << 16) | hsync_porch_bp,
	       DSI_VIDEO_MODE_ACTIVE_H);

	writel(((vsync_porch_bp + display_ht) << 16) | vsync_porch_bp,
	       DSI_VIDEO_MODE_ACTIVE_V);

	writel(((display_ht + vsync_porch_fp + vsync_porch_bp) << 16) |
	       (display_wd + hsync_porch_fp + hsync_porch_bp),
	       DSI_VIDEO_MODE_TOTAL);
	writel((hsync_width) << 16 | 0, DSI_VIDEO_MODE_HSYNC);

	writel(0 << 16 | 0, DSI_VIDEO_MODE_VSYNC);

	writel(vsync_width << 16 | 0, DSI_VIDEO_MODE_VSYNC_VPOS);

	writel(1, DSI_EOT_PACKET_CTRL);

	writel(0x00000100, DSI_MISR_VIDEO_CTRL);

	writel(1 << 28 | 1 << 24 | 1 << 20 | low_pwr_stop_mode << 16 |
	       eof_bllp_pwr << 12 | traffic_mode << 8 | dst_format << 4 | 0x0,
	       DSI_VIDEO_MODE_CTRL);

	writel(0x67, DSI_CAL_STRENGTH_CTRL);
	writel(0x80006711, DSI_CAL_CTRL);
	writel(0x00010100, DSI_MISR_VIDEO_CTRL);

	writel(0x00010100, DSI_INT_CTRL);
	writel(0x02010202, DSI_INT_CTRL);
	writel(0x02030303, DSI_INT_CTRL);

	writel(interleav << 30 | 0 << 24 | 0 << 20 | lane_en << 4


转载于:https://www.cnblogs.com/yuzaipiaofei/archive/2013/01/26/4124133.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值