// 主题:Real6410移植linux-2.6.39.1
// 作者:kevinjz2010@gmail.com
// 版权:kevinjz原创
// 平台:linux-2.39.1 real6410 (real6410开发板)
// 发布日期:2011-06-23
// 最后修改:2011-06-23
// 注意事项:欢迎转载,但不得在转载的时候擅自修改、删除文章的任何部分
//-------------------------------------------------------------------------------------------------
参考REAL论坛的移植步骤
1、首先,修改mach-real6410.c文件
添加所需头文件:
#incldeu <linux/fb.h>
#include <video/platform_lcd.h>
#include <mach/regs-fb.h>
#include <plat/fb.h>
#include <mach/regs-gpio.h>
#include <mach/regs-modem.h>
另外需要将28内核中的regs-lcd.h复制到plat/
2、加入设备初始化代码
static struct s3c_fb_pd_win real6410_fb_win[] = {
/* {
.win_mode = { 4.3" 480x272
.left_margin = 3,
.right_margin = 2,
.upper_margin = 1,
.lower_margin = 1,
.hsync_len = 40,
.vsync_len = 1,
.xres = 480,
.yres = 272,
},
.max_bpp = 32,
.default_bpp = 16,
}, */
{
.win_mode = { /* 7.0" 800x480 */
.left_margin = 8,
.right_margin = 13,
.upper_margin = 7,
.lower_margin = 5,
.hsync_len = 3,
.vsync_len = 1,
.xres = 800,
.yres = 480,
},
.max_bpp = 32,
.default_bpp = 16,
},
};//根据所用的显示屏尺寸更改
static struct s3c_fb_platdata real6410_lcd_pdata __initdata = {
.setup_gpio = s3c64xx_fb_gpio_setup_24bpp,
.win[0] = &real6410_fb_win[0],
.vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
.vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
};
static struct map_desc real6410_iodesc[] = {
{
/* LCD support */
.virtual = (unsigned long)S3C_VA_LCD,
.pfn = __phys_to_pfn(S3C_PA_FB),
.length = SZ_16K,
.type = MT_DEVICE,
},
};
在platform_device中加入
&s3c_device_fb,
在real6410_map_io中加入
s3c64xx_init_io(real6410_iodesc, ARRAY_SIZE(real6410_iodesc));
/* set the LCD type */
tmp = __raw_readl(S3C64XX_SPCON);
tmp &= ~S3C64XX_SPCON_LCD_SEL_MASK;
tmp |= S3C64XX_SPCON_LCD_SEL_RGB;
__raw_writel(tmp, S3C64XX_SPCON);
/* remove the LCD bypass */
tmp = __raw_readl(S3C64XX_MODEM_MIFPCON);
tmp &= ~MIFPCON_LCD_BYPASS;
__raw_writel(tmp, S3C64XX_MODEM_MIFPCON);
在real6410_machine_init加入注册代码
s3c_fb_set_platdata(&real6410_lcd_pdata);
3、修改/mach-s3c64xx/map.h,加入
#define S3C64XX_VA_HOSTIFA S3C_ADDR(0x00B00000)
#define S3C64XX_PA_HOSTIFA (0x74000000)
#define S3C64XX_SZ_HOSTIFA SZ_1M
#define S3C64XX_VA_HOSTIFB S3C_ADDR(0x00C00000)
#define S3C64XX_PA_HOSTIFB (0x74100000)
#define S3C64XX_SZ_HOSTIFB SZ_1M
4、修改plat-samsung/dev-fb.c,加入
static struct s3c_platform_fb default_fb_data __initdata = {
.hw_ver = 0x40,
.clk_name = "lcd",
.nr_wins = 5,
.default_win = CONFIG_FB_S3C,
.swap = FB_SWAP_HWORD,
};
并注意s3c_device_fb中的设备名称必须和驱动中的名称相对应,否则驱动不会被加载
修改plat/fb.h
#define FB_SWAP_WORD (1 << 24)
#define FB_SWAP_HWORD (1 << 16)
#define FB_SWAP_BYTE (1 << 8)
#define FB_SWAP_BIT (1 << 0)
struct s3c_platform_fb {
int hw_ver;
const char clk_name[16];
int nr_wins;
int nr_buffers[5];
int default_win;
int swap;
void (*cfg_gpio)(struct platform_device *dev);
int (*backlight_on)(struct platform_device *dev);
int (*reset_lcd)(struct platform_device *dev);
};
4、在plat/map-base.h加入
#define S3C_VA_LCD S3C_ADDR(0x01100000) /* LCD */
5、将28内核中/drivers/video/中samsung文件夹拷贝至相对应目录
6、修改video中的Kconfig,
加入source “drivers/video/samsung/Kconfig”,并将CONFIG_FB_S3C改成别的名字。
7、修改video中的Makefile,加入
:obj-$(CONFIG_FB_S3C) += SAMSUNG/
8、配置内核
$make menuconfig
在 device drivers->Graphics support->Support for frame buffer devices中选中
S3C Framebuffer Support
S3C Lcd Support Advanced options for S3C Framebuffer
Select BPP(Bits Per Pixel) (16 BPP) --->
Number of Framebuffers(4)
Enable Virtual Screen Enable Double Buffering
9、编译会有很多错误,大多是头文件的位置问题
10、修改samsung/Makefile,屏蔽obj-$(CONFIG_FB_S3C_VIDEO) += ch7026.o,以及s3cfb_video.c中的ch7026_init();
11、s3cfb_fimd4x.c中的错误按照REAL论坛上的修改,并将1222行屏蔽。
12、s3cfb.c中的驱动名称和之前设备名称需要对应
13、内核启动参数:
setenv bootargs noinitrd root=/dev/mtdblock0 console=ttySAC0 init=/linuxrc video=fb:AT070TN83