AMC 的设定

#define CONFIG_EBIU_AMGCTL_VAL 0xFF
#define CONFIG_EBIU_AMBCTL0_VAL 0×7BB07BB0
#define CONFIG_EBIU_AMBCTL1_VAL 0xFFC27BB0

AMBCTL1_VAL 中的 高4位的设定对外设有影响,也就是BANK3的设定


终于在超级终端里看到企鹅了,哈哈

        昨天晚上测试发现u-boot中的memmove复制内核到RAM中的过程中停止,初步判断为内存上的问题。经过一点一点的测试发现是0×20087之前的地址写的时候出错。今天从新编译了一下内核,把启动地址挪到了0×30000,小企鹅终于在超级终端里出现了,有点小激动。


Linux2.6内核TouchScreen驱动移植

在 linux2.6.14.1 中没有提供 s3c2410 的驱动,所以我们要新建驱动文件,从网上下载s3c2410_ts.c与s3c2410_ts.h两个文件,将s3c2410_ts.c 文件拷到 linux2.6.14.1/drivers/input/touchscreen 目录下,头文件则拷到源码包的include/asm/arch下,
   首先:我们需要修改 linux2.6.14/drivers/input/touchscreen 目录下的 makefile 文件,在文件的最后添加 :

obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o

第二:我们需要修改 linux2.6.14/ drivers/input/touchscreen/Kconfig 中添加:

     config TOUCHSCREEN_S3C2410

     tristate “Samsung S3C2410 touchscreen input driver”

     depends on ARCH_SMDK2410 && INPUT && INPUT_TOUCHSCREEN

     select SERIO

     help

     Say Y here if you have the s3c2410 touchscreen.

     If unsure, say N.

     To compile this driver as a module, choose M here: the

     module will be called s3c2410_ts.

    

config TOUCHSCREEN_S3C2410_DEBUG

     boolean “Samsung S3C2410 touchscreen debug messages”

     depends on TOUCHSCREEN_S3C2410

     help

     Select this if you want debug messages

修改完成以后,在我们配置内核的时候,就会增加关系s3c2410的触摸屏配置,我们选择上这些配置就可以把驱动增加进去了

Device drivers –>

          Input device support –>

                     Touchscreens –>

                      <*>Samsung S3C2410 touchscreen input driver

                      []Samsung s3c2410 touchscreen debug message

第三:在 /linux-2.6.14/arch/arm/mach-s3c2410/mach-smdk2410.c, 中增加如下内容:

#include <asm/arch/s3c2410_ts.h>

     static struct s3c2410_ts_mach_info s3c2410_ts_cfg __initdata = {

     .delay = 10000,

     .presc = 49,

     .oversampling_shift = 2,

     };

     在smdk2410_devices结构中,添加:

     &s3c_device_ts,

     在smdk2410_map_io函数中添加:

     set_s3c2410ts_info(&s3c2410_ts_cfg);

第四:在 /linux-2.6.14/ arch/arm/mach-s3c2410/devs.h 文件中添加:

     extern struct platform_device s3c_device_ts;

第五:在arch/arm/mach-s3c2410/devs.c文件中添加如下几行:

    /* Touchscreen */

#include <asm/arch/s3c2410_ts.h>

    static struct s3c2410_ts_mach_info s3c2410ts_info;

    void __init set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
{

memcpy(&s3c2410ts_info,hard_s3c2410ts_info,sizeof(struct s3c2410_ts_mach_info));

}

EXPORT_SYMBOL(set_s3c2410ts_info);

struct platform_device s3c_device_ts = {

.name = “s3c2410-ts”,

.id = -1,

.dev = {

.platform_data = &s3c2410ts_info,

}

};

EXPORT_SYMBOL(s3c_device_ts);

以上是参考网上的文章的,但仅此还不够,编译内核会出错,出错信息如下:
[arm@localhost linux-2.6.14.1]$ make zImage
  CHK     include/linux/version.h
