在上一次里,已经说到初始化网络,在那里提到调用一个函数 tgt_devconfig 来初始化其它重要的设备。这其中就有一个重要的设备要初始化的,它就是显示卡。下面就来仔细地阅读这个函数的代码,如下:
void
tgt_devconfig ()
{
#if NMOD_VGACON > 0
int rc;
#if NMOD_FRAMEBUFFER > 0
unsigned long fbaddress,ioaddress;
extern struct pci_device *vga_dev;
#endif
#endif
_pci_devinit(1); /* PCI device initialization */
上面进行 PCI 设备加载,让它可以工作。
#if NMOD_X86EMU_INT10 > 0
SBD_DISPLAY("VGAI", 0);
rc = vga_bios_init();
#endif
上面可以选择模拟 X86 的 CPU 功能,由于市场上的显示卡,大部份都是为 X86 的 CPU 制造的,所以显示卡里的 BIOS 程序,只能在 X86 里的 CPU 运行。为了使用这种显示卡,就要在龙芯里模拟一个 X86 的 CPU ,这样就可以执行显示卡的 BIOS 程序了。希望国产的显示卡芯片早日壮大,这样就可以直写出适用于龙芯的 BIOS 了。
#if (NMOD_X86EMU_INT10 == 0 && defined(RADEON7000))
SBD_DISPLAY("VGAI", 0);
rc = radeon_init();
#endif
上面使用直接初始化显示卡的方式。
#if NMOD_FRAMEBUFFER > 0
if (rc > 0) {
SBD_DISPLAY("FRBI", 0);
fbaddress =_pci_conf_read(vga_dev->pa.pa_tag,0x10);
ioaddress =_pci_conf_read(vga_dev->pa.pa_tag,0x18);
fbaddress = fbaddress &0xffffff00; //laster 8 bit
ioaddress = ioaddress &0xfffffff0; //laster 4 bit
printf("fbaddress 0x%x/tioaddress 0x%x/n",fbaddress, ioaddress);
fb_init(fbaddress, ioaddress);
printf("after fb_init/n");
} else {
printf("vga bios init failed, rc=%d/n",rc);
}
#endif
上面进行帧缓冲区( Frame buffer )初始化。
if (rc > 0)
if(!getenv("novga")) vga_available=1;
上面根据参数是否输出显示内容到显示器上。当你想输出到串口上时,就需要设置这个变量为 1 。
config_init();
configure ();
上面初始化自动配置的结构。
#if NMOD_VGACON >0
#if !(defined(VGA_NOTEBOOK_V1) || defined(VGA_NOTEBOOK_V2))
rc=kbd_initialize();
#else
rc = 0;
#endif
printf("%s/n",kbd_error_msgs[rc]);
if(!rc){
kbd_available=1;
}
上面进行键盘初始化。
#endif
printf("devconfig done./n");
}
上面先进行 PCI 设备的加载过程,然后选择合适方式来初始化显示卡,最后初始化了键盘。
下面再来仔细地看看显示卡的初始化。先看函数 radeon_init 的实现:
int
radeon_init (void)
{
unsigned int v;
int i;
/* BIOS Header at 0x10c
first initialization block at 0x1dd
PLL information block at 0x2ef
second initialization block at 0x25e
second initialization block at 0x3bb */
printf ("starting radeon init.../n");