单片机和linux有什么区别?
根据公式计算出显示器的频率:
* 当HCLK=100MHz时,
* Rate = 1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x
* {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x
* {2x(CLKVAL+1)/(HCLK)}]
* = 60Hz
* 3. LCDCON5:
* 设置显示模式为16BPP时的数据格式: 5:6:5
* 设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD的接口信号): 反转
* 半字(2字节)交换使能
*/
LCDCON1 = (CLKVAL_TFT_320240《《8) | (LCDTYPE_TFT《《5) | \
(BPPMODE_16BPP《《1) | (ENVID_DISABLE《《0);
LCDCON2 = (VBPD_320240《《24) | (LINEVAL_TFT_320240《《14) | \
(VFPD_320240《《6) | (VSPW_320240);
LCDCON3 = (HBPD_320240《《19) | (HOZVAL_TFT_320240《《8) | (HFPD_320240);
LCDCON4 = HSPW_320240;
// LCDCON5 = (FORMAT8BPP_565《《11) | (HSYNC_INV《《9) | (VSYNC_INV《《8) | \
// (HWSWP《《1);
LCDCON5 = (FORMAT8BPP_565《《11) | (HSYNC_INV《《9) | (VSYNC_INV《《8) | (VDEN_INV 《《 6) | \
(HWSWP《《0);
/*
* 设置LCD控制器的地址寄存器LCDSADDR1~3
* 帧内存与视口(view point)完全吻合,
* 图像数据格式如下:
* |----PAGEWIDTH----|
* y/x 0 1 2 239
* 0 rgb rgb rgb 。。。 rgb
* 1 rgb rgb rgb 。。。 rgb
* 1. LCDSADDR1:
* 设置LCDBANK、LCDBASEU
* 2. LCDSADDR2:
* 设置LCDBASEL: 帧缓冲区的结束地址A[21:1]
* 3. LCDSADDR3:
* OFFSIZE等于0,PAGEWIDTH等于(240*2/2)
*/
LCDSADDR1 = ((LCDBUFFER》》22)《《21) | LOWER21BITS(LCDBUFFER》》1);
LCDSADDR2 = LOWER21BITS((LCDBUFFER+ \
(LINEVAL_TFT_320240+1)*(HOZVAL_TFT_320240+1)*2)》》1);
LCDSADDR3 = (0《《11) | (LCD_XSIZE_TFT_320240*2/2);
/* 禁止临时调色板寄存器 */
TPAL = 0;
fb_base_addr = LCDBUFFER;
bpp = 16;
xsize = 320;
ysize = 240;
}
② 描点:
/*
* 画点
* 输入参数:
* x、y : 象素坐标
* color: 颜色值
* 对于16BPP: color的格式为0xAARRGGBB (AA = 透明度),
* 需要转换为5:6:5格式
* 对于8BPP: color为调色板中的索引值,
* 其颜色取决于调色板中的数值
*/
void PutPixel(UINT32 x, UINT32 y, UINT32 color)
{
UINT8 red,green,blue;
switch (bpp){
case 16:
{
UINT16 *addr = (UINT16 *)fb_base_addr + (y * xsize + x);
red = (color 》》 19) & 0x1f;
green = (color 》》 10) & 0x3f;
blue = (color 》》 3) & 0x1f;
color = (red 《《 11) | (green 《《 5) | blue; // 格式5:6:5
*addr = (UINT16) color;
break;
}
case 8:
{
UINT8 *addr = (UINT8 *)fb_base_addr + (y * xsize + x);
*addr = (UINT8) color;
break;
}
default:
break;
}
}
下面是在Linux的LCD驱动里修改的地方(arch\arm\mach-s3c2440\mach-smdk2440.c):
/* 320x240 */
staTIc struct s3c2410fb_mach_info smdk2440_lcd_cfg __initdata = {
.regs = {
.lcdcon1 = S3C2410_LCDCON1_TFT16BPP | \
S3C2410_LCDCON1_TFT | \
S3C2410_LCDCON1_CLKVAL(0x04),
.lcdcon2 = S3C2410_LCDCON2_VBPD(1) | \
S3C2410_LCDCON2_LINEVAL(239) | \
S3C2410_LCDCON2_VFPD(5) | \
S3C2410_LCDCON2_VSPW(1),
.lcdcon3 = S3C2410_LCDCON3_HBPD(36) | \
S3C2410_LCDCON3_HOZVAL(319) | \
S3C2410_LCDCON3_HFPD(19),
.lcdcon4 = S3C2410_LCDCON4_MVAL(13) | \
S3C2410_LCDCON4_HSPW(5),
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVV |
S3C2410_LCDCON5_INVVDEN |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
},
.gpccon = 0xaaaa56aa,
.gpccon_mask = 0xffffffff,
.gpcup = 0xffffffff,
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaaaaaaaa,
.gpdcon_mask = 0xffffffff,
.gpdup = 0xffffffff,
.gpdup_mask = 0xffffffff,
.fixed_syncs = 1,
.type = S3C2410_LCDCON1_TFT,
.width = 320,
.height = 240,
.xres = {
.min = 320,
.max =
- 工控机在IC卡加油工程中的应用(05-13)
- 联网汽车为什么选择Linux开源平台?(07-10)
- 多网络和Linux代理的Android无线远程控制系统(02-02)
- 基于嵌入式Linux的家居监控系统设计(02-22)
- 基于嵌入式Linux系统的导航软件设计思路(03-17)
- 新型嵌入式机器视觉系统的设计研究(04-21)
