6410 LCD驱动移植

转载 2011年01月13日 16:30:00

移植工作主要有以下部分(仅仅对未作处理的部分做阐述):

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设备作为当前设备,

 

 

大概的移植需要这些步骤,但是有些函数和头文件是直接在原文件上更改的,标记做的不全,所以也就不详细的写了

ok6410的LCD驱动

经过 几天的研究 终于在飞凌的6410板子上出现了
  • caoyuanll
  • caoyuanll
  • 2014年08月27日 16:54
  • 726

让OK6410 linux支持自己的LCD

OK6410自带的那块LCD分辨率太低了,我自己在淘宝上面淘了一块5寸的LCD,分辨率800*480,与飞凌驱动里面7寸屏分辨率一样,我就改动了一下时序参数,能用了,但是有部分不大清晰,最终发现时由于...
  • cp1300
  • cp1300
  • 2012年08月23日 21:10
  • 3953

tiny6410裸机实验第9章--------------LCD(原理及源代码)

【说明】             这一章我们来介绍一个很好玩的东西,那就是LCD,也就是我们开发板上的显示屏了,这个要理清一个概念,那就是LCD和触摸屏是完全没关系的两个设备,只不过他们一般都做在一起...
  • u013476840
  • u013476840
  • 2014年03月08日 14:23
  • 1538

Linux 2.6.34下LCD驱动移植

Linux下的LCD设备被抽象成标准的framebuffer设备,我们只需要修改与LCD有关的扫描时间及分辨率即可 1、修改 arch/arm/mach-s3c2440/mach-smdk2440....
  • xdw1985829
  • xdw1985829
  • 2011年08月13日 19:23
  • 2344

Linux下移植LCD驱动

 使用Linux3.2.81内核 4.3寸LCD   修改arch/arm/mach-s3c2440/mach-smdk2440.c staticstru...
  • u012041204
  • u012041204
  • 2017年04月23日 15:08
  • 784

LCD驱动程序移植

对LCD的操作可以像串口一样,通过终端设备层的封装(/dev/tty*设备)来输出内容,也可以通过frame buffer(/dev/fb*设备)直接在显存上“绘制”图像。 tty(终端设备)...
  • qlexcel
  • qlexcel
  • 2016年06月10日 14:38
  • 416

LCD驱动移植配置总结

总结下移植LCD驱动时的参数配置情况: 根据LCD数据手册和处理器数据手册LCD控制器部分, 得到如下参数: 一、基本参数(4个) 1、宽度即水平像素点个数(eg:800) 2、高度即垂直像...
  • dcx1205
  • dcx1205
  • 2015年05月19日 21:53
  • 1055

【Tiny6410 And Linux】—(6.1)—LCD 驱动测试程序——代码

又过了好几天了,呵呵,应该说玩了好几天!   貌似要找工作了,有点发愁啊,不过现在还是坚持写写东西吧,暂时不想去想那么多(如果突然有那么份工作摆在面前,那该多好啊!)。   由于这里没有涉及到...
  • LonlyCorner520
  • LonlyCorner520
  • 2012年10月01日 16:25
  • 2405

linux中LCD设备驱动(4)——基于s3c6410平台

s3c6410硬件DISPLAY CONTROLLER(显示控制器)的链接地址 linux中LCD设备驱动(1)——framebuffer(帧缓冲)的链接地址 linux中LCD设...
  • tianxiawuzhei
  • tianxiawuzhei
  • 2012年05月24日 22:29
  • 4860

LCD屏时序分析

对于LCD屏的时序,首先有必要理解几个定义: 一般TFT型LCD时序图如下所示 图1 我们先来理解下面引脚有寄存器中相关参数的意义吧   外部引脚信号:   VSYNC: 帧同步...
  • skyflying2012
  • skyflying2012
  • 2013年01月29日 20:00
  • 2626
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:6410 LCD驱动移植
举报原因:
原因补充:

(最多只允许输入30个字)