现在的位置: 首页 > 综合 > 正文

内核(2.6.14) + 根文件系统 + Qt4 移植 for S3C2410

2014年10月13日 ⁄ 综合 ⁄ 共 25145字 ⁄ 字号 评论关闭

内核(2.6.14) + 根文件系统 + Qt4 移植 for S3C2410

TARGET

CPU:   S3C2410X

SDRAM: HY57V561620(32MB) × 2

FLASH: K9F1208(64MB)

NET:   CS8900

HOST

Linux Realse Version: Fecora Core 6

CrossCompiler: gcc-4.1.1/arm-linux-gcc-3.4.1

 

 

一、内核移植(2.6.14)

1   修改linux2.6.14下面的makefile文件

    找到ARCH和CROSS_COMPILE,修改

    ARCH ?= arm

    CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux- 

(此处为你交叉编译的路径)

 

 设置flash分区

    在arch/arm/machs3c2410/devs.c文件中添加头文件

    #include <linux/mtd/partitions.h>

    #include <linux/mtd/nand.h>

    #include <asm/arch/nand.h> 

    然后建立分区表

    /* 一个Nand Flash总共64MB, 按如下大小进行分区 分区大小自己看着办*/

    static struct mtd_partition partition_info[] ={

        { /* 1MB */

            name: "bootloader",

            size: 0x00100000,

            offset: 0x0,

        },{ /* 3MB */

            name: "kernel",

            size: 0x00300000,

            offset: 0x00100000,

        }, { /* 40MB */

            name: "root",

            size: 0x02800000,

            offset: 0x00400000,

        }, { /* 20MB */

        name: "user",

        size: 0x00f00000,

        offset: 0x02d00000,

        }

    };

 

    /*加入Nand Flash分区*/

    struct s3c2410_nand_set nandset ={

    nr_partitions: 4, /*指明partition_info中定义的分区数目*/

    partitions: partition_info, /* partition table分区信息表*/

    };

 

    /*建立Nand Flash芯片支持*/

    struct s3c2410_platform_nand superlpplatform={

        tacls:0,

        twrph0:30,

        twrph1:0,

        sets: &nandset,

        nr_sets: 1,

    };

    tacls, twrph0, twrph1的意思见S3C2410手册的63,

    这3个值最后会被设置到NFCONF中,见S3C2410手册66.

    sets: 支持的分区集        nr_set:分区集的个数

   

    /*加入Nand Flash芯片支持到Nand Flash驱动

    另外,还要修改此文件中的s3c_device_nand结构体变量,添加对dev成员的赋值*/

    struct platform_device s3c_device_nand = {

        .name = "s3c2410-nand",

            /* Device name */

        .id = -1,

            /* Device ID */

        .num_resources = ARRAY_SIZE(s3c_nand_resource),

        .resource = s3c_nand_resource, /* Nand Flash Controller Registers */

            /* Add the Nand Flash device */

        .dev = {

        .platform_data = &superlpplatform

        }

    };

    指定启动时初始化

    arch/arm/machs-3c2410/mach-smdk2410.c文件

    找到platform_device *smdk2410_devices[] __initdata函数,在该函数体最后加上一条语句:

    &s3c_device_nand,

 

    禁用禁止Flash ECC校验(有不同说法)

    修改drivers/mtd/nand/s3c2410.c

    找到chip->eccmode = NAND_ECC_SOFT;

    改为chip->eccmode = NAND_ECC_NONE;

   

    支持启动挂载devfs

    修改fs/Kconfig文件 

    找到menu "Pseudo filesystems" 添加

    config DEVFS_FS

        bool "/dev file system support (OBSOLETE)"

        default y

 

    config DEVFS_MOUNT

        bool "Automatically mount at boot"

        default y

        depends on DEVFS_FS

 

3   Yaffs2文件系统支持

下载yaffs2.tar.gz源码包,解压源码,并进入目录执行

#./patch-ker.sh c /linux-2.6.14.1/

注:假定内核源码在/linux-2.6.14.1/

 

4   编译配置内核,首先先load一个默认的内核/linux-2.6.14/arch/arm/configs/smdk2410_defconfig,在这个配置文件上改

    Loadable module support >

        [*] Enable loadable module support

            [*] Automatic kernel module loading

 

    System Type >

        [*] S3C2410 DMA support

 

    Boot options >

        Default kernel command string:

        noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200

 

    Floating point emulation >

        [*] NWFPE math emulation

 

    Device Drivers >

        Memory Technology Devices (MTD) >

            [*] MTD partitioning support

                #支持MTD分区,这样我们在前面设置的分区才有意义

            [*] Command line partition table parsing

                #支持从命令行设置flash分区信息,灵活

            RAM/ROM/Flash chip drivers >

                <*> Detect flash chips by Common Flash Interface (CFI) probe

                <*> Detect nonCFI AMD/JEDECcompatible flash chips

                <*> Support for Intel/Sharp flash chips

                <*> Support for AMD/Fujitsu flash chips

                <*> Support for ROM chips in bus mapping

            NAND Flash Device Drivers >

                <*> NAND Device Support

                <*> NAND Flash support for S3C2410/S3C2440 SoC

       

