SM501显卡驱动移植
http://www.sinklow.com/blog/article.asp?id=187
1. 修改fbmem.c代码文件
将厂商提供的voyager.c和voyager.h文件放入linux/drivers/video目录中
修改linux/drivers/video目录中的fbmem.c文件
在fb_drivers结构申明之前加入如下代码:
在fb_drivers结构中,添加如下代码:
/*
* Silicon Motion, Inc. VOYAGER frame buffer device.
*/
{ "voyager", voyager_init, NULL },
#endif
2. 修改"Makefile"和"Config.in"
修改linux/drivers/video目录下的"Makefile"文件,在申明驱动的区域加入如下内容:
修改linux/drivers/video目录下的"Config.in"文件,加入如下内容:
3. 修改与开发板相关的内核及驱动代码
当前开发板使用PXA255芯片,与驱动中测试的Accelent开发板芯片相同,当前开发板使用的片选信号为CS5,SM501的SDRAM为4M。屏为12.1寸液晶,屏使用的参数为800 X 600,16BPP。
修改voyager.h:
屏的参数
#define SCREEN_Y_RES 600
#define SCREEN_BPP 16
#define isACCELENT 1 /*开启Accelent板的代码*/
#define FB_PHYSICAL_ADDR 0x14000000 /*CS5的起始地址为SDRAM的地址*/
#define REG_PHYSICAL_ADDR 0x17E00000 /*CS5的最后2M为SM501寄存器地址*/
修改voyager.c的voyager_init函数:
将针对ACCELENT代码修改为适合当前开发板,修改如下:
{
MSC2 &= 0x0000ffff;
MSC2 |= 0x92040000; // 0x92340000
MDREFR |= 0x01010000; // Set free running clock and SDCLK[1] to 100MHz
LCCR0 |= LCCR0_DIS; // BIT:10 DISABLE lcd CONTROLLER
GAFR2_L = (GAFR2_L & ~0x30000000) | 0x20000000;
GAFR0_U = (GAFR0_U & ~0x30) | 0x10;
GAFR1_U = (GAFR1_U & ~0xf) | 0xa;
}
#endif //isACCELENT
修改arch/arm/mach-pxa/xhyper255.c,映射物理地址
在xhyper255_io_desc结构中,添加
{ 0xF0C00000, 0x17E00000, 0x00200000, DOMAIN_IO,0,1,0,0}, // CS5 : SM501 REG
注:因产商驱动代码的测试平台基于PXA255芯片,和当前开发板相似,所以相应的寄存器代码改动较少。SM501与显示驱动相关的寄存器主要在System Configuration和Display Controller中,具体数值参见《SM501 MMCC Databook》。
4. 配置内核参数
打开"Character devices"中的
"Support for console on virtual terminal"
打开"Console drivers"下"Frame-buffer support"中的
"Silicon Motion, Inc. VOYAGER graphics console"
"Advanced low level driver options"
"Monochrome support"
"2 bpp packed pixels support"
"4 bpp packed pixels support"
"8 bpp packed pixels support"
"16 bpp packed pixels support"
"24 bpp packed pixels support"
"32 bpp packed pixels support"
"Select compiled-in fonts"
"VGA 8x8 font"
注:本驱动移植基于Linux2.4.18版本的内核。
附:测试Frame Buffer的一个应用程序 FBTools