6410 LCD驱动移植
2011-01-13 16:30
459 查看
移植工作主要有以下部分(仅仅对未作处理的部分做阐述):
1.在mach-smdk6410.c这个文件中添加初始化的设备
&s3c_device_fb,
会根据name 自动关联执行哪个设备的probe的探测函数
同时在plat-s3c64XX下面增加dev-fb.c 主要是用来填充platform_fb这个结构体
static struct resource s3cfb_resource[] = {
[0] = {
.start = S3C64XX_PA_LCD,
.end
= S3C64XX_PA_LCD + S3C64XX_SZ_LCD - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_LCD_VSYNC,
.end
= IRQ_LCD_VSYNC,
.flags = IORESOURCE_IRQ,
},
[2] = {
.start = IRQ_LCD_FIFO,
.end
= IRQ_LCD_FIFO,
.flags = IORESOURCE_IRQ,
},
};
static u64 fb_dma_mask = 0xffffffffUL;
struct platform_device s3c_device_fb = {
.name
= "s3cfb",
.id
= -1,
.num_resources
= ARRAY_SIZE(s3cfb_resource),
.resource =
s3cfb_resource,
.dev
= {
.dma_mask =
&fb_dma_mask,
.coherent_dma_mask =
0xffffffffUL
}
};
static struct s3c_platform_fb default_fb_data __initdata =
{
.hw_ver = 0x40,
.clk_name = "lcd",
.nr_wins = 5,
.default_win =
1,//CONFIG_FB_S3C_V2_DEFAULT_WINDOW,
.swap = FB_SWAP_HWORD,
};
void __init s3cfb_set_platdata(struct s3c_platform_fb *pd)
{
struct s3c_platform_fb *npd;
int i;
if (!pd)
pd =
&default_fb_data;
npd = kmemdup(pd, sizeof(struct s3c_platform_fb),
GFP_KERNEL);
if (!npd)
printk(KERN_ERR "%s: no memory
for platform data/n", __func__);
for (i = 0; i <
npd->nr_wins; i++)
npd->nr_buffers[i]
= 1;
npd->nr_buffers[npd->default_win]
= 1 + 1;
npd->cfg_gpio =
s3cfb_cfg_gpio;
npd->backlight_on =
s3cfb_backlight_on;
npd->reset_lcd =
s3cfb_reset_lcd;
s3c_device_fb.dev.platform_data = npd;
}
在machine_init的时候执行s3cfb_set_platdata(NULL);就已经填充完毕
.clk_name = "lcd",
在填充时候就已经把对应LCD所需的clk指向其具体的clk(CPU.c中有相关的结构体的填充)
所有的时钟都是在cpu.c中配置的!具体的时钟实现是在对应平台下的clock.c配置
2)mach-s3c6400/include/mach/memory.h 中增加了
#define
CONSISTENT_DMA_SIZE (SZ_8M + SZ_4M + SZ_2M)
#define
__virt_to_bus(x) __virt_to_phys(x)
#define
__bus_to_virt(x) __phys_to_virt(x)
如果不定义这个的话默认为2M,会导致DMA太小溢出
3)删除mach-smdk6410.c中设置LCD,
Gpio_request会导致后面initial时候gpio-request失败,(重复调用)
#if
0
gpio_request(S3C64XX_GPN(5), "LCD power");
gpio_request(S3C64XX_GPF(13), "LCD power");
gpio_request(S3C64XX_GPF(15), "LCD power");
#endif
以下是删除设置LCD的类型,以为在probe时候已经配置好了,各版本内核的架构不一样,所以初始化的位置也就不相同,以后续高版本为准,
#if 0
tmp = __raw_readl(S3C64XX_SPCON);
tmp &=
~S3C64XX_SPCON_LCD_SEL_MASK;
tmp |= S3C64XX_SPCON_LCD_SEL_RGB;
__raw_writel(tmp, S3C64XX_SPCON);
tmp = __raw_readl(S3C64XX_MODEM_MIFPCON);
tmp &= ~MIFPCON_LCD_BYPASS;
__raw_writel(tmp, S3C64XX_MODEM_MIFPCON);
#endif
4)plat-s3c24xx/include/plat/clock.h
增加了clock.h这个文件,因为24xx和64xx在部分功能和接口是一样的,函数可以互相调用
5)plat-s3c64xx/include/plat/pll.h
regs-gpio.h 定义了时钟和pin脚相关的宏以及函数
6)修改asm/fb.h
//static inline int fb_is_primary_device(struct fb_info
*info)
//{
// return 0;
//}
extern int fb_is_primary_device(struct fb_info *info);
fb_is_primary_device 是调用S3cfb.c中的函数而不是直接返回0
这一步至关重要,因为在后面framebuffer_register时候会有个判断,就是是使用那一个fb设备作为当前设备,
大概的移植需要这些步骤,但是有些函数和头文件是直接在原文件上更改的,标记做的不全,所以也就不详细的写了
1.在mach-smdk6410.c这个文件中添加初始化的设备
&s3c_device_fb,
会根据name 自动关联执行哪个设备的probe的探测函数
同时在plat-s3c64XX下面增加dev-fb.c 主要是用来填充platform_fb这个结构体
static struct resource s3cfb_resource[] = {
[0] = {
.start = S3C64XX_PA_LCD,
.end
= S3C64XX_PA_LCD + S3C64XX_SZ_LCD - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_LCD_VSYNC,
.end
= IRQ_LCD_VSYNC,
.flags = IORESOURCE_IRQ,
},
[2] = {
.start = IRQ_LCD_FIFO,
.end
= IRQ_LCD_FIFO,
.flags = IORESOURCE_IRQ,
},
};
static u64 fb_dma_mask = 0xffffffffUL;
struct platform_device s3c_device_fb = {
.name
= "s3cfb",
.id
= -1,
.num_resources
= ARRAY_SIZE(s3cfb_resource),
.resource =
s3cfb_resource,
.dev
= {
.dma_mask =
&fb_dma_mask,
.coherent_dma_mask =
0xffffffffUL
}
};
static struct s3c_platform_fb default_fb_data __initdata =
{
.hw_ver = 0x40,
.clk_name = "lcd",
.nr_wins = 5,
.default_win =
1,//CONFIG_FB_S3C_V2_DEFAULT_WINDOW,
.swap = FB_SWAP_HWORD,
};
void __init s3cfb_set_platdata(struct s3c_platform_fb *pd)
{
struct s3c_platform_fb *npd;
int i;
if (!pd)
pd =
&default_fb_data;
npd = kmemdup(pd, sizeof(struct s3c_platform_fb),
GFP_KERNEL);
if (!npd)
printk(KERN_ERR "%s: no memory
for platform data/n", __func__);
for (i = 0; i <
npd->nr_wins; i++)
npd->nr_buffers[i]
= 1;
npd->nr_buffers[npd->default_win]
= 1 + 1;
npd->cfg_gpio =
s3cfb_cfg_gpio;
npd->backlight_on =
s3cfb_backlight_on;
npd->reset_lcd =
s3cfb_reset_lcd;
s3c_device_fb.dev.platform_data = npd;
}
在machine_init的时候执行s3cfb_set_platdata(NULL);就已经填充完毕
.clk_name = "lcd",
在填充时候就已经把对应LCD所需的clk指向其具体的clk(CPU.c中有相关的结构体的填充)
所有的时钟都是在cpu.c中配置的!具体的时钟实现是在对应平台下的clock.c配置
2)mach-s3c6400/include/mach/memory.h 中增加了
#define
CONSISTENT_DMA_SIZE (SZ_8M + SZ_4M + SZ_2M)
#define
__virt_to_bus(x) __virt_to_phys(x)
#define
__bus_to_virt(x) __phys_to_virt(x)
如果不定义这个的话默认为2M,会导致DMA太小溢出
3)删除mach-smdk6410.c中设置LCD,
Gpio_request会导致后面initial时候gpio-request失败,(重复调用)
#if
0
gpio_request(S3C64XX_GPN(5), "LCD power");
gpio_request(S3C64XX_GPF(13), "LCD power");
gpio_request(S3C64XX_GPF(15), "LCD power");
#endif
以下是删除设置LCD的类型,以为在probe时候已经配置好了,各版本内核的架构不一样,所以初始化的位置也就不相同,以后续高版本为准,
#if 0
tmp = __raw_readl(S3C64XX_SPCON);
tmp &=
~S3C64XX_SPCON_LCD_SEL_MASK;
tmp |= S3C64XX_SPCON_LCD_SEL_RGB;
__raw_writel(tmp, S3C64XX_SPCON);
tmp = __raw_readl(S3C64XX_MODEM_MIFPCON);
tmp &= ~MIFPCON_LCD_BYPASS;
__raw_writel(tmp, S3C64XX_MODEM_MIFPCON);
#endif
4)plat-s3c24xx/include/plat/clock.h
增加了clock.h这个文件,因为24xx和64xx在部分功能和接口是一样的,函数可以互相调用
5)plat-s3c64xx/include/plat/pll.h
regs-gpio.h 定义了时钟和pin脚相关的宏以及函数
6)修改asm/fb.h
//static inline int fb_is_primary_device(struct fb_info
*info)
//{
// return 0;
//}
extern int fb_is_primary_device(struct fb_info *info);
fb_is_primary_device 是调用S3cfb.c中的函数而不是直接返回0
这一步至关重要,因为在后面framebuffer_register时候会有个判断,就是是使用那一个fb设备作为当前设备,
大概的移植需要这些步骤,但是有些函数和头文件是直接在原文件上更改的,标记做的不全,所以也就不详细的写了
相关文章推荐
- Linux3.8.3在OK6410平台的移植LCD驱动
- OK6410 LCD驱动移植
- 6410 LCD驱动移植
- 成功移植UT6410的800*480的LCD驱动
- 移植ok6410 LCD驱动
- linux系统移植之LCD驱动移植
- 转:linux下 s3c2440 lcd驱动移植详解
- linux下 s3c2440 lcd驱动移植详解
- linux-2.6.26.5内核的&nbsp;lcd驱动移植…
- AM335x(TQ335x)学习笔记——LCD驱动移植
- s3c2440之LCD驱动移植
- 6410之LCD驱动程序(驱动框架)
- S3C2410 LCD驱动的移植(基于linux-2.6.15.4内核)
- 【TINY4412】LINUX移植笔记:(20)设备树LCD背光驱动
- linux2.6.32.2 mini2440平台移植--LCD 背光驱动
- LCD背光驱动移植
- linux-2.6.26.5内核的&nbsp;lcd驱动移植…
- 在S3C2410的6寸LCD驱动在linux2.6上的移植
- AT91SAM9260下的U-Boot移植和添加LCD驱动支持
- LCD驱动移植笔记