原创:kylin_zeng http://blog.sina.com.cn/u/2312748742
一、系统架构:
二、先看 include\linux\fb.h
struct fb_info
{
有三个比较重要的结构体:
struct fb_var_screeninfo var;//用户可以修改的显示参数,包括屏幕分辨率。
struct fb_fix_screeninfo fix: //用户不能修改的显示控制器的参数,入显示缓存的物理地址。
struct fb_ops *fbops;//对控制器进行的操作函数。
}
三、分析 drivers\video\davincifb.c
这里有两层含义,可以编译成模块,也能编译进内核中。入口见module_init(davincifb_init),可见入口在davincifb_init函数中。
里面函数:platform_device_register(&davincifb_device)函数注册平台设备,这是一个总线设备模型,它通过设备的名字和驱动的名字进行匹配,
如果能过匹配后则调用了probe这个函数。注册驱动在driver_register(&davincifb_driver),probe在davincifb_driver和davincifb_device里有两个.name
可知设备和驱动都匹配了。 这时就开始执行davincifb_probe了。
四、还需两步,一个是分配一个内存,一个是告知控制寄存器内存在哪里。
1)
内存是在fb_fix_screeninfo 里的smem_start.通过这个变量可以找到在arch\arm\mach-netx\fb.c
里面有netx_clcd_setup(){ fb->fb.fix.smem_start=dma}.此时frambuffer就已经有啦。
2)
怎么告知lcd控制寄存器呢?
1、修改lcd屏幕的参数:
drivers/media/video/davinci/logicpd_encoder.c
修改logicpd_encoder_configuration里面的。
2、在/arch/arm/mach-davnici/Board-dm365-evm.c
中的dm365_evm_init(void)加入dm365_lcd_hw_init()点亮lcd.
static int dm365_lcd_hw_init(void)
{
int status;
davinci_cfg_reg(DM365_AEMIF_D15_8);
davinci_cfg_reg(DM365_PWM3_G81);
status = gpio_request(62, "lcd avdd\n");
if (status < 0)
{
printk("gpio_request gpio62 failed.\n");
return status;
}
status = gpio_request(81, "lcd b/l\n");
if (status < 0) {
gpio_free(81);
printk("gpio_request gpio81 failed.\n");
return status;
}
gpio_direction_output(62, 0);
gpio_direction_output(81, 0);
gpio_set_value(81, 0);
gpio_set_value(62, 0);
gpio_set_value(62, 1);
mdelay(30);
gpio_set_value(81, 1);
return 0;
}
//kylin end
3、修改管脚功能:
arch/arm/mach-davinci/dm365.c 里面的dm365_pins[]
4、显示logo.和进度条。
driver/video/console/fbcon.c中;
fbcon_switch()
{
fb_show_logo();
fb_show_progress_bar();
}
5、
void fbcon_init
{
void fbcon_prepare_logo
{
int fb_prepare_logo
{
fb_find_logo
{
logo_linux_clut224
{
struct linux_logo logo_linux_clut224
}
}
}
}
}
6、止光标两种方法:
方法一:
在内核的当前目录进入到drivers/video/console/fbcon.c文件
将static void fb_flashcursor(void *private)和函数static void fbcon_cursor(struct vc_data *vc, int mode)
这两个函数内容置空掉。
方法二:
drivers/video/console/Makefile
#obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o font.o softcursor.o
obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o font.o
编译遇到一个soft_cursor没有定义的问题问题,注释代码:
drivers/video/console/bitblit.c
// if (err)
// soft_cursor(info, &cursor);
7、制作内核启动的图片Logo
一)先下载工具:
apt-get install netpbm(如果下载失败,先查看虚拟机是否能上网)
二)开始制作图片:
(1)让内核支持启动LOGO
在内核目录中 make menuconfig
Device Drivers ----> Graphics support ---->
选中 Bootup logo ----> Standard 224-color Linux logo
(2) 制作一张启动LOGO的bmp格式的图片tem1.bmp
(3) #bmptoppm temp1.bmp > temp2.ppm //生产ppm格式
#ppmquant 224 temp2.ppm > temp3.ppm //转换成 224 颜色
#pnmnoraw temp3.ppm > logo_linux_clut224.ppm //这张就是可用的logo,ascii格式的。
(4)将LOGO文件放入内核中
拷贝到制作好的LOGO文件到 /drivers/video/logo 文件夹
替换 logo_linux_clut224.ppm 文件
(5)重新编译内核
这个已经验证,可用。
(同理还可以先制作一张启动LOGO的PNG格式的图片logo_linux_clut224.png
在执行下面装换
#pngtopnm logo_linux_clut224.png > logo_linux.pnm
#pnmquant 224 logo_linux.pnm > logo_linux_224.pnm
#pnmtoplainpnm logo_linux_224.pnm > logo_linux_clut224.ppm 未尝试)。