Character devices >

            [*] Nonstandard serial port support

            [*] S3C2410 RTC Driver

 

    File systems >

        <> Second extended fs support #去除对ext2的支持

        Pseudo filesystems >

            [*] /proc file system support

            [*] Virtual memory file system support (former shm fs)

            [*] /dev file system support (OBSOLETE)

            [*] Automatically mount at boot (NEW)

                #这里会看到我们前先修改fs/Kconfig的成果,devfs已经被支持上了

        Miscellaneous filesystems >

            <*> Compressed ROM file system support (cramfs) #支持cramfs

            <*> YAFFS2 file system support                  #支持yaffs2

        Network File Systems >

            <*> NFS file system support

 

二、CS8900网卡驱动的移植

1   cs8900.c和cs8900.h放到/drivers/net/arm/

 

2   在cs8900.c中的cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句:

    __raw_writel(0x2211d110,S3C2410_BWSCON);

    __raw_writel(0x1f7c,S3C2410_BANKCON3); 

    添加头文件#include <asm/arch/regs-mem.h>

 

3   修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容:

    config ARM_CS8900

   tristate "CS8900 support"

        depends on NET_ETHERNET && ARM && ARCH_SMDK2410

    help

 

4   修改drivers/net/arm/目录下的Makefile文件,在最后添加如下内容:

    obj-$(CONFIG_ARM_CS8900)    += cs8900.o

 

5   在/arch/arm/mach-s3c2410/mach-smdk2410.c文件中,找到smdk2410_iodesc[]结构数组,添加如下如下内容:{vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE}

    添加头文件#inlcude <asm/arch/smdk2410.h> 

其实这个就是下面的那个头文件的链接/include/asm-arm/arch-s3c2410/smdk2410.h

 

6   在include/asm-arm/arch-s3c2410/目录下创建smdk2410.h文件,其内容为:

    #ifndef _INCLUDE_SMDK2410_H_

    #define _INCLUDE_SMDK2410_H_

    #include <linux/config.h>

    #define pSMDK2410_ETH_IO   0x19000000

    #define vSMDK2410_ETH_IO   0xE0000000

    #define SMDK2410_ETH_IRQ   IRQ_EINT9

    #endif // _INCLUDE_SMDK2410_H_ 

 

7   编译内核,选中所装驱动

    #make menuconfig

Device Drivers >

       Network device support  ---> 

            Ethernet (10 or 100Mbit) --->

                [*]Ethernet (10 or 100Mbit)

                <*>CS8900 support

 

三、LCD驱动移植

1   在arch/arm/mach-s3c2410/mach-smdk2410.c中添加

//lcd

#include <asm/arch/regs-lcd.h>

#include <asm/arch-s3c2410/fb.h>

//-------------------------------------------lcd

static struct s3c2410fb_mach_info s3c2410_lcd_info __initdata = {

              .fixed_syncs = 0,

              .regs = {

              //对于寄存器的设置是关键,可参考S3C2410X的手册

              //和LCD技术手册中对于LCD技术指标的描述来进行设置。

              //其中,寄存器值的宏定义在regs-lcd.h文件中。

/*

                     .lcdcon1 = S3C2410_LCDCON1_TFT16BPP

| S3C2410_LCDCON1_TFT | S3C2410_LCDCON1_CLKVAL(1),

                     .lcdcon2 = S3C2410_LCDCON2_VBPD(32)

| S3C2410_LCDCON2_VFPD(9) | S3C2410_LCDCON2_VSPW(1),

                     .lcdcon3 = S3C2410_LCDCON3_HBPD(47)

| S3C2410_LCDCON3_HFPD(15),

                     .lcdcon4 = S3C2410_LCDCON4_MVAL(13)

| S3C2410_LCDCON4_HSPW(95),

                     .lcdcon5 = S3C2410_LCDCON5_FRM565

| S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_HWSWP

| S3C2410_LCDCON5_PWREN | S3C2410_LCDCON5_INVVFRAME,

*/

            .lcdcon1 = S3C2410_LCDCON1_TFT16BPP

            | S3C2410_LCDCON1_TFT | S3C2410_LCDCON1_CLKVAL(1),

            .lcdcon2 = S3C2410_LCDCON2_VBPD(1)

            | S3C2410_LCDCON2_VFPD(2) | S3C2410_LCDCON2_VSPW(1),

            .lcdcon3 = S3C2410_LCDCON3_HBPD(6)

            | S3C2410_LCDCON3_HFPD(2),

            .lcdcon4 = S3C2410_LCDCON4_MVAL(13)

            | S3C2410_LCDCON4_HSPW(4),

            .lcdcon5 = S3C2410_LCDCON5_FRM565

            | S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_HWSWP

            | S3C2410_LCDCON5_PWREN | S3C2410_LCDCON5_INVVFRAME,

              },

              .lpcsel = 0x0,

              .gpccon = 0xaaaaaaaa,

              .gpccon_mask = 0xffffffff,

              .gpcup = 0xffffffff,

              .gpcup_mask = 0xffffffff,

              .gpdcon = 0xaaaaaaaa,

              .gpdcon_mask = 0x0,

              .gpdup = 0xffffffff,

              .gpdup_mask = 0xffffffff,

              .width = 640,

              .height = 480,

              .xres = {640,640,640},

              .yres = {480,480,480},

              .bpp = {16,16,16},

};

static void __init smdk2410_lcd_init(void)

{

              set_s3c2410fb_info(&s3c2410_lcd_info);

}

3   在文件最后MACHINE_END之前添加

.init_machine = smdk2410_lcd_init,

 

4   编译内核,选中所装驱动

#make menuconfig

Device Drivers >

       Graphics support  ---> 

            <*> support for frame buffer devices

            <*> S3C2410 LCD framebuffer support

                Logo configuration  --->  //开机画面的选择,可据个人需要更改

                    [*]Bootup logo

                    [*]Standard 224-color linux logo

 

5   开机画面的选择

首先把要开机Logo图片(png格式)放在linux2.6.14文件中的 drivers/video/logo中,终端选择进入drivers/video/logo目录,进行以下操作:

(假设开机图片名为linux.png)

# pngtopnm  linux.png  >  linuxlogo.pnm

# pnmquant 224 linuxlogo.pnm   linuxlogo224.pnm

# pnmtoplainpnm  linuxlogo224.pnm   linuxlogo224.ppm

# mv  linuxlogo224.ppm  logo_linux_clut224.ppm  //替换原来的启动文件

 

四、USB驱动移植

1   在arch/arm/mach-s3c2410/mach-smdk2410.c中紧接着LCD的部分添加

//usb

#include <asm/arch/usb-control.h>

#include <asm/arch/regs-clock.h>

#include <linux/device.h>

#include <linux/delay.h>

 

//-------------------------------------------------usb

struct s3c2410_hcd_info usb_s3c2410_info = {

              .port[0] = {

                     .flags = S3C_HCDFLG_USED

              }

};

int smdk2410_usb_init(void) /* USB */

{

              unsigned long upllvalue = (0x78<<12)|(0x02<<4)|(0x03);

              printk("USB Control, (c) 2006 s3c2410\n");

              s3c_device_usb.dev.platform_data = &usb_s3c2410_info;

              while(upllvalue!=__raw_readl(S3C2410_UPLLCON))

              { __raw_writel(upllvalue,S3C2410_UPLLCON);

                     mdelay(1);

             }

              return 0;

}

 

2   在smdk2410_map_io函数最后添加

smdk2410_usb_init();

 

3   编译内核,选中所装驱动,配置USB鼠标键盘

#make menuconfig

Device Drivers >

       USB support  ---> 

            <*> Support for Host-side USB

            <*> OHCI HCD support

--- USB Input Devices

<*> USB Human Interface Devices (full HID) support

[*] HID input layer support

 

五、配置U盘支持

因为要优盘用到了SCSI 命令,所以我们先增加SCSI 支持。

在Device Drivers 菜单里面,选择SCSI device support

#make menuconfig

Device Drivers >

       SCSI device support  ---> 

            [*] legacy /proc/scsi support

<*> SCSI disk support

然后选择<Exit>返回Device Drivers 菜单,再选择 USB support,按回车进入USB support菜单找到并选中

Device Drivers >

            USB support  --->

<*> USB Mass Storage support

                [*]     USB Mass Storage verbose debug

 

六、配置USB摄像头

#make menuconfig

Device Drivers >

       Multimedia device  --->

<*> Video for Linux

Video for Linux---> 选中其中两个选项

然后选择<Exit>返回Device Drivers 菜单,再选择 USB support,按回车进入USB support菜单找到并选中

 

Device Drivers >

            USB support  --->

<*> USB OV511 Camera support

<*> USB SE401 Camera support

 

七、配置SD/MMC卡驱动 (不确定)

#make menuconfig

Device Drivers >

       MMC/SD Card support  ---> 

<*> MMC support

[*] MMC debugging

<*> MMC block device driver

 

八、根文件系统制作(Busybox1.9.2)

1   建一个目录rootfs用来装文件系统

 

2   # mkdir bin dev etc home lib mnt proc root sbin tmp usr var

    # mkdir usr/bin usr/sbin

# mkdir mnt tmp var

# chmod 1777 tmp

# mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp

# mkdir var/lib var/lock var/log var/run var/tmp

# chmod 1777 var/tmp

# mkdir home root boot

 

3   到系统 /dev 把所有的device打一个包,拷贝到 dev下面(最省事的做法);或者使用mknod来自己建所需要的device,

举例:

# mknod -m 600 dev/console c 5 1

# mknod -m 666 dev/null c 1 3

 

4   应用程序定制

标准的Linux发行版本具有功能种类比较多的应用程序,这些应用程序占用的空间也很大,这对存储容量空间有限的开发板来说就不是理想的选择,在嵌入式开发过程中,经常用BusyBox来定制应用程序。BusyBox具有shell的功能,它能提供系统所需要的大部分工具,包括编辑工具、网络工具、模块加载工具、压缩解压缩工具、查找工具、帐号密码管理工具和进程相关工具等。

目前BusyBox的最新版本是BusyBox-1.9.2版本,下载解压,切换到BusyBox的

根目录下,修改Makefile,找到ARCH和CROSS COMPILE修改如下:

ARCH ?= arm

CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux-

 

5   修改编译配置选项。

#make defconfig

#make menuconfig

在默认的选项前提之下,选项设置如下:

    BusyBox Settings --->

    Build Options ---> (采用静态编译)

[*] Build BusyBox as a static binary (no shared libs)

Install optin-->

[*] Don't use /usr  //可以不选,选了则没有/usr文件夹

Busybox Library Tuning --->

(2) MD5: Trade Bytes for Speed

[*] Faster /proc scanning code (+100 bytes)

[*] Support for /etc/networks

[*] Support for /etc/networks

[*] Additional editing keys

[*] vi-style line editing commands

[*] History saving

[*] Tab completion

[*] Username completion

[*] Fancy shell prompts

 

Linux Module Utilities --->

[ ] Support version 2.2.x to 2.4.x Linux kernels  //不能选

[*] Support version 2.6.x Linux kernels

Linux System Utilities --->

    [*] Support for the old /etc/mtab file   //不确定

Miscellaneous Utilities --->

    [*] devfs(obsolete) //不确定

    [*] Use devfs names for all device(obsolete) //不确定

Shell ---> 

Choose your default shell(ash)-->

---ash   //下面的选项全部选择

 

6   编译busybox

make install

在busybox/_install 目录下会生成我们需要的文件。

修改_install/bin/busybox 的属性。为4755

chmod 4755 ./_install/bin/busybox

必须要修改属性,否则在busybox 中很多命令会受限

将编译好的busybox拷贝到/bin下面。拷贝时带上参数-arf或者-dpR。

除了busybox外,所有其他的命令都是他的link

/sbin下面也是busybox的link,

/usr/bin下面也是busybox的link,

/usr/sbin下面放着所有编译完的可执行文件,具体就不多说了

7   非常重要之/lib,务必重视

/lib的库其实就是进行busybox编译的库,即交叉编译器的库,我们这里使用的是3.4.1(位置/usr/local/arm/3.4.1)。

# cd  /usr/local/arm/3.4.1/arm-linux/lib

# for file in libc libcrypt libdl libm libpthread libresolv libutil

> do

> cp $file-*.so  rootfs/lib (复制到你做的文件系统的/lib目录下)

> cp -d $file.so.[*0-9]  rootfs/lib

> done

# cp -d ld*.so*  rootfs/lib

 

8   系统配置文件的建立

系统配置文件放在/etc目录下

    (1)profile文件

#Set search library path

export LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH

#Set user path

        PATH=/bin:/sbin:/usr/bin:/usr/sbin:$PATH

alias ll='ls -l'

        #Set PS1
        USER=”`id –un`”

        LOGNAME=$USER

        PS1=’[\u@\h \W]\$ ’

PATH=$PATH

        export USER LOGNAME PS1 PATH

    (2)fstab文件

proc  /proc proc  defaults  0 0

none  /tmp  ramfs defaults  0 0

mdev  /dev  ramfs defaults  0 0

sysfs /sys  sysfs defaults  0 0

    (3)inittab文件

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh

::ctrlaltdel:/bin/umount -a -r

::shutdown:/bin/umount -a -r

::shutdown:/sbin/swapoff -a

    (4)创建/etc/init.d文件夹和rcS,在rcS中添加

#! /bin/sh

# 设置主机名,需要在etc 建立文件host

./etc/host

hostname ${HOSTNAME}

# mount all filesystem defined in “fstab”

echo "# mount all..........."

/bin/mount -a

echo "# Starting mdev........."

/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev –s

    (5)host文件

HOSTNAME=Hasotech

    (6)创建mdev.conf文件 (空文件)

(7)复制主机/etc/下面的文件passwd, group, shadow 文件到/etc

# cp /etc/group .

# cp /etc/passwd .

# cp /etc/shadow .

修改passwd中用户使用的shell名称。FC6上默认的为bash,而vivi只支持ash。

root:x:0:0:root:/root:/bin/bash -->

root:x:0:0:root:/root:/bin/ash

    (8)修改各文件和文件夹的权限

# chmod 755 /rootfs/etc/init.d/rcS

# chmod 755 /rootfs/etc/host

 

9   yaffs文件系统映像的制作

使用mkyaffsimg程序可以把一个目录做成一个yaffs映像文件,然后使用usb下载到

板子上。进入文件系统目录层,使用以下命令。

#mkyaffsimg rootfs rootfs.img

这样就会在该目录下生成rootfs.img映像文件,下载到开发板运行即可。

 

10  cramfs文件系统映像的制作(cramfs压缩率比较高)

在FTP中下载cramfs-1.1.tar.gz,解压到自己设定的目录下,如:

tar xzvf cramfs-1.1.tar.gz –C /home/

进入生成有mkcramfs文件的目录下(一定要进入此目录,否则会提示找不到该命令)

输入命令:#./mkcramfs / rootfs rootfs.cramfs

在当前目录下即生成rootfs.cramfs映像文件。到此Linux操作系统移植完毕。

 

九、Qt移植(Qtopia4.2.2)

1   Qt  Qtopia 简介 (自己的理解,不对之处还请见谅)

    Qt特点是“一次编写,处处编译”。

Qt是在PC机上安装安装使用的;Qtopia Core 是基于嵌入式Linux的面向单一应用的嵌入式产品开发平台,即要移植到开发板上使用的;Qt/E是面向嵌入式系统的Qt版本,而Qtopia最初是构建于Qt/E之上的类似桌面系统的应用程序。

最初Qtopia和Qt/E是两种不同的程序,但从版本4.1以后,将Qt/E并入了Qtopia,改称为Qtopia Core。

接下来要进行的Qt移植就是指对Qtopia Core的移植,我们的版本是Qtopia4.2.2,即对其库的移植。移植的步骤是这样的,首先在PC机上安装Qtopia4.2.2,然后把其中的放入我们制作的根文件系统的/lib之中,最后设置环境变量。以下为详细内容:

 

 

2   下载Qtopia Core 4的源代码,建议到www.qtopia.org.cn下载, qtopia-core-opensource-src-4.2.2.tar.gz,解压

# tar zxvf qtopia-core-opensource-src-4.2.2.tar.gz

# cd qtopia-core-opensource-src-4.2.2

# ./configure -embedded arm -xplatform qws/linux-arm-g++ -depths  4,8,12,16 -no-qt3support 

# gmake  (这个过程最漫长...)

# gmake install  (需root 权限)

设置Qt的环境变量,修改$HOME/.bash_profile 加入

# vi $HOME/.bash_profile

    添加

PATH=/usr/local/Trolltech/QtopiaCore-4.2.2-arm/bin:/usr/local/Trolltech/Qt-4.2.2/bin:$PATH

    后面的是Qt for X11的环境变量设置,执行使立即生效

# source $HOME/.bash_profile

# echo $PATH

# which qmake //可查看已经添加成功

 

3   把qtopia-core-opensource-src-4.2.2的库放入制作的根文件系统的/lib之中

    安装好的Qtopia在目录/usr/local/Trolltech/QtopiaCore-4.2.2-arm下,进入其目录。可以看到/lib文件,其中包括一个fonts文件夹,里面是一些字体,内容很多也很占空间(72M左右),因为我们的目标板一般flash很小,64M左右,所以我们只选用很常用或者自己觉得好看的字体放入。

首先在/建立一个文件夹——Qtopia,里面存放入库和字体文件的fonts文件夹,

# cd /usr/local/Trolltech/QtopiaCore-4.2.2-arm

# mkdir Qtopia

然后把/lib下的文件复制到其中

# cp –arf  /usr/local/Trolltech/QtopiaCore-4.2.2-arm/lib/*   /usr/local/Trolltech/QtopiaCore-4.2.2-arm/Qtopia

    删掉多余的字体文件

# cd /usr/local/Trolltech/QtopiaCore-4.2.2-arm/Qtopia/fonts

    只留下cour.pfa  cursor.pfa

    最后把Qtopia拷贝到刚刚我们做好的文件系统的/lib下面

# cp –arf /usr/local/Trolltech/QtopiaCore-4.2.2-arm/Qtopia  /rootfs/lib

 

4         设置环境变量

在文件系统中,关键要设置环境变量,才能让Qt4的程序找到我们移植的Qt4的库,真正跑起来。设置环境变量可分两种,与PC机上一样,可以在命令行下设置,还有一种方法是在/etc/profile文件中设置,让开发板一启动就自动设置,添加命令如下:

PATH=/usr/bin:/usr/sbin:$PATH:./

export FRAMEBUFFER='/dev/fb/0'

export TSDATAFILE='/mnt/yaffs/minigui/tsdata.dat'

export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/lib/Qtopia:$LD_LIBRARY_PATH

export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0"

关键是LD_LIBRARY_PATH,这个设置让系统知道Qt的库的位置,即/usr/lib/Qtopia,还有一个关键是QWS_DISPLAY,因为我们在运行程序时,有一个参数是qws,例如:./analogclock –qws ,设置好QWS_DISPLAY后才能在显示屏上显示按我们要求比例大小的图像。

 

5         测试代码

进入/usr/local/Trolltech/QtopiaCore-4.2.2-arm/examples/tutorial/t1

# cd /usr/local/Trolltech/QtopiaCore-4.2.2-arm/examples/tutorial/t1

# qmake -project

# qmake

# make

    生成二进制文件t1,通过适合的方式拷贝到文件系统中,执行 ./t1 –qws 可以显示 helloworld

 

十、Qt4编程(fc6—使用KDevelop联合开发)

1   Qt/X11的安装

    下载Qtopia Core 4的源代码,建议到www.qtopia.org.cn下载, qt-x11-opensource-src-4.2.2.tar.gz,解压

# tar xvzf qt-x11-opensource-src-4.2.2.tar.gz

# cd qt-x11-opensource-src-4.2.2

# ./configure

# make

# su –c “make install” 

设置Qt的环境变量,修改$HOME/.bash_profile 加入

# vi $HOME/.bash_profile

    添加

PATH=/usr/local/Trolltech/Qt-4.2.2/bin:/usr/local/Trolltech/QtopiaCore-4.2.2-arm/bin: $PATH

    执行使立即生效

# source $HOME/.bash_profile

# echo $PATH

# which qmake  //可查看已经添加成功

   

2           fc6下使用KDevelop开发Qt4

在安装fc6时使用全部安装,特别是开发软件的安装,就默认带KDevelop3.3.4

(1)  启动KDevelop KDE/C++

(2)  选择工程 | 新建工程 | 显示全部工程模版 | QMakeProject | Qt4 Application | 输入工程名 |默认下一步

(3)  工程 | 工程选项 | C++特点设置 | Qt | 选定 Enable Qt options | 选择Qt4 | 选择Qt4的路径(即QMake Binary  Designer Binary)

(4)  分别执行“构建”“编译”“执行”3步

使用KDevelop开发Qt4,完全要靠输入代码完成,工作量大,一些工作易重复或加大工作量,所以推荐下面这种方法:KDevelop与Qt4的Qt Designer联合开发

3   KDevelop与Qt4的Qt Designer联合开发(推荐)

    (1)用Qt Designer设计出.ui文件,比如工程文件位置为/root/hello/hello.ui

    (2)进入工程目录进行编译

    # cd /root/hello

    //生成ui_hello.h头文件,以备后面开发之用,我们写的程序依靠此文件

    # uic –o ui_hello.h hello.ui

    # qmake –project

    # qmake

    (3)启动KDevelop KDE/C++, 选择 Project | Import Existing Project

选择我们刚才在生成的/root/hello/hello.pro文件,把文件导入KDevelop

    (4)书写main.cpp文件及需要的其他文件完成编辑工作。main.cpp和其他文件的书写很有讲究,这里不再详述,请参考Qt4的帮助文档

 

PS:vivi设置

1   SBC2410x的VIVI已经被友善之臂自动加入了USB功能,这个小功能省去了我们很多麻烦。所以建议大家先把板子的USB驱动装上。

重新分区

分区名称

分区大小

vivi

128k

param

64k

kernel

3M

root

40M

user

15M

在vivi命令行下输入如下命令

part show

然后输入:

part del <name>

参数name为各个显示分区的名字,一直到把所有分区都删除为止,然后依次输入:

part add vivi 0x0 0x20000 0

part add param 0x20000 0x10000 0

part add kernel 0x00100000 0x00300000 0

part add root 0x00400000 0x02800000 0

part add user 0x02d00000 0x00f00000 0

part save

现在分区就已经完毕了。

vivi的分区一定要与内核里的分区设置一致,即与arch/arm/machs3c2410/devs.c里static struct mtd_partition partition_info[]分区一致,至少是kernel后的地址一致,这个需特别注意。

 

2   设置启动参数

执行:

param show

就可以见到你现在的所有VIVI参数,其中linux command line为传递给linux内核的启动参数。因2.4与2.6在参数方面有变动,所以输入如下命令:

param set linux_cmd_line “noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200

param save

 

 

ARM LINUX系统启动时,启动信息默认在串口终端上打印显示。但有没有方法能够让启动信息显示在LCD上呢,像PC的启动一样。答案是肯定的。 
1.bootloader里修改启动参数 char *Linux_params ="noinitrd root=/dev/mtdblock2 init=/Linuxrc console=tty0,ttySAC0,115200 mem=64M devfs=mount"; 
noinitrd no init ramdisk support 
mtdblock2 nand flash的第三个分区作为rootfs 
console=tty0,ttySAC0,115200 系统启动信息的前半部分(bootloader+kernel前部分)显示在ttySAC0(串口终端)115200表示波特率,kernel的后半部分启动信息加载到tty0(LCD终端) 
64M 64M内存 

2.配置内核make menuconfig时,修改boot option为 noinitrd root=/dev/mtdblock2 init=/Linuxrc console=tty0,ttySAC0,115200 mem=64M devfs=mount 

3.UBOOT作为bootloader时,修改UBOOT环境变量bootargs setenv bootargs 'noinitrd root=/dev/mtdblock2 init=/Linuxrc console=tty0,ttySAC0,115200' saveenv(保存变量
我个人还是喜欢让信息从终端显示,LCD还是整洁的好。

NFS加载根文件系统,当然你的内核要支持从NFS启动,这是首要的。
设置UBOOT的环境变量,同上:
setenv bootargs 'noinitrd init=/linuxrc root=/dev/nfs nfsroot=192.168.1.200:/home/lua/rootfs ip=192.168.1.168:255.255.255.0 console=ttySAC0,115200 '

saveenv,别忘记保存

 

 

 

 

//-------------------------------------------------------------------------------------------------------------------

基本原理

· 通过 framebuffer ,应用程序用 mmap 把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来;

· 驱动程序分配系统内存作为显存;实现 file_operations 结构中的接口,为应用程序服务;实现 fb_ops 结构中的接口,控制和操作 LDC 控制器;

· 驱动程序将显存的起始地址和长度传给 LCD 控制器的寄存器 (一般由 fb_set_var 完成, LDC 控制器会自动的将显存中的数据显示在 LCD 屏上。

写 framebuffer 驱动程序要做什么

· 简单的讲,framebuffer 驱动的功能就是分配一块内存作显存,然后对 LCD 控制器的寄存器作一些设置。

· 具体来说:

1. 填充一个 fbinfo 结构

2. 用 reigster_framebuffer (fbinfo*) 将 fbinfo 结构注册到内核

· 对于 fbinfo 结构,最主要的是它的 fs_ops 成员,需要针对具体设备实现 fs_ops 中的接口

· 考虑是否使用中断处理

· 考虑内存访问方式

3. 显卡不自带显存的,分配系统内存作为显存

4. 显卡自带显存的,用 I/O 内存接口进行访问 (request_mem_region / ioremap)

· 关于如何写驱动的参考资料,在网站 http: /linux-fbdev.sourceforge.net/HOWTO/index.html 可以找到 "Linux Frame buffer Driver Writing HOWTO"

LCD 模块 驱动程序 控制器

关于LCD 设备资料可参考如下资料:

· Datasheet of LCD device

· 书:液晶显示技术

· 书:液晶显示器件

什么是 frame buffer 设备

frame buffer 设备是图形硬件的抽象,它代表了图形硬件的侦缓冲区,允许应 用程序通过指定的接口访问图形硬件。因此,应用程序不必关心底层硬件细节。

设备通过特定的设备节点访问,通常在 /dev 目录下,如 /dev/fb*

更多关于 frame buffer device 的资料可以在以下两个文件中找到: linux /Documentation/fb/framebuffer.txt 和 linux /Documentation/fb /interal.txt,但这些资料内容不多,还需要看看结合代码具体分析。

Linux Frame Buffer 驱动程序层次结构

Frame Buffer 设备驱动可以从三个层次来看:

1. 应用程序与系统调用;

2. 适用于所有设备的通用代码,避免重复,包括 file_operations 结构、register/unregister framebuffer 接口等;

3. 操作具体硬件的代码,主要是 fs_ops 结构。

在 Linux 内核中,Frame Buffer 设备驱动的源码主要在以下两个文件中,它们 处于 frame buffer 驱动体系结构的中间层,它为上层的用户程序提供系统调用, 也为底层特定硬件驱动提供了接口:

1. linux/inlcude/fb.h

2. linux/drivers/video/fbmem.c

数据结构

头文件 fb.h 定义了所有的数据结构:

· fb_var_screeninfo:描述了一种显卡显示模式的所有信息,如宽、高、颜色深度等,不同的显示模式对应不同的信息;

· fb_fix_screeninfo:定义了显卡信息,如 framebuffer 内存的起始地址,地址长度等;

· fb_cmap:设备独立的 colormap 信息,可以通过 ioctl 的 FBIOGETCMAP 和 FBIOPUTCMAP 命令设置 colormap

· fb_info:包含当前 video card 的状态信息,只有 fb_info 对内核可见;

· fb_ops : 应用程序使用 ioctl 系统调用操作底层的 LCD 硬件,fb_ops 结构中定义的方法用于支持这些操作;

· 这些结构相互之间的关系如下所示:

 

framebuffer 驱动主要数据结构

接口

fbmem.c 实现了所有驱动使用的通用代码,避免了重复。

全局变量:

     struct fb_info *registered_fb [FB_MAX]

     int num_registered_fb;

这个两个变量用于记录正在使用的 fb_info 结构实例。fb_info 代表 video card 的当前状态,所有的 fb_info 结构都放在数组中。当一个 frame buffer 在内核中登记时,一个新的 fb_info 结构被加入该数组,num_registered_fb 加 1

fb_drivers 数组:

 

static struct {

    const char *name;

    int (*init)(void);

    int (*setup)(void);

} fb_drivers[] __initdata= { ....};

 

若 frame buffer 驱动程序是静态链接到内核中,一个新的 entry 必须要加到这个表中。 若该驱动程序是使用 insmod/rmmod 动态加载到内核,则不必关心这个结构。

static struct file_operations fb_ops ={

    owner: THIS_MODULE,

    read: fb_read,

    write: fb_write,

    ioctl: fb_ioctl,

    mmap: fb_mmap,

    open: fb_open,

    release: fb_release

};

这是用户应用程序的接口,fbmem.c 实现了这些函数。

register/unregister framebuffer

 

 register_framebuffer(struct fb_info *fb_info)

 unregister_framebuffer(struct fb_info *fb_info)

这是底层 frame buffer 设备驱动程序的接口。驱动程序使用这对函数实现注册和撤销操作。底层驱动程序的工作基本上是填充 fb_info 结构,然后注册它。

一个 LCD controller 驱动程序

实现一个 LCD controller 驱动程序主要做如下两步:

· 分配系统内存作显存

· 根据具体的硬件特性,实现 fb_ops 的接口

· 在 linux/drivers/fb/skeletonfb.c 中有一个 frame buffer 驱动程序的框架,它示例了怎样用很少的代码实现一个 frame buffer 驱动程序。

分配系统内存作为显存

由于大多数 LDC controller 没有自己的显存,需要分配一块系统内存作为显存。 这块系统内存的起始地址和长度之后会被存放在 fb_fix_screeninfo 的 smem_start 和 smem_len 域中。该内存应该是物理上连续的。

对于带独立显存的显卡,使用 request_mem_region 和 ioremap 将显卡外设内存映射到处理器虚拟地址空间。

实现 fb_ops 结构

目前还没有讨论的 file_operations 方法是 ioctl ()。用户应用程序使用 ioctrl 系统调用操作 LCD 硬件。fb_ops 结构中定义的方法为这些操作提供支 持。注意, fb_ops 结构不是 file_operations 结构。fb_ops 是底层操作的抽 象,而 file_operations 为上层系统调用接口提供支持。

下面考虑需要实现哪些方法。ioctl 命令和 fb_ops 结构中的接口之间的关系如 下所示:

    FBIOGET_VSCREENINFO fb_get_var

    FBIOPUT_VSCREENINFO fb_set_var

    FBIOGET_FSCREENINFO fb_get_fix

    FBIOPUTCMAP fb_set_cmap

    FBIOGETCMAP fb_get_cmap

    FBIOPAN_DISPLAY fb_pan_display

只要我们实现了那些 fb_XXX 函数,那么用户应用程序就可以使用 FBIOXXXX 宏 来操作 LDC 硬件了。那怎么实现那些接口呢?可以参考下 linux/drivers/video 目录下的驱动程序。

在众多接口中, fb_set_var 是最重要的。它用于设置 video mode 等信息。下 面是实现 fb_set_var 函数的通用步骤:

1. 检查是否有必要设置 mode

2. 设置 mode

3. 设置 colormap

4. 根据上面的设置重新配置 LCD controller 寄存器

其中第四步是底层硬件操作。

Reference

· Writing Linux LCD drivers―深入分析framebuffer设备驱动的结构

· Linux Frame Buffer Driver HOWTO

· s3c2410_lcd frame buffer 驱动分析

· Linux 2.6 Device Model

· Linux 2.6 内核设备模型

 

 

设置使mini2440开机运行自编的qt图形界面程序

2011-05-14 16:26

主要参考来源:http://my502sky.blog.163.com/blog/static/140045057201021115152478/

但是使用这篇文章的思路,我测试的结果是自动启动后不可以使用鼠标,我做了一些修改是触屏正常使用

本机环境是qte的库文件在/mini2440下,qte应用程序在/home/plg目录下。

如果想在开机后直接运行自己编的qt程序,而不想出现qt自带的那个界面只需把/etc/init.d/rcS中的

/bin/qtopia & 注释掉#/bin/qtopia &

并在下面加上

/home/plg/run.sh & #添加一个执行脚本行,这个脚本因为在/etc/init.d/rcS中,所以会被自动运行(注意后面最好有个&,使他在后台执行,否则无法通过串口操作控制台)

如图:


然后在/home/plg目录下建立一个run.sh文件,内容如下:

export QTDIR=/mini2440
export T_ROOT=/tslib
export PATH=$QTDIR/bin:$PATH
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_MOUSE_PROTO=tslib:/dev/input/event0
export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib

这个内容和我的“qte在mini2440上的移植及交叉编译环境的搭建-亲测通过”这篇文章讲到的添加环境的变量是一模一样的。我的整个run.sh文件内容如下:

#!/bin/sh
export QTDIR=/mini2440
export T_ROOT=/tslib
export PATH=$QTDIR/bin:$PATH
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_MOUSE_PROTO=tslib:/dev/input/event0
export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib
#export QWS_KEYBOARD=TTY:/dev/tty1
/home/plg/spreadsheet -qws

重启之后,就可以看见自己添加的qte程序开机自动运行,并且我们可以正常使用触屏。原理就是qt程序依赖很多的动态共享库,在运行的时候必须找到这个共享库,所以在运行qt程序之前必须显式地指明这些共享库的所在位置

 

抱歉!评论已关闭.