make[1]: `include/asm-arm/mach-types.h’ is up to date.
  CHK     include/linux/compile.h
  CHK     usr/initramfs_list
  CC      drivers/input/touchscreen/s3c2410_ts.o
drivers/input/touchscreen/s3c2410_ts.c: In function `touch_timer_fire’:
drivers/input/touchscreen/s3c2410_ts.c:137: error: called object is not a function
drivers/input/touchscreen/s3c2410_ts.c:146: error: called object is not a function
drivers/input/touchscreen/s3c2410_ts.c: In function `stylus_action’:
drivers/input/touchscreen/s3c2410_ts.c:189: error: called object is not a function
drivers/input/touchscreen/s3c2410_ts.c:193: error: called object is not a function
drivers/input/touchscreen/s3c2410_ts.c: In function `s3c2410ts_probe’:
drivers/input/touchscreen/s3c2410_ts.c:254: error: called object is not a function
drivers/input/touchscreen/s3c2410_ts.c: In function `touch_timer_fire’:
drivers/input/touchscreen/s3c2410_ts.c:137: warning: statement with no effect
drivers/input/touchscreen/s3c2410_ts.c:146: warning: statement with no effect
drivers/input/touchscreen/s3c2410_ts.c: In function `stylus_action’:
drivers/input/touchscreen/s3c2410_ts.c:189: warning: statement with no effect
drivers/input/touchscreen/s3c2410_ts.c:193: warning: statement with no effect
drivers/input/touchscreen/s3c2410_ts.c: In function `s3c2410ts_probe’:
drivers/input/touchscreen/s3c2410_ts.c:254: warning: statement with no effect
make[3]: *** [drivers/input/touchscreen/s3c2410_ts.o] Error 1
make[2]: *** [drivers/input/touchscreen] Error 2
make[1]: *** [drivers/input] Error 2
make: *** [drivers] Error 2
在网上搜也找不到解决方法,后来又搜到了一篇触摸屏驱动移植的文章,里面有说要新建regs-adc.h这个头文件的(言下之意他的linux2.6里没有这个),但我的里面有这个文件,经过对比,发现这个头文件里的一句:#define S3C2410_ADCTSC_XY_PST(x) (((x)&0×3)<<0),而我的2.6里自带的是#define S3C2410_ADCTSC_XY_PST (0×3<<0),改过之后,终于通过了,进入控制台后可以触摸了,并且可以看到这个触摸屏驱动在内核注册为 /dev/input/mouse0


Linux2.6内核LCD驱动移植

linux2.6.14 已经包含了 lcd 的驱动程序,驱动程序位于 /linux-2.6.14/drivers/video/ 目录下,文件名是 s3c2410fb.c, 头文件是

s3c2410fb.h. 在这里可以不研究这个文件。只要对 lcd 进行以下初始化就可以了。

    打开 /linux-2.6.14/arch/arm/mach-s3c2410/mach-smdk2410.c, 在这个文件里增加包含文件:

    #include    fb.h

       然后增加 LCD 初始化的代码,

    static struct s3c2410fb_mach_info hfrk_lcdcfg __initdata = {

        .fixed_syncs=       0,

        .regs={

            .lcdcon1=   S3C2410_LCDCON1_TFT16BPP | \

                        S3C2410_LCDCON1_TFT | \

                        S3C2410_LCDCON1_CLKVAL(6),

 

            .lcdcon2=   S3C2410_LCDCON2_VBPD(2) | \

                        S3C2410_LCDCON2_LINEVAL(319) | \

                        S3C2410_LCDCON2_VFPD(0) | \

                        S3C2410_LCDCON2_VSPW(4),

 

            .lcdcon3=   S3C2410_LCDCON3_HBPD(47) | \

                        S3C2410_LCDCON3_HOZVAL(239) | \

                        S3C2410_LCDCON3_HFPD(15),

 

            .lcdcon4=   S3C2410_LCDCON4_MVAL(1) | \

                        S3C2410_LCDCON4_HSPW(31),

 

            .lcdcon5=   S3C2410_LCDCON5_FRM565 | \

                        S3C2410_LCDCON5_INVVLINE | \

                        S3C2410_LCDCON5_HWSWP,

        },

        .lpcsel=    0×0,

        .gpccon=    0xaaaaaaaa,

        .gpccon_mask=   0xffffffff,

        .gpcup=     0xffffffff,

        .gpcup_mask=    0xffffffff,

        .gpdcon=    0xaaaaaaaa,

        .gpdcon_mask=   0×0,

        .gpdup=     0xffffffff,

        .gpdup_mask=    0xffffffff,

        .width=     240,

        .height=    320,

        .xres=      {240,240,240},

        .yres=      {320,320,320},

        .bpp=       {16,16,16},

    };

    static void __init sdmk2410_init(void)

    {

        set_s3c2410fb_info(&hfrk_lcdcfg);

    }

       在系统初始化中增加对 lcd 的初始化。

    MACHINE_START(SMDK2410, “SMDK2410″) /* @TODO: request a new identifier and switch

                    * to SMDK2410 */

        /* Maintainer: Jonas Dietsche */

        ……

        .map_io     = smdk2410_map_io,

        .init_irq   = smdk2410_init_irq,

        .init_machine   = sdmk2410_init, /* 这一句是新增加的*/

        .timer      = &s3c24xx_timer,

    MACHINE_END

       重新保存这个文件,现在需要重新进入配置菜单,检查一下 LCD 的相关选项是否选上, [Device Drivers->Graphics support->] 这

个配置菜单下面是相关 LCD 的配置。回到根目录下,输入 make 编译内核,重现烧写内核到开发板,再次启动 linxu2.6.14 以后就可以在

lcd 上看到一个小的企鹅。我们的 lcd 驱动已经移植完成了。


Linux2.6内核CS8900驱动移植

1.下载用于2.6内核的cs8900.c,cs8900.h两个文件,并拷贝到drivers/net目录下

2.修改Drivers/net/Kconfig,增加以下内容:
  config ARM_CS8900
     tristate “CS8900 support”
      depends on NET_ETHERNET && ARM && ARCH_SMDK2410
      help
       Support for CS8900A chipset based Ethernet cards. If you have a
      network (Ethernet) card of this type, say Y and read the
      Ethernet-HOWTO, available from
      <http://www.tldp.org/docs.html#howto> as well as
      <file:Documentation/networking/cs89×0.txt>.
          To compile this driver as a module, choose M here and read
      <file:Documentation/networking/net-modules.txt>.
          The module will be called cs8900.o.

3.修改Drivers/net/Makeflie,增加以下内容:
  obj-$(CONFIG_ARM_CS8900)    += cs8900.o

4.把smdk2410.h(新建)拷贝到include/asm-arm/arch-s3c2410目录下
smdk2410.h的内容为 :
#ifndef _INCLUDE_SMDK2410_H_
#define _INCLUDE_SMDK2410_H_
#include <linux/config.h>
#define pSMDK2410_ETH_IO        0×19000000
#define vSMDK2410_ETH_IO        0xE0000000
#define SMDK2410_ETH_IRQ         IRQ_EINT9
#endif // _INCLUDE_SMDK2410_H_

4+.参照开发板提供的2.4内核源码中的include/asm/arch/smdk.h文件,发现不同之处,把vSMDK2410_ETH_IO改为0xD0000000

5.修改arch/arm/mach-s3c2410/mach-smdk2410.c
在static struct map_desc smdk2410_iodesc[] __initdata内增加以下部分(本来为空):
         {vSMDK2410_ETH_IO, pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE},
以及增加包含头文件asm/arch/smdk2410.h  (asm和arch实际上只是个根据配置而形成的”符号链接”,有箭头的文件夹,其实是分别指向asm-arm和arch-s3c2410两个文件的)

6.此外,还要修改cs8900.c中的cs8900_probe()函数,在其中找到memset (&priv,0,sizeof (cs8900_t));这句,并在其后添加如下两条语句:
__raw_writel(0×2211d110,S3C2410_BWSCON);
__raw_writel(0×1f7c,S3C2410_BANKCON3);
(添加这两句的原因及思路见下面的参考文献)
再在前面加上包含头文件语句
include “asm/arch/regs-mem.h”

7.在内核配置中选上:
    Device Drivers..>
          Network device support…>
                  Ethernet (10 or 100 Mbit)
                       [*] CS8900 support.

参考:http://loveuzz.bokee.com/1955634.html
cs8900a驱动移植笔记
硬件环境:SBC-2410X开发板(CPU:S3C2410X)
内核版本:2.6.11.1
运行环境:Debian2.6.8
交叉编译环境:gcc-3.3.4-glibc-2.3.3
第一部分 网卡CS8900A驱动程序的移植
一、从网上将Linux内核源代码下载到本机上,并将其解压:
#tar jxf linux-2.6.11.1.tar.bz2
二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。
(1)指定目标平台。
 移植前:
        ARCH?= $(SUBARCH)
 移植后:
 ARCH            :=arm
(2)指定交叉编译器。
  移植前:
 CROSS_COMPILE  ?=
 移植后:
 CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu-
注:这里假设编译器就放在本机的那个目录下。
三、添加驱动程序源代码,这涉及到以下几个方面。(1)、从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。
#cp cs8900.c  ./drivers/net/arm/
#cp cs8900.h  ./drivers/net/arm/
并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句:
__raw_writel(0×2211d110,S3C2410_BWSCON);
__raw_writel(0×1f7c,S3C2410_BANKCON3);
注:其原因在”第二部分”解释。
(2)、修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容:
Config ARM_CS8900
   tristate “CS8900 support”
 depends on NET_ETHERNET && ARM && ARCH_SMDK2410
 help
   Support for CS8900A chipset based Ethernet cards. If you have a network (Ethernet) card of this type, say Y and read the  Ethernet-HOWTO, available from  as well as .
   To compile this driver as a module, choose M here and read
.  The module will be
   called cs8900.o.
注:内核系统配置文件由2.4版本的config.in变成了2.6版本Kconfig文件,在这个文件里面添加如上内容,则在运行make menuconfig或者make xconfig命令的时候就会出现:
        [ ]   CS8900 support 
这一选项。
(3)、修改drivers/net/arm/目录下的Makefile文件,在最后添加如下内容:
obj-$(CONFIG_ARM_CS8900)    += cs8900.o
注:2.6版本内核的Makefile文件也与2.4版本的有所不同。添加以上语句,就会使内核在编译的时候根据配置将cs8900A的驱动程序以模块或静态的方式编译到内核当中。
(4)、在/arch/arm/mach-s3c2410/mach-smdk2410.c文件中,找到smdk2410_iodesc[]结构数组,添加如下如下内容:{vSMDK2410_ETH_IO, 0×19000000, SZ_1M, MT_DEVICE}
修改之后变成了:
 static struct map_desc smdk2410_iodesc[] __initdata = {
       /* nothing here yet */
        /* Map the ethernet controller CS8900A */        {vSMDK2410_ETH_IO, 0×19000000, SZ_1M, MT_DEVICE}
};
  注:由于在驱动程序的开发的时候,在驱动程序当中所用到的跟设备有关的地址都是虚拟地址,也就是说驱动程序操作的都是虚拟地址,那么要使驱动程序对设备的 操作反映到设备上去,就得将设备的物理地址映射到正确的虚拟地址上去,从而保证驱动程序对虚拟地址的操作也就是对相应的物理地址操作。以上添加的语句就是 为了将网卡的物理地址(0×19000000)映射到vSMDK2410_ETH_IO所指向的虚拟地址上去,上面的结构还定义了网卡虚拟地址所占用的区 间,也就是从vSMDK2410_ETH_IO开始的SZ_1M大小的去间,并指定了该区间所指向的域(的属性)。(疑问:在本开发板上,网卡占用的是 CPU的nGCS3片选信号,也就是在Bank3,根据处理器的地址空间定义,这个地址应该是0×18000000,为什么这里使用的是 0×19000000?查找到2.4.18的内核当中,也是用0×19000000来进行映射。)
(5)、在include/asm-arm/arch-s3c2410/目录下创建smdk2410.h文件,其内容为:
#ifndef _INCLUDE_SMDK2410_H_
#define _INCLUDE_SMDK2410_H_
#include
#define pSMDK2410_ETH_IO         0×19000000
#define vSMDK2410_ETH_IO  0xE0000000
#define SMDK2410_ETH_IRQ   IRQ_EINT9
#endif // _INCLUDE_SMDK2410_H_
注:因为在网卡驱动程序当中,用到了一些常量,所以特意在此添加这个头文件。这个头文件定义了网卡的物理地址、虚拟地址以及网卡占用的中断线。
四、配置、编译内核。在内核顶层目录当中键入:
  #make smdk2410_defconfig
由于2.6的内核默认就支持了S3C2410,所以就有一个默认的内核配置文件。里面只是包括了一个简单的配置,要使网卡编译进内核,还要进行手工配置。
#make menuconfig
       Networking support  —>  
Ethernet (10 or 100Mbit)  —>
[*]   CS8900 support
将刚才添加的网卡驱动程序静态添加到内核当中。
最后进行内核编译。
#make
然后将镜像下载到开发板中去。
第二部分 问题解析
在移植网卡的过程中,并不是一帆风顺的,整个过程遇到了问题虽然不多,但是去寻找问题的原因及解决的办法的时候却是非常曲折的。现在将本人在进行网卡驱动移植过程中所遇到的问题以及解决方法介绍如下。
因 为经验不足,刚开始进行工作的时候,没有将移植的思路明确。最先是打算将开发板供应商随板提供的2.4.18内核下的驱动程序cs8900a.c移植到 2.6.10的内核下。首先就是计划先以编译模块的方式将该程序编译通过之后,再将起编译到2.6.10的内核当中,然后再对其进行逻辑上的修改。在模块 编译该驱动程序的时候,首先碰到的问题就是头文件的问题,根据编译的出错信息,挨个将头文件添加好了。此时碰到的问题就是交叉编译器(arm- s3c2410-linux-gnu-gcc)编译到cs89×0_probe()函数的时候出错。指向:BWSCON这一行,出错信息是:
Incorrect Lvalue in assignment
后 来查阅内核源代码,跟踪BWSCON的定义,其实它是指向一个常量地址的指针。在用2.95.3的交叉编译器对其进行编译的时候不会出错,而用3.3.4 的交叉编译器进行便宜的时候却出错,于是怀疑是跟编译器有关。将对BWSCON和BANKCON3的赋值操作这两条语句注释掉之后就不会报错,所以肯定了 在3.3.4版本的交叉编译器不支持这样的操作。原来以为这两条语句是对别的某个寄存器进行的操作,对网卡驱动没什么影响,于是就将注释之后的驱动程序加 入到2.6.10的内核当中进行编译,并下载到开发板当中。这个时候从串口打回控制台的出错消息是在很长时间内都无法解决的。如下:
Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)
         eth0: incorrect signature 0×1005
mice: PS/2 mouse device common for all mice
NET: Registered protocol family 2
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
NET: Registered protocol family 1
IP-Config: Device `eth0′ not found.
Looking up port of RPC 100003/2 on 192.168.0.1
RPC: sendmsg returned error 101
portmap: RPC call returned error 101
Root-NFS: Unable to get nfsd port number from server, using default
Looking up port of RPC 100005/1 on 192.168.0.1
RPC: sendmsg returned error 101
portmap: RPC call returned error 101
Root-NFS: Unable to get mountd port number from server, using default RPC: sendmsg returned error 101
mount: RPC call returned error 101
Root-NFS: Server returned error -101 while mounting /friendly-arm/root
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device “nfs” or unknown-block(2,0)
Please append a correct “root=” boot option
Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
     观察串口打印的信息,发现vivi正确启动了内核,内核也对cpu进行了初始化,但是网卡就是无法驱动起来。核对驱动程序源代码,发现在内核初始化网卡 时,运行到了cs89×0_probe1()函数的时候,探测网卡的ProductID的时候读回的数据不是网卡的ID:0×630e。也就是没探测到网 卡而退出了cs89×0_probe1()函数。当时怀疑的是2.4.18的驱动程序跟2.6.10的设备驱动程序写法有很多不同,如果继续这样的工作, 也许工作量很大,所以马上转变了工作思路,决定从网上下载2.6的CS8900A的驱动程序,在搜索了很长时间之后,终于在一个网站上下载到了2.6.7 内核下的CS8900A的驱动程序。按照”第一部分”的步骤加进了驱动之后,下载新的内核,串口回传的信息跟上面的信息是一样的。
