龙芯软件开发(28)-- 显示卡初始化

这篇博客介绍了龙芯软件开发中的一个重要环节——显示卡初始化。通过深入浅出的讲解,帮助读者理解这一过程,适合对龙芯平台开发感兴趣的读者学习。
摘要由CSDN通过智能技术生成
               
在上一次里,已经说到初始化网络,在那里提到调用一个函数 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");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值