免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1257 | 回复: 0
打印 上一主题 下一主题

uClinux下显示驱动移植及minigui的移植 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-08 17:40 |只看该作者 |倒序浏览
这几天包括今天都非常的不顺,写这些字的时候, 我的本本正在进行Linux ext3分区的建立,我的Fedola3彻底崩溃了,我的很多uClinux移植成果不见了, 包括最看重的LCD显示的移植内容,这些都需要重新建立了,很多过程已很模糊, 这也映证了我在LINUX上面的许多迷惑,学透它真的很难,内核的移植面临很多的难点,在我即将实施的项目上(手持终端),需要对LCD显示,触摸屏,网络等等进行移植,我的硬件是ARM7(s3c44b0x)采用uClinux为操作系统,GUI采用飞漫的MINIGUI。一切都刚开始。
    如果安装一切顺利的话, 我将把我移植的全过程完整记录下来,为自己留下一些心得以便于长期之后仍然记得当时的情形, 脑子记东西是不行了,可能是年纪大了的原因。
2005.11.23
在昨天下午的安装Fedora3的过程很不顺利,屡次失败,今天上班后又失败几次,后来分析是与ISO所在的D区(FAT32)磁盘有问题, 用软件检查, 发现D区有问题,C区正常,于是将ISO拷贝到C区(FAT32),从REDHAT9的ISO第一张上提取了DOSUTILS目录,将其拷贝进C区根目录,用Fedora3中的第一个ISO中的ISOLINUX目录下的这两个文件拷贝到DOSUTILS\AUTOBOOT下,用DOS重新启动机器,在提示符下键入:
C:\>CD DOSUTILS
C:\>AUTOBOOT
开始安装Fedora3,中间过程正常,经过很长时间安装完成后,重新启动,默认启动采用X WINDOW启动,由于占用大量内存,我又习惯在文本状态下运行, 于是启动完成后, 修改/etc/inittab,把id:4:initdefault 改为 id:3: initdefaul保存后重启。Linux工作在文本模式下。
在另台PC上用CUTEFTP软件与LINUX主机建立FTP连接方式,将准备好的arm-elf-tools-20030314.sh和uClinux-dist-20040408.tar.gz及uClinux20050122.tar.bz2上载到LINUX主机的/home目录,修改arm-elf-tools-20030314.sh的属性为可执行,在提示符下键入tar zxvf uClinux-dist-20040408.tar.gz将原版uClinux解压到/home目录下再在home目录下键入tar jxvf uClinux20050122.tar.bz2将uClinux解压到/home目录下,覆盖原uClinux-dist目录,然后键入sh arm-elf-tools-20030314.sh将uClinux工具链解压到系统中。做到这一步,就已经在LINUX下建立了uClinux开发环境。我们采用SecureCRT4.1软件在Windows主机登陆LINUX主机,当然我是以SUPERVISOR身份登陆的。经过这几步我基本建立了uClinux的比较实用的交叉编译环境。下面就是针对我的应用平台来做移植了, 当然这个过程将极其艰苦。
    补充一点, 通过CUTEFTP上载arm-elf-tools-20030314.sh会造成文件格式损坏, 将其后缀改变后上载,一切正常。
    这一版的uClinux是来自勤研科技的配套S3C44B0X豪华板的改造过的内核。是基于uClinux2.4.x的改造。已经移植了串口,网络,YAFFS文件系统。但并没有基于Framebuffer的移植。更没有IIS、TOUCH SCREEN、USB、外部接口的移植。
 005.11.25
     为了移植Framebuffer驱动将宇立泰的补钉文件uClinux-20040408.patch上载到Linux主机上的/home/uClinux-dist目录下,键入patch –p1
 include
 include
 include
 include
 include
