framebuffer显示功能在 3.1.6内核中的实现

分析framebuffer设备的时候没有按照以往的顺序先从Documentation开始看起。这次直接从板文件开始分析虽然使用的是tiny6410,但是由于配套资料不完整,所以程序分析还是那内核代码中的mach-mini6410mach-smdk6410比较进行移植分析。

第一部分从/arch/arm/mach-s3c64xx/mach-smdk6410line108-168

/* framebuffer and LCD setup. */


/*smdk6410_lcd_power_set()函数主要实现LCD的背光打开液晶屏复位打开功能

* 位定义如下:

* GPF15 = LCD backlight control

* GPF13 => Panel power

* GPN5 = LCD nRESET signal

* PWM_TOUT1 => backlight brightness

*/


static voidsmdk6410_lcd_power_set(struct plat_lcd_data *pd,

unsigned int power)

{

if (power) {

gpio_direction_output(S3C64XX_GPF(13),1);

gpio_direction_output(S3C64XX_GPF(15),1);


/* fire nRESET on power up */

gpio_direction_output(S3C64XX_GPN(5),0);

msleep(10);

gpio_direction_output(S3C64XX_GPN(5),1);

msleep(1);

} else {

gpio_direction_output(S3C64XX_GPF(15),0);

gpio_direction_output(S3C64XX_GPF(13),0);

}

}

/*

*屏幕电源打开和复位之后,进行platform结构的初始化,以备在初始化中使用;

*/

static struct plat_lcd_datasmdk6410_lcd_power_data = {

.set_power = smdk6410_lcd_power_set,

};


static struct platform_devicesmdk6410_lcd_powerdev = {

.name = "platform-lcd",

.dev.parent = &s3c_device_fb.dev,

.dev.platform_data =&smdk6410_lcd_power_data,

};

/*之后看到又作了一个液晶屏显示参数的初始化,结构定义在/arch/arm/plat-samsung/include/plat/fd.h

static struct s3c_fb_pd_winsmdk6410_fb_win0 = {

/* this is to ensure we use win0 */

.win_mode = {

.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,

.virtual_y = 480 * 2,

.virtual_x = 800,

};


/* 初始化s3c_fb_platdata结构显示驱动的信息

* 405566 clocks per frame => 60Hzrefresh requires 24333960Hz clock

*/

static struct s3c_fb_platdatasmdk6410_lcd_pdata __initdata = {

.setup_gpio =s3c64xx_fb_gpio_setup_24bpp,

.win[0] = &smdk6410_fb_win0,

.vidcon0 = VIDCON0_VIDOUT_RGB |VIDCON0_PNRMODE_RGB,

.vidcon1 = VIDCON1_INV_HSYNC |VIDCON1_INV_VSYNC,

};

mach-mini6410.c中,加入了下面一段内容,用作初始化缓冲区(个人认为是可有可无的)

static struct map_descmini6410_iodesc[] = {

{

/* LCD support */

.virtual = (unsignedlong)S3C_VA_LCD,

.pfn =__phys_to_pfn(S3C_PA_FB),

.length = SZ_16K,

.type = MT_DEVICE,

},

...

};

staticvoid __init mini6410_machine_init(void)函数下申请了3GPIO功能:

gpio_request(S3C64XX_GPN(5), "LCDpower");

gpio_request(S3C64XX_GPF(13), "LCDpower");

gpio_request(S3C64XX_GPF(15), "LCDpower");


最后在structplatform_device*smdk6410_devicessmdk6410_machine_init中分别添加s3c_device_fbs3c_fb_set_platdata(&smdk6410_lcd_pdata),板文件上所有的初始化就已经基本完成。


重新配置内核

makemenuconfig
  Power
managementoptions  --->
    [
]PowerManagementsupport  一定要去掉,不然会有
<*>
Supportforframebufferdevices  --->  
    
<*>  SamsungS3Cframebuffersupport                              
  [
]Backlight&LCDdevicesupport  --->

  Console
displaydriversupport  --->
    <*>
FramebufferConsolesupport
  [*]
Bootuplogo  --->                                                
      [
]  StandardblackandwhiteLinuxlogo                        
      [
]  Standard16-colorLinuxlogo                                
      [*]  
Standard224-colorLinuxlogo
其他的默认,编译奇迹般的成功了
^^

注:编译内核版本为3.1.6,与2.6内核稍有不同。后续会对 framebuffer的具体工作原理进行分析。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值