重新启动开发板,问题依然存在,但是仔细对比了cs89×0_probe1()函数读回来的数据,发现这个signature在变化,而且没有找到其变化的规律。
查 看了驱动程序以及CS8900A的Datasheet,发现驱动程序的逻辑是正确的,于是首先怀疑是在驱动程序中,网卡iobase的物理地址不对,于是 查看开发板的原理图,发现网卡用的是cpu的nGCS3片选信号,该片选信号对应的地址空间起始地址是0×18000000,而在驱动中对用的是 0×19000000,于是修改arch/arm/mach-s3c2410/mach-smdk2410.c文件中的mdk2410_iodesc[] 结构对io地址的映射,将物理地址改为0×18000000,重新编译后网卡仍然无法被驱动,只是这个时候驱动程序读来的数据也就是那个 signature不会因为每次重起而改变的,也就是每次读回来的数据都是固定的。这时又怀疑是虚拟地址不正确。将2.6的驱动与2.4的驱动进行了比 较,发现2.4用的 虚拟地址是0xd000000,于是修改2.6内核中的虚拟地址为0xe000000,可是网卡还是无法驱动,反复修改了虚拟地址和物理地址,问题依旧存 在。这个时候思路几乎停止。经过思考之后,把工作的思路定位在比较2.4和2.6的驱动程序的区别上,经过仔细的比较,发现在2.4的驱动程序当中在 cs89×0_probe1()函数里有对寄存器的设置,而2.6的驱动程序则没有,查找cpu的Datasheet,发现该设置是对cpu内部两个重要 的控制器的设置。下面先介绍一下这两个寄存器。
在S3C2410X中BWSCON是Bus width & wait control register(总线宽度及等待控制寄存器),这个寄存器控制着系统地址空间内(包括bank0-bank7)的总线数据宽度以及是否等待。 BANKCONn(n=0~7)寄存器是Bank control register。这个寄存器控制着处于某个bank区间内的总线的地址setup的时钟周期,片选信号的保持时间,访问周期等。这个两个寄存器中每个位 的含义可以参见S3C2410X数据手册的5-13~5-15,在此不加以详叙。
查看了cpu的数据手册、开发板原理图以及2.4的驱动程序之后,发现在2.4的驱动程序中的以下两条语句:
BWSCON = (BWSCON & ~(BWSCON_ST3 | BWSCON_WS3 | BWSCON_DW3)) |  (BWSCON_ST3 | BWSCON_WS3 | WSCON_DW(3, BWSCON_DW_16));
BANKCON3= BANKCON_Tacs0 | BANKCON_Tcos4 | BANKCON_Tacc14 | BANKCON_Toch1 | BANKCON_Tcah4 | BANKCON_Tacp6 | BANKCON_PMC1;
实际上是对地址区间BANK3(因为开发板用的的是nGCS3,处于BANKCON3区间内)进行了设置。
先 看对BWSCON的设置,这条语句实际上是要使BWSCON中除了ST3、WS3和DW3这四个位的其它各位得到保护,使ST3、WS3和DW3这四个位 清零,然后再对ST3、WS3和DW3这四个位进行设置,经过这条语句之后,ST3、WS3和DW3这四个位被设置成了1101(二进制),意思就是对 BANK3采用cpu引脚(A17、B16、C15、A16,这几个引脚都分别有三种信号表示意义)的nBE信号(具体什么意思,本人也不知道),对 BANK3使用WAIT enable,使用16位的数据总线宽度。
其次就是对BANKCON3寄存器的设置。这条语句将BANKCON3设置成了0001 1111 0111 1100。(各个位的意思,我也没弄明白什么意思,估计就是设置各种操作的时钟周期数目。)
清楚了驱动程序对寄存器的设置之后,就想到应该在vivi里面对cpu的这几个内存控制寄存器进行设置,于是找到vivi源代码中include/platform/目录下的smdk.h文件中对寄存器的初始化值的设置,修改之后如下:
/*#define vBWSCON               0×22111120*/
#define vBWSCON                 0×2211d110
#define vBANKCON0               0×00000700
#define vBANKCON1               0×00000700
#define vBANKCON2             0×00000700
#define vBANKCON3               0×00001f7c
#define vBANKCON4             0×00000700
#define vBANKCON5               0×00001f7c
#define vBANKCON6               0×00018005
#define vBANKCON7               0×00018005
#define vREFRESH                0×008e0459
#define vBANKSIZE               0xb2
#define vMRSRB6                 0×30
#define vMRSRB7                 0×30
重 新通过JTAG口下载vivi,重新启动内核后,发现问题依然存在,于是就想到在驱动程序里面添加对内存控制器的设置。最开始是想模仿2.4的驱动程序那 样,找到各个相应的宏去代替2.4驱动程序里的宏,在memset()函数之前添加,但是编译的时候出错,出错信息是:
LValue incorrect in assignment
跟踪内核的代码发现对S3C2410_BWSCON、S3C2410_BANKCON3宏的定义分别返回的其实是一个常量,分别是0xf0100000和0xf0100010,这个常量是右值,不能当左值。因此就想到采用如下直接对地址进行赋值的方式对寄存器进行设置:
*(volatile unsigned short __force *)(0xf0100000)=(0×2211d110);
*(volatile unsigned short __force  *)(0xf0100010)=(0×00001f7c);
后来运行内核时发现,驱动程序初始化到了memset()函数之后,上述两条语句之前就停止不动了(疑问:不知道这是什么原因)。最后查找linux内核代码找到了__raw_writell(v,a)这样一个函数,于是就将上述两条语句替换成:
__raw_writel(0×2211d110,S3C2410_BWSCON);
__raw_writel(0×1f7c,S3C2410_BANKCON3);
这样经过设置内存控制寄存器之后,网卡终于被驱动起来了。但是由于在移植的过程中没有将内核对devfs设备文件系统的支持编译进内核里面去,所以当网卡驱动之后去寻找网络文件系统的时候发现找不到根文件系统,最后在配置内核的时候将devfs的支持加入,如下:
File systems  —> 
  Pseudo filesystems  —>
     [*] /dev file system support (OBSOLETE)
之后,linux可以从主机上找到根文件系统,并创建init进程。这样,网卡驱动程序经过接近三周的时间终于被驱动了!


TFTP下载成功了

    今天,主要测试TFTP网络下载主机上的uImage文件。

    首先,在主机上安装了TFTP服务器,在uClinux-dist下粗略编译了一个uImage,生成的命令:

     >make menuconfig    // 进入设定模式

     >make

生成elf格式的linux文件,再执行:

bfin-uclinux-objcopy -O binary linux linux.bin   生成二进制格式文档
gzip -9 linux.bin   压缩二进制文件
bfin-uclinux-mkimage -A blackfin -O linux -T kernel -C gzip -a 0×1000 -e 0×1000 -n “Bfin uClinux Kernel” -d linux.bin.gz uImage  生成压缩的镜像文件
bfin-uclinux-mkimage -A blackfin -O linux -T kernel -C none -a 0×1000 -e 0×1000 -n “Bfin uClinux kernel” -d linux.bin uImage     生成解压缩的镜像文件

将uImage 复制到主机的TFTP_ROOT目录下。

    关闭主机的防火墙软件。

    然后,启动目标板上,进入U-BOOT,先ping一下主机,alive就OK了,不然要设定一下IP。接下来执行

> tftp 0×1000000 uImage  
> protect off all
> erase 0×20040000 0×207FFFFF
> cp.b 0×1000000 0×20040000 $(filesize)
> setenv bootcmd bootm 0×20040000
> save
> reset