unsigned char abc[76800] = {…..略}
 nt main() {
    int framebuffer_device;
    int line_size,buffer_size, i;
    char *screen_memory;
    //unsigned char buffer[480000],j=0;
    struct fb_var_screeninfo var_info;
    struct fb_fix_screeninfo fix_info;
    framebuffer_device = open ( "/dev/fb0" , O_RDWR);
    ioctl (framebuffer_device, FBIOGET_VSCREENINFO, &var_info);
    ioctl (framebuffer_device, FBIOGET_FSCREENINFO, &fix_info);
    line_size = var_info.xres * var_info.bits_per_pixel / 8;
    buffer_size = line_size * var_info.yres;
    var_info.xoffset = 0;
    var_info.yoffset = 0;
    //ioctl (framebuffer_device, FBIOPAN_DISPLAY,&var_info) == -1);
    //write(framebuffer_device,buffer,sizeof(buffer_size));
    screen_memory = (char *) mmap (0, buffer_size, PROT_READ | PROT_WRITE, 0, framebuffer_device, 0);
    for (i=0;i  helloworld
No available video device.
NEWGAL: Does not find matched engine: qvfb.
GDI: Can not get graphics engine information!
InitGUI failure when using incore resource.
pid 30: failed 256
经过跟踪,进入sysres/mgedt.c
#include "common.h"
typedef struct _ETCSECTION
{
    int key_nr;               /* key number in the section */
    char *name;               /* name of the section */
    char **keys;              /* key string arrays */
    char **values;            /* value string arrays */
} ETCSECTION;
typedef ETCSECTION* PETCSECTION;
typedef struct _ETC_S
{
    int section_nr;           /* number of sections */
    PETCSECTION sections;     /* pointer to section arrays */
} ETC_S;
#ifdef _INCORE_RES
static char *SYSTEM_KEYS[] = {"gal_engine", "ial_engine", "mdev", "mtype"};
#ifdef __ECOS
static char *SYSTEM_VALUES[] = {"ecoslcd", "ipaq", "/dev/ts", "none"};
#else
 /static char *SYSTEM_VALUES[] = {"qvfb", "qvfb", "/dev/ts", "none"};   //这是我注释掉的原来的, 你们看看程序结构,不管我怎么配置NEWGAL,
//这里都将不可避免的进入QVFB
static char *SYSTEM_VALUES[] = {"fbcon", "dummy", "none", "none"};      //我新加的。
#endif
static char *FBCON_KEYS[] = {"defaultmode"};
static char *FBCON_VALUES[] = {"240x320-8bpp"};    //原来的是240X320-16bpp
static char *QVFB_KEYS[] = {"defaultmode", "display"};
static char *QVFB_VALUES[] = {"640x480-16bpp", "0"};
 tatic char *SYSTEMFONT_KEYS[] =
{"font_number", "font0", "font1", "font2", "default", "wchar_def", "fixed", "caption", "menu", "control"};
 tatic char *SYSTEMFONT_VALUES[] =
{
    "3","rbf-fixed-rrncnn-6-12-ISO8859-1", "*-fixed-rrncnn-*-12-GB2312", "*-SansSerif-rrncnn-*-12-GB2312",
    "0", "1", "1", "1", "1", "1"
};
static char *CURSORINFO_KEYS[] = {"cursornumber"};
static char *CURSORINFO_VALUES[] = {"2"};
static char *ICONINFO_KEYS[] = {"iconnumber"};
static char *ICONINFO_VALUES[] = {"5"};
static char *BITMAPINFO_KEYS[] = {"bitmapnumber"};
static char *BITMAPINFO_VALUES[] = {"3"};
/*
static char *BGPICTURE_KEYS[] = {"position"};
static char *BGPICTURE_VALUES[] = {"center"};
static char *MOUSE_KEYS[] = {"dblclicktime"};
static char *MOUSE_VALUES[] = {"300"};
static char *EVENT_KEYS[] = {"timeoutusec", "repeatusec"};
static char *EVENT_VALUES[] = {"300000", "50000"};
*/
static ETCSECTION mgetc_sections [] =
{
  {4, "system",       SYSTEM_KEYS,     SYSTEM_VALUES},
  {1, "fbcon",        FBCON_KEYS,      FBCON_VALUES},
  {2, "qvfb",         QVFB_KEYS,       QVFB_VALUES},
  {10,"systemfont",   SYSTEMFONT_KEYS, SYSTEMFONT_VALUES},
  {1, "cursorinfo",   CURSORINFO_KEYS, CURSORINFO_VALUES},
  {1, "iconinfo",     ICONINFO_KEYS,   ICONINFO_VALUES},
  {1, "bitmapinfo",   BITMAPINFO_KEYS, BITMAPINFO_VALUES},
/* optional sections */
  /*
  {1, "bgpicture", BGPICTURE_KEYS, BGPICTURE_VALUES},
  {1, "mouse", MOUSE_KEYS, MOUSE_VALUES},
  {2, "event", EVENT_KEYS, EVENT_VALUES},
  */
};
ETC_S MGETC = { 7, mgetc_sections };
#endif /* _INCORE_RES */
修改后编译并运行。仍然提示错误。
/bin> helloworld
 AP_SHARED not supported (cannot write mappings to disk)  //这条一看就知道在MMAP使用了不适合uClibc库的参数, 此项应该设置为0
  NEWGAL: Does not find matched engine: fbcon.      GDI: Can not get graphics engine information!
InitGUI failure when using incore resource.
Unable to memory map the video hardwarepid 30: failed 256
后来经过跟踪。在/libminigui-1.3.3/src/newgal/fbcon/fbvideo中找到OPEN及MMAP引用。
将mapped_mem = mmap(NULL, mapped_memlen,
                  PROT_READ|PROT_WRITE, MAP_SHARED, console_fd, 0);
改为
  #ifdef __uClinux__
    mapped_mem = mmap(NULL, mapped_memlen,
PROT_READ|PROT_WRITE, 0, console_fd, 0);
  #else
    mapped_mem = mmap(NULL, mapped_memlen,
                  PROT_READ|PROT_WRITE, MAP_SHARED, console_fd, 0);
  #endif
将mapped_io = mmap(NULL, mapped_iolen, PROT_READ|PROT_WRITE,
                 MAP_SHARED, console_fd, mapped_memlen);
改为
 ifdef __uClinux__
    mapped_io = mmap(NULL, mapped_iolen, PROT_READ|PROT_WRITE,
                         0, console_fd, mapped_memlen);
 else
mapped_io = mmap(NULL, mapped_iolen, PROT_READ|PROT_WRITE,
                 MAP_SHARED, console_fd, mapped_memlen);
#endif
编译后运行。发现出现代码崩溃,
/bin/helloworld
Unhandled fault: external abort on linefetch (F4) at 0x00000001
fault-common.c(97): start_code=0xcd00040, start_stack=0xcdfff84)
pid 32: failed 7
经过艰苦的跟踪分析。在/home/libminigui-1.3.3/src/kernel/desktop.c中。
将if (!InitSystemRes ()) {
fprintf (stderr, "DESKTOP: Can not initialize system resource!\n");
        return FALSE;
 注释掉。
编译运行。 显示OK, 有跑了几个例子都正常。那个时刻真的很高兴。
2005-12-15
  从今天起将做触摸屏的移植, 这是很重要的移植步骤,将使我们的程序真正意义的运行起来。
在/home/uClinux-dist/linux-2.4.x/drivers/char找到mc68328digi.c将起改名为s3c44b0xts.c,将/home/uClinux-dist/linux-2.4.x/include/linux下的mc68328digi.h改为s3c44b0xts.h。
先做好内核配置准备:
在/home/uClinux-dist/linux-2.4.x/drivers/char/config.in中增加
if [ "$CONFIG_ARCH_S3C44B0" = "y" ]; then
   bool 'S3C44B0 TOUCH SCREEN SUPPORT' CONFIG_TS_S3C44B0
fi
在/home/uClinux-dist/linux-2.4.x/drivers/char/makefile中增加
obj-$(CONFIG_TS_S3C44B0) += s3c44b0xts.o
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/66822/showart_681325.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP