Posts Tagged ‘mini2440’

Android on MINI2440

我今天把网友编译好的Android修改好,主要是修改8寸屏幕的定义部分而已,放到我的MINI2440上运行了一下,能显示菜单能动作,就是速度那简直是太慢了,应该是和8寸屏幕有关系,或许三寸屏幕要好一些。没办法玩了。

最近试了试基于Linux的GUI,结论如下:XFCE相当慢无法用;GNOME Mobile也很慢;Enlightenment还凑合,只是运行其他程序就慢很多了;Android在我的八寸屏幕上无法用,截图我就不发了。

现在就只有耐心的等待友善出WINCE6的BSP了,否则只好弄个WINCE5的系统来玩玩。Linux恐怕还是最好玩玩控制台算了。呵呵。

当然,主要是我的目标太高了,想做个类似于MID的系统,但64M的RAM和400M的CPU,恐怕是有点遗憾呢。

MINI2440上成功运行Enlightenment

花了些时间终于在MINI2440上把enlightenment运行起来了,速度还行,比XFCE和GNOME快多了。XFCE和GNOME的X的CPU占用率高达50%,难怪很慢。Englithenment没有这个问题,不用的时候CPU占用率很低。

编译Enlightenment仅需要使用Openembedded就可以构建,详细步骤今天没时间写了,以后有空补上。

看看截图吧,解解馋。

OpenEmbedded console-image 编译成功

我是才接触OpenEmbedded不久,也算是个菜鸟。看到这么方便的东西以为bitbake xxxx就可以了,结果哪知道这个才是唐僧刚刚上马,遇到的妖魔鬼怪还多着呢。这里总结一下我最近bitbake console-image所历经的磨难。

IMG_0117

IMG_0118

IMG_0119

1、准备

  • 一个超级好的网络是必不可少的,否则当你什么都下载不了的时候你就知道什么是痛苦了。
  • 一个4核的CPU是很有必要的,当然如果有钱可以买个core i7更好
  • 如果想在编译的时候能够打发一下时光,建议安装vmware。特别建议用7.0的技术预览版(网上找找看有没有,我是vmware邀请测试的),因为可以支持大于2个CPU。
  • 留至少80G连续的硬盘空间。
  • 选一个比较吉祥的日子,准备好耐心

2、下载和建立好local.conf

从OE的官方git源clone一个副本,这个步骤我就省略了,但是记得经常git pull。我的local.conf的MACHINE定义为mini2440,DISTRO定义为openmoko。想编译一个openmoko出来玩。

3、bitbake console-image

然后bitbake就会工作了,期间肯定会遇上小的妖魔鬼怪,什么preferred version not found之类的,只需要改变一下conf/distro/conf文件里面的preferredxxxxx.inc文件就可以了。具体是什么文件可以用grep xxxx -r .来搜索,当然这你得有一些基本的linux尝试。

其他的问题比较多的是:

1、编译出错。我想这不是我的错,如果在recipes的相应组件中找到了更新的版本,可以使用另外的版本来替换。替换的方法是修改PREFERRED_VERSION_xxxxx的值即可。一般使用高点的版本就会OK。

2、没有本地的工具支持。有些编译项目需要本地支持。上次编译mtd-utils就遇到了本地有一个工具没有安装。如果看到了有些错误位于i686目录(有这个字样的),就可以怀疑是本地有些工具或者库没有安装,从而不能正常编译。懂点脑子把东西装上应该就会对。

3、版本不兼容。有时候包与包之间有可能不兼容,方法是把出错的包在网上搜一下,例如这个编译mtd-native的错误就是由包之间不兼容引起的:http://projects.linuxtogo.org/pipermail/openembedded-devel/2009-January/007571.html

4、其它问题。有时候编译中途出了问题(例如电脑死机、意外重启、停电等)会造成一些莫名其妙的温长天,把tmp文件夹删除了再编译,看会不会OK。当然删除tmp文件夹要有点耐心,文件太多了。

如果想在晚上通宵运行,那么加一个-k参数就好,这样第二天早上再来处理那些莫名其妙的问题。

写这篇文章的时候我只记得这么几个问题了,还有一些另外的小问题,但也都是很容易解决的。多多搜索,或者利用邮件列表来解决。

现在开始另一站了,编译bitbake x11-office-image。

外面下雨了,这个国庆真是恼火~

OpenJTAG+Eclipse 3.5+GDB+Mini2440图文教程

最近学看了些书,对嵌入式有进一步了解了。开发昨天花了180大洋买了个OpenJTAG调试器,以便跟踪调试程序,查看寄存器的变化,进一步了解ARM9的运作原理。 OpenJTAG买回来了折腾了好久终于可以用了。

首先是操作系统的问题。我认为理想的开发环境是Linux+Eclipse来开发。在Windows里面只能用虚拟机安装。我再 VirtualBox 3.0.4里面装好了Ubuntu和VboxAdditionTools,但是始终无法将Host的USB JTAG设备分配过去,显示previous request is busy。晕,直接用不了。尝试用Vmware 6.5,装的Ubuntu 8.10竟然不能用Vmware Tools,原因是和内核不兼容。好嘛,那我只有装Native Ubuntu了。为了便于管理,直接用Wubi装了个9.04,升级到最新的软件后,开始了OpenJTAG之旅。

将OpenJTAG插入后,会多出来一个USB设备,在/dev/ttyUSB0。说明连接正常。

我的开发板拨到NAND档的,里面有一个2440test程序,会在一开机就启动,会设置MMU、Cache等。这点对于后来的JTAG调试造成了一些麻烦,要比说明书多一些步骤才能正确运行调试。




首先我们来看看怎么用手动方式调试:

将光盘附带的friendly-arm/leds复制到工作目录/home/derekhe/workspace/leds,然后再命令行中输入 make编译程序,得到leds_elf文件和leds.bin文件。连接好OpenJTAG和开发板,打开电源,然后插上OpenJTAG。在终端中运行

 derekhe@ubuntu:~/workspace$ openocd -f ~/workspace/openocd.cfg

注意将-f 后面修改为你openocd.cfg所在真实路径。如果此文件在当前目录下(如本例),可以直接运行openocd。

我的openocd.cfg如下:

 telnet_port 4444
 gdb_port 3333
 interface ft2232
 jtag_speed 0
 ft2232_vid_pid 0x1457 0x5118
 ft2232_layout "jtagkey_prototype_v1"
 reset_config trst_and_srst
 jtag_device 4 0x1 0xf 0xe
 daemon_startup attach
 target arm920t little reset_run 0 arm920t
 arm7_9 fast_memory_access enable
 working_area 0 0x200000 0x4000 backup
 #flash bank cfi 0 0x100000 2 2 0
 #debug_level 3
 nand device s3c2440 0
 run_and_halt_time 0 5000
 ft2232_device_desc "USB<=>JTAG&RS232"

此时会显示:

 Info:    options.c:50 configuration_output_handler(): jtag_speed: 0, 0
 Info:    options.c:50 configuration_output_handler(): Open On-Chip Debugger 1.0 (2008-10-04-09:26) svn:717
 Info:    options.c:50 configuration_output_handler(): fast memory access is enabled
 Info:    jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x0032409d (Manufacturer: 0x04e, Part: 0x0324, Version: 0x0)

说明jtag已经找到了,可以开始调试了。 下一步开启另外一个终端,开始运行telnet程序,链接OpenJTAG服务器

 derekhe@ubuntu:~/workspace$ telnet localhost 4444

终端输出:

 derekhe@ubuntu:~$ telnet localhost 4444
 Trying ::1...
 Trying 127.0.0.1...
 Connected to localhost.
 Escape character is '^]'.
 Open On-Chip Debugger
 >

由于上电以后NAND的程序会自动运行,所以必须先使用halt命令暂停:

 > halt
 target state: halted
 target halted in ARM state due to debug request, current mode: Supervisor
 cpsr: 0x60000013 pc: 0x30001150
 MMU: enabled, D-Cache: enabled, I-Cache: enabled
 >

此时可以看到,MMU和Cache处于enable状态。在下载程序之前要清除这两个状态才行。运行arm920t cp15 2 0和step指令,可以将MMU和Cache清除:

 > arm920t cp15 2 0
 2: 00000000
 > step
 target state: halted
 target halted in ARM state due to single step, current mode: Supervisor
 cpsr: 0x60000013 pc: 0x30001154
 MMU: disabled, D-Cache: disabled, I-Cache: disabled
 >

然后载入image(似乎只有用绝对路径才行):

 > load_image /home/derekhe/workspace/leds/leds_elf
 172 byte written at address 0x00000000
 downloaded 172 byte in 0.007424s
 >

然后开始运行:

 > resume 0x0

程序就开始运行,可见开发板上灯不停闪烁。




好,了解整个过程后,我们再来看看OpenJTAG怎么和GDB一起使用:

OpenOCD的GDB服务端在3333端口,可以在openocd.cfg里面配置。

重启开发板。在OpenOCD服务端运行的情况下,打开另外一个终端。在shell中输入:

 derekhe@ubuntu:~$ arm-linux-gdb

我使用的arm-linux-gdb是友善提供的交叉编译器里面的,版本比较新:

 GNU gdb (Sourcery G++ Lite 2008q3-72) 6.8.50.20080821-cvs
 Copyright (C) 2008 Free Software Foundation, Inc.
 License GPLv3+: GNU GPL version 3 or later
 This is free software: you are free to change and redistribute it.
 There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
 and "show warranty" for details.
 This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi".
 For bug reporting instructions, please see:
 .
 (gdb)

首先链接OpenOCD,输入:target remote localhost:3333

 (gdb) target remote localhost:3333
 Remote debugging using localhost:3333
 warning: while parsing target memory map (at line 2): Required element  is missing
 0x00000000 in ?? ()
 (gdb)

此时已经连接上远程调试服务器。我们来看看目前的状态,使用monitor poll来运行OpenOCD状态显示命令。

 (gdb) monitor poll
 target state: halted
 target halted in ARM state due to debug request, current mode: Supervisor
 cpsr: 0x60000013 pc: 0x30001150
 MMU: enabled, D-Cache: enabled, I-Cache: enabled
 (gdb)

此时可以看出MMU和Cache已经开启。下载程序前先停止程序并关闭MMU和Cache:

 (gdb) monitor halt
 (gdb) monitor arm920t cp15 2 0
 2: 00000000
 (gdb) monitor step
 (gdb) monitor poll
 target state: halted
 target halted in ARM state due to single step, current mode: Supervisor
 cpsr: 0x60000013 pc: 0x30001154
 MMU: disabled, D-Cache: disabled, I-Cache: disabled

此时MMU和Cache已经关闭。下面我们载入文件leds_elf文件:

 (gdb) file ~/workspace/leds/leds_elf
 A program is being debugged already.
 Are you sure you want to change the file? (y or n) y
 Reading symbols from /home/derekhe/workspace/leds/leds_elf...done.
 (gdb)

打开软件中断:

 (gdb) monitor arm7_9 sw_bkpts enable
 software breakpoints enabled
 (gdb)

将文件载入内存:

(gdb) load
Loading section .text, size 0xac lma 0x0
Start address 0x0, load size 172
Transfer rate: 20 KB/sec, 172 bytes/write.

重新从0x0开始运行:

 (gdb) monitor resume 0x0

此时会看到灯在闪烁了。




下面来看看如何在eclipse 3.5里面进行配置并调试

首先在工作目录~/workspace内创建一个gdbinit文件(名字可以随便取,这里为了以后好对应):

target remote localhost:3333
monitor halt
monitor arm920t cp15 2 0
monitor step
monitor arm7_9 sw_bkpts enable
load
monitor soft_reset_halt

打开eclipse,File->New->C Project,将工程取名为leds

screenshot-c-project

此时eclipse workspace没有任何文件:

screenshot-c-c-eclipse

将OpenJTAG附送的光盘里面的Ubuntu/examples/friendly-arm/leds内的所有文件拷贝到工作目录

screenshot-c-c-eclipse-1

此时按ctrl+B即可生成文件。

下面配置Debug相关参数:Run->Debug Configuration

screenshot-debug-configurations

双击C/C++ Application,会生成默认的leds default配置:

screenshot-debug-configurations-1

再C/C++ Application中填入生成的可执行文件:/home/derekhe/workspace/leds/leds_elf

screenshot-debug-configurations-5

选择Debugger,在新页中选择Debugger:gdbserver Debugger

调整gdb调整为arm-linux-gdb,GDB command file为~/workspace/gdbinit

screenshot-debug-configurations-3

选择connection,将type选择为TCP, host name or IP Address为localhost,port number为3333

screenshot-debug-configurations-4

在按debug按钮之前,请现在终端执行openocd进入等待模式。然后就可以按debug,此时会进入调试状态了。

screenshot-debug-leds-leds-c-eclipse_0

剩下的功能就和eclipse的基本使用一致了,这里不再阐述。

另外我发现一些问题,restart按钮不能用,提示:

Exception(s) occurred attempting to restart.

Target request failed: The "remote" target does not support "run".  Try "help target" or "continue".

The "remote" target does not support "run".  Try "help target" or "continue".

还不知道怎么配置eclipse使用另外的命令。

友善MINI2440配的群创7寸屏幕资料

  群创7寸液晶屏资料 (930.5 KiB, 263 hits)

中断控制器操作实例:外部中断

注:本源代码修改自《嵌入式Linux应用开发完全手册》第9章例程,以适用于友善之臂的MINI2440开发板。
整个程序需要关注的是按键的EINT位。由于MIN2440开发板的K1-K4使用的是EINT8、EINT11、EINT13、EINT14,所以必须要修改int.c对应的#define为:

/*
 * K1-K4对应GPG0、GPG3、GPG5、GPG6
 */
#define GPG0_eint    (2<<(0*2))		//EINT8
#define GPG3_eint    (2<<(3*2))		//EINT11
#define GPG5_eint    (2<<(5*2))		//EINT13
#define GPG6_eint    (2<<(6*2))		//EINT14

由于EINT位置不同,所以初始化irq的时候也需要进行修改,重点是EINTMASK寄存器的值。由于四个中断都连接在ARBITER1的REQ1,所以四个中断优先级相同:

/*
 * 初始化GPIO引脚为外部中断
 * GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD)
 */
void init_irq( )
{
    GPGCON  =  GPG0_eint | GPG3_eint | GPG5_eint | GPG6_eint;

    // 对于EINT8,11,13,14需要在EINTMASK寄存器中使能它们
    EINTMASK &= (~(1<<8)) & (~(1<<11)) & (~(1<<13)) & (~(1<<14));

    //EINT8,11,13,14优先级相同
    PRIORITY = 0x00 ;

    // EINT8,11,13,14使能
    INTMSK   &= (~(1<<5));
}

另外还需要修改的地方时interrupt.c中中断处理函数。由于这几个中断对应于INTPND的寄存器位[5],所以还得用EINTPEND来区分到底是那个中断源。

void EINT_Handle()
{
    unsigned long oft = INTOFFSET;
    unsigned long val;

    switch( oft )
    {
        case 5:
        {
            GPBDAT |= (0x0f<<5);   // 所有LED熄灭

            val = EINTPEND;
            if (val & (1<<8))
            	GPBDAT &= ~(1<<5);	//按K1 LED1亮
            if (val & (1<<11))
            	GPBDAT &= ~(1<<6);	//按K2 LED2亮
            if (val & (1<<13))
            	GPBDAT &= ~(1<<7);	//按K3 LED3亮
            if (val & (1<<14))
            	GPBDAT &= ~(1<<8);  //按K4 LED4亮

            if ((val & (1<<8)) && (val & (1<<11))) GPBDAT = 1;	//同时按K1K2,所有灯都两

            break;
        }

        default:
            break;
    }

    //清中断
    if( oft == 5 )
        EINTPEND = (1<<8) | (1<<11) | (1<<13) | (1<<14);   // EINT8_23合用IRQ5
    SRCPND = 1<

这样修改以后,就可以实现中断的正确响应了。
完整代码下载:

  Mini2440_Intrupt (3.4 KiB, 192 hits)

使用按键来控制LED

适用于MINI2440的实例3程序:修改自《嵌入式Linux应用开发完全手册》P84

MINI2440的LED和书中所说LED接口一致,分别是:

  • LED1,GPB5
  • LED2,GPB6
  • LED3,GPB7
  • LED4,GPB8

而按键不同,根据MINI2440的说明书和电路图可知:

  • K1, GPG0
  • K2, GPG3
  • K3, GPG5
  • K4, GPG6
  • K5, GPG7
  • K7, GPG11

而书中介绍的按键的通用输入输出口不一样,所以整个程序修改如下:

/* key_led.c */
#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)

#define GPGCON      (*(volatile unsigned long *)0x56000060)
#define GPGDAT      (*(volatile unsigned long *)0x56000064)

/*
 * LED1-4对应GPB5、GPB6、GPB7、GPB8
 */
#define GPB5_out        (1<<(5*2))
#define GPB6_out        (1<<(6*2))
#define GPB7_out        (1<<(7*2))
#define GPB8_out        (1<<(8*2))

/*
 * K1-K4对应GPG0、GPG3、GPG5、GPG6
 */
#define GPG0_in    ~(3<<(0*2))
#define GPG3_in     ~(3<<(3*2))
#define GPG5_in     ~(3<<(5*2))
#define GPG6_in     ~(3<<(6*2))

int main()
{
        unsigned long dwDat;
        // LED1-LED4对应的4根引脚设为输出
        GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;

        // K1-K4对应的4根引脚设为输入
        GPGCON = GPG0_in & GPG3_in & GPG3_in & GPG6_in;       

        while(1){
            //若Kn为0(表示按下),则令LEDn为0(表示点亮)
            dwDat = GPGDAT;             // 读取GPG管脚电平状态

            if (dwDat & (1<<0))        // K1没有按下
                GPBDAT |= (1<<5);       // LED1熄灭
            else
                GPBDAT &= ~(1<<5);      // LED1点亮

            if (dwDat & (1<<3))         // K2没有按下
                GPBDAT |= (1<<6);       // LED2熄灭
            else
                GPBDAT &= ~(1<<6);      // LED2点亮

            if (dwDat & (1<<5))         // K3没有按下
                GPBDAT |= (1<<7);       // LED3熄灭
            else
                GPBDAT &= ~(1<<7);      // LED3点亮

            if (dwDat & (1<<6))         // K4没有按下
                GPBDAT |= (1<<8);       // LED4熄灭
            else
                GPBDAT &= ~(1<<8);      // LED4点亮
    }

    return 0;
}

Mini2440开发板

前段时间买了个Mini2440开发板(见www.arm9.net),买的是MINI2440+7寸屏幕,在成都直接提货的,64M Flash的780块钱。

当时买这个玩意儿是因为有个哥哥说还是有必要了解一些这方面的知识,可以去搞一个平时玩玩。网上找了一圈还是觉得这个便宜实惠。最令我觉得感动的是说明书都写了500多页,网上也有持续的更新。所以我觉得厂商是很负责的态度来做这个事情的。当时看的时候在浙江,回来就买了一个。

拿回来第一件事就是连接LCD和开发板,很简单的。然后就是找了个USB转串口的转接线。可怜我的P35 NEO2 FR,看起来很华丽的主板,没有COM口,这让人很郁闷。用了转接线插上一看,哟,没反应。捣鼓了好一阵觉得转接线是不是有问题,最后以外之间把USB插了另外一个插口里面,再用PUTTY一连,霍霍,连上了开发板的BootLoader。

后几天就是看着说明书熟悉一下各种功能。最新版的说明书里面讲的东西需要最新的BootLoader支持,而我的那个板子里面的是今年4月份或者更老的BootLoader。我尝试把supervivi-64M的BootLoader写入到NAND中,但一写入就出现说vivi的size只有123k不够245k,无法写入。我后来尝试在删除了MTD分区的vivi分区和eboot分区,然后建立了一个大一点的vivi分区,就可以写入了。然后把开关变成NAND启动,开机按着开发板的任意一个键,电脑上就可以进入BootLoader操作了。

后来觉得怎么着这个也不方便,每次都要按着键,不爽。还是看怎么能够把NOR的BootLoader更新了。

刚开始我还走了弯路,以为H-JTAG还要买一个什么转接的东西。看了附录的SJF2440,按照步骤一操作,傻了,SFJ2440程序不支持我的SST的NOR Flash。刚开始我还以为怎么就那么倒霉呢,后来按照说明书的做法,把H-JTAG装上了。开发板提供的H-JTAG是一个LPT接口的一个小板子,幸亏我的笔记本有这个接口,要不然就郁闷死了,买一个能用的USB转LPT的不知道要多贵。

按照步骤一步一步的做下去,更新好了,很顺利。开机启动的时候也显示新的BootLoader界面了。

剩下玩的步骤也就是按照说明书的做点另外的东东啦。最终想看看QT 4.5能不能在上面跑起来。自带的Qtopia确实有点老了,Konquoer浏览器确实还是有点慢了。或者试试WINCE,看看上网效果如何,呵呵。

1
Return top