重新启动后到验证OK系统就停了,不知道为什么,再继续研究了。

周小结

    本周完成了:

     系统硬件的假设,和开发环境的调试;

     U-BOOT 改造研究基本测试完成;

      uClinux-dist简单编译通过,并测试了TFTP下载镜像文件的功能。

    产生的问题:

    uImage 在系统板上工作后,超级终端上无显示。

    uClinux-dist 定制需要添加CS8900的网口驱动,不知道驱动程序如何修改。


把CS8900搞工作了

1)CS8900_BASE 没有+上300

2)CPLD的寄存器没有设定

3)参考文章里的C= XXXXXXX那些确实要屏掉,应为板子的A0是直接接地,没有接到那个控制信号上

明天开始攻坚uClinux的编译


FLASH TE28F640 替换 29W320 u-boot的修改

bf561-ezkit.h 中

屏蔽掉#define CFG_FLASH_CFI_AMD_RESET

CFG_MAX_FLASH_SECT定义为64

CFG_ENV_SECT_SIZE定义为0×20000

 编译烧入系统后启动,上电后会有个CRC的warning, 执行saveenv就能消除


硬件环境终于建设好了

    今天快递寄到了新的仿真器了,用逻辑分析仪先测试了一下接口OK,避免了昨天的郁闷。连上目标板,用VDSP测试OK。顺便又测试了一下闪灯程序,一切顺利。

      移植U-BOOT,超级终端上始终空白,用串口测试程序测试串口,工作正常。本来想用LDRVIEVER尝试的,提示检查BMODE设置。于是乎又把ADSP-BF561的规格书翻出来看了一下,原来外部FLASH启动是选00,重新上电,超级终端上终于出现了久违的U-BOOT欢迎界面。有点小小激动,不过CS8900的驱动修改似乎还是没有成功,明天再研究了。

    终结一下U-BOOT的下载过程,交叉编译产生u-boot.hex, 用datamaker 转换成u-boot.dat, 在VDSP中打开flash项目,填充到内存中,RUN项目。烧录完成,从新上电,u-boot可以正常工作。


u-boot 命令说明

Printenv 打印环境变量。

Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
Environment size: 80/8188 bytes

Setenv 设置新的变量

Uboot> setenv myboard AT91RM9200DK
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
myboard=AT91RM9200DK
Environment size: 102/8188 bytes

Saveenv 保存变量

命令将当前定义的所有的变量及其值存入flash中。用来存储变量及其值的空间只有8k字节,应不要超过。

Loadb 通过串口Kermit协议下载二进制数据。

Tftp 通过网络下载程序,需要先设置好网络配置

Uboot> setenv ethaddr 12:34:56:78:9A:BC
Uboot> setenv ipaddr 192.168.1.1
Uboot> setenv serverip 192.168.1.254     (tftp服务器的地址)
下载bin文件到地址0×20000000处。
Uboot> tftp 20000000 application.bin (application.bin应位于tftp服务程序的目录)

Uboot> tftp 32000000 vmlinux
把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。

Md 显示内存区的内容。

Mm 修改内存,地址自动递增。

Nm 修改内存,地址不自动递增。

Mw 用模型填充内存

mw 32000000 ff 10000(把内存0×32000000开始的0×10000字节设为0xFF)

Cp 拷贝一块内存到另一块

Cmp 比较两块内存区

这些内存操作命令后都可加一个后缀表示操作数据的大小,比如cp.b表示按字节拷贝。

