嵌入式2D加速显卡SM501驱动的移植[linux.2.6.18]

来源:互联网 发布:tm域名 编辑:程序博客网 时间:2024/05/21 14:02

嵌入式2D加速显卡SM501驱动的移植[linux.2.6.18]

本文从三个方面说明一下SM501显卡驱动在2440+2.6.18环境下的移植:
1 硬件情况。
2 移植过程
3 驱动测试

一、硬件情况:
第一次接触到显卡编程,有点不太适应。SM501的Datasheet写的太简略,个人觉得有用的基本上就是两个方面:

内存映射模式。
2440与SM501连接模式为2440作为HOST有独立的SDRAM,SM501除了可以访问HOSTSDRAM外,还拥有8MB的本地内存作为FrameBuffer。SM501的帧缓存与IO寄存器占有64M地址空间。其中0~62M属于Framebuffer,高2M地址空间属于SM501的IO寄存器端口地址MMIO_BASE。这2M IO端口空间中每64KB属于一组接口寄存器。 在我的板子上,SM501的64M地址空间映射在2440的0x800_0000~0x1000_1000范围内。即FrameBuffer的起始物理地址为0x800_0000,SM501 MMIO_BASE地址0xBE0_0000。 这些对于移植驱动来说应该已经足够。
基本配置。由于两个原因:1是对于图形显示芯片的基本知识欠缺,2是SM501的Datasheet实在不怎么样,太简略。应该是具体的配置还不太清晰。 主要方面如下:
1)系统设置  :系统配置,DRAM配置时序等,GPIO功能配置。
2)2D加速操作。设置寄存器的值和命令,启动图形加速操作。
3)LCD接口设置 
4)CRT接口设置

二、SM501驱动在2.6.18内核下的移植过程:
下载SM501驱动,版本0.05,按照其readme.txt的说法,支持2.6.4内核和2.4.20。
开发板环境s3c2440 + linux2.6.18。

 

 

9)其它被证明为没有必要的修改:
添加头文件:
#include 
/*beelike add  这里添加对bank1的DRAM控制寄存器设置*/
#define S3C2410_BWSCON_DW1 (3<<4)
void sm501_hwinit(void)
{ volatile unsigned int * p;
p= S3C2410_BWSCON;
*p = (*p & (~(S3C2410_BWSCON_ST1| S3C2410_BWSCON_WS1|S3C2410_BWSCON_DW1)));
  *p = (*p)|(S3C2410_BWSCON_ST1| S3C2410_BWSCON_WS1 |S3C2410_BWSCON_DW1_32);
p=S3C2410_BANKCON1;
*p= S3C2410_BANKCON_Tacs0|S3C2410_BANKCON_Tcos4|S3C2410_BANKCON_Tacc14|S3C2410_BANKCON_Tcoh1 | S3C2410_BANKCON_Tcah4 | S3C2410_BANKCON_Tacp6 | S3C2410_BANKCON_PMCnorm;
}
/* 虽然被证明没有必要,那因为内核或者u-boot已经对这两个寄存器做过正确设置,如果移植失败,则的确应该考虑内存控制器的设置问题 end add */

整体来说,移植SM501驱动还是比较顺利的。系统启动后在屏幕左上角安静显示了小企鹅。

 

三、驱动测试:(Framebuffer 编程)

所有的fb驱动拥有同一个FB_MAJOR(29)。SM501显卡驱动在我的板上占用的minor=0。先生成节点:

mknod /dev/fb0 c 29 0

然后使用程序fbtest.c测试,源码如下:(此源码来自网络,略加修改)
#include
#include
#include
#include
#include

int main()
{
        int fbfd = 0;
        struct fb_var_screeninfo vinfo;
        struct fb_fix_screeninfo finfo;
        long int screensize = 0;
        int * fbp = 0;
        int i;
       
        fbfd = open("/dev/fb0", O_RDWR);
        if (!fbfd) {
                printf("Error: cannot open framebuffer device./n");
                exit(1);
        }

        if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {
                printf("Error reading fixed information./n");
                exit(2);
        }
        if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
                printf("Error reading variable information./n");
                exit(3);
        }
        screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
        fbp = (int *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,fbfd, 0);
        if ((int)fbp == -1) {
                printf("Error: failed to map framebuffer device to memory./n");
                exit(4);
        }
        printf("/dev/fb0:/n xres=%d,yres=%d,bpp=%d/n",vinfo.xres,vinfo.yres,vinfo.bits_per_pixel);
        for(i=0;i         *(fbp+i) = 255<<8 ;
        munmap(fbp, screensize);
        close(fbfd);
        return 0;
}

交叉编译,下载执行,CRT屏幕显示整屏绿色。测试成功。




在移植过程中主要参考readme.txt和网络上两篇好文章:
http://www.eetop.cn/blog/html/38/12938-11581.html
http://blog.csdn.net/listream1/archive/2006/11/06/1369361.aspx
这两篇文章是基于2.4版内核的。