Protect 写保护操作

protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护)
protect off 1:0-3取消写保护

Erase 擦除扇区。

erase: 删除FLASH的扇区
erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)

对DataFlash的操作

U-Boot在引导时如果发现NPCS0和NPCS3上连有DataFlash,就会分配虚拟的地址给它,具体为 :
0xC0000000—NPCS0
0xD0000000—NPCS3

run 执行设置好的脚本

Uboot> setenv flashit tftp 20000000 mycode.bin\; erase 10020000 1002FFFF\;
cp.b 20000000 10020000 8000
Uboot> saveenv
Uboot> run flashit

bootcmd 保留的环境变量,也是一种脚本

如果定义了该变量,在autoboot模式下,将会执行该脚本的内容。

Go 执行内存中的二进制代码,一个简单的跳转到指定地址

Bootm 执行内存中的二进制代码

要求二进制代码为制定格式的。通常为mkimage处理过的二进制文件。
起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000

Bootp 通过网络启动,需要提前设置好硬件地址。

得到所有命令列表

help help usb, 列出USB功能的使用说明

ping 注:只能开发板PING别的机器

usb

usb start: 起动usb 功能
usb info: 列出设备
usb scan: 扫描usb storage(u 盘)设备

kgo 起动没有压缩的linux内核

kgo 32000000

fatls 列出DOS FAT文件系统

fatls usb 0列出第一块U盘中的文件

fatload 读入FAT中的一个文件

fatload usb 0:0 32000000 aa.txt 把USB中的aa.txt 读到物理内存0×32000000处!

flinfo 列出flash的信息

nfs

nfs 32000000 192.168.0.2:aa.txt
把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0×32000000处。