如何基于ARMSYS在uClinux下移植RTL8019的驱动

发 布 时 间 : 2008-11-17 来 源 : 本站原创 作 者 : 立宇泰电子 浏 览 :

Bug修正(04-12-12):请将Bootloader中对Eint3的设置改为上升沿触发!

1.概述 44B0 S3C44B0X uClinux 8019 RTL8019 ARM ARM7

    本文描述了如何在以S3C44B0X为核心的ARMSYS开发板的基础上建立uClinux下的RTL8019以太网控制器的驱动。点击这里下载本文的pdf文件。
uclinux 8019 44b0 uclinux 8019 44b0 uclinux 8019 44b0 uclinux 8019 44b0 uclinux 8019 44b0 

1.1关于RTL8019

   RTL8019是高度集成的以太网控制器,为即插即用式NE2000兼容网络适配器提供了简易的解决方案。
参考ARMSYS配套提供的电路原理图,可以了解RTL8019与S3C44B0X处理器的接口电路连接。注意到电路中采用了RTL8019的中断输出INT0(4脚)与S3C44B0X的EINT3(外部中断源3)连接。
    RTL8019可以以中断的方式与来报告自身的工作状态,如发送数据包成功、接收到新的数据包、出错异常中断等。S3C44B0X在收到EINT3中断后,进入相应的中断处理程序后,对RTL8019内部寄存器ISR的值进行读取,从而判断是什么引发了中断。下面是ISR中断状态寄存器的位定义:

ISR:中断状态寄存器(地址07H,位于第0页,可读写)

这个寄存器反应了网卡的状态,通过读取该寄存器可以了解究竟是什么引发了中断。

位 符号 描述
7 RST 如果NIC进入复位状态,该位置1,在启动命令写入CR寄存器时,该位清0,在接收缓冲区时该位置1,
           如果一个或多个包从缓冲区中读出,该位清0。
6 RDC 如果远程DMA操作完成,该位置1。
5 CNT 如果1个或多个网络标签计数器的最高位置1,该位置1。
4 OVW 如果接收缓冲器溢出,该位置1。
3 TXE 如果在数据发送过程中发生了过多的冲突,发送就会停止,且该位置1。
2 RXE 如果在接收数据中发生了如下错误,该位置1-CRC错误-帧对齐错误-包丢失
1 PTX 这个位表示数据包被无错发送。
0 PRX 这个位表示数据包被无错接收。

    这也正是uClinux下驱动以太网控制器RTL8019工作的原理。UClinux中已经包含了对RTL8019及其NE2000兼容以太网控制器的支持,我们只需要进行适当的配置,同时再针对ARMSYS的特殊电路结构做一些修改,即可完成对RTL8019的移植。在本文的最后,我们将运行一个ping诊断工具,来检测移植是否成功。

2.准备工作

2.1解压uClinux移植包


    采用uClinux在ARMSYS上的移植包:uClinux-ARMSYS-20040801.tar.gz来完成移植的工作。
uClinux-ARMSYS-20040801.tar.gz是移植自uClinux-dist-20040408.tar.gz,在很多方面比早先的20030522版本要完善很多,这也使我们的工作变得方便很多。这里我们使用的内核版本是Linux 2.4.24。
将uClinux-ARMSYS-20040801.tar.gz拷贝到/home/下,运行解压:

tar xvzf uClinux-ARMSYS-20040801.tar.gz

解压结束后会在/home/下生成uClinux-dist目录。

2.2安装编译环境

将arm-elf-tools-20030314.sh拷贝到根目录,运行安装:

sh arm-elf-tools-20030314.sh

2.3更新Bootloader

download/default.asp处下载最新的uClinux专用Bootloader(更新日期:2004-10-8)文件。
最新的Bootloader做了两处修改:
(1) 将romfs.img定位在0xc400000地址处;
(2) 将EINT3(外部中断源3)改为上升沿触发。

采用ARMSYS配套的flash烧录工具来烧录最新的Bootloader二进制文件44bapp.bin;
如果你的开发板上已经烧录了uClinux专用Bootloader,则可以按照以下的步骤烧录:
a. 复位开发板,选择项目“1.使用USB下载器下载代码到SDRAM.”;
b. 输入地址:0xc200000,按回车;
c. 用USB下载器下载新Bootloader的二进制文件44bapp.bin;
d. 下载成功后,再次选择项目“1.使用USB下载器下载代码到SDRAM.”;
e. 输入地址:0xc008000,或直接按下回车;
f. 用USB下载器下载flashprgm文件夹中的44bapp.bin;
g. 下载成功后,选择项目“5.从特定地址处开始运行.”;
h. 输入地址:0xc008000,或直接按下回车;
i. 这时开始运行flashprgm烧录程序;超级终端上询问是否开始烧录,在PC键盘上敲入Y键,开始烧录。这时开发板上的绿色发光管依次点亮说明烧录正在进行中。烧录结束后,询问是否再次烧录,敲入N键退出。
j. 复位开发板,在超级终端上有新的输出信息出现,显示:
Function : ARMSys's BootLoader for Linux
说明最新的Bootloader已经烧录成功

3.修改程序


3.1 drivers/net/下的ne.c文件

在文件Linux-2.4.x/drivers/net/ne.c查找到CONFIG_BOARD_MBA44,修改一下中断号dev-irq,改成我们电路中使用的EINT3(中断号22):
……
#elif defined(CONFIG_BOARD_MBA44)
static int once = 0;
if (once)
return -ENXIO;
dev->base_addr = base_addr = 0x08000000;/NE2000_ADDR;
dev->irq = 22 ;/24;/NE2000_IRQ_VECTOR;
once++;
……

3.2 Vendor/Samsung/44B0X/rc文件

在该文件的最后添加一句:
ifconfig eth0 192.168.253.2 netmask 255.255.255.0 up

4.配置内核


下面就可以开始配置内核和用户选项了。
打开终端。
# cd /home/uClinux-dist
# make menuconfig

进入uClinux配置(uClinux v3.1.0 Configuration),选中“Kernel/Library/Defaults Selectionà”敲空格进入。选中内核设置项和用户选项:
[*] Customize Kernel Settings
[*] Customize Vendor/User Settings

建议通过直接载入我们提供的内核配置文件Config_Kernel和用户配置文件Userconfig_eth(到download/default.asp下载)来完成配置。将Kernelconfig_eth拷贝到uClinux-dist/Linux-2.4.x目录下,将Config_User拷贝到uClinux-dist/Config目录下。

回到终端,按下ESC键两次,敲回车退出。进入内核配置(Linux Kernel v2.4.24-uc0 Configuration),选中“Load an Alternate Configuration File”,敲空格键进入,输入Kernelconfig_eth文件名,按回车退出。内核选项就被设置好了。

按下ESC键,敲回车保存设置。自动切换到用户选项配置。同样选中“Load an Alternate Configuration File”,敲空格键进入,输入Userconfig_eth文件名,按回车退出。用户选项就被设置好了。

也可以手动修改。手动修改的步骤如下:

进入内核配置(Linux Kernel v2.4.24-uc0 Configuration)。

4.1配置General Setup --->

选中“General Setup --->”,敲空格进入。选中第2项:
[*] Networking Support
按ESC退出。

4.2配置Networking options --->


选中“Networking options--->”,敲空格进入。需要选中其中的两项:

<*> Packet socket
……
[*] TCP/IP networking

4.3配置Networking device Support --->

选中“File system --->”,敲空格进入。选中:
[*] Network device support?
选中“Ethernet (10 or 100Mbit) --->”敲空格进入:
选中:
[*] Other ISA cards
在下拉的选项中,选中:
<*> NE2000/NE1000 support

敲三次ESC,敲回车,退出内核配置。

5.配置Network Applications --->

选中“Network Applications --->”敲空格进入,选中以下几项:
[*] arp
……
[*] ifconfig
[*] inetd
……
[*] ping
……
[*] route
……

6.编译uClinux

按下面的步骤进行编译:
# make dep
# make clean (非必要)
# make lib_only
# make user_only
# make romfs
# make image
# make
编译成功后,在uClinux-dist/目录下产生images目录,其中的3个文件:image.ram, image.rom和romfs.img就是我们可以使用的二进制文件。

7.下载与启动

7.1下载

利用ARMSYS提供的Bootloader通过USB接口下载2个二进制文件:

l image.ram(文件改名为imageram.bin)下载到地址0x0c008000;
l romfs.img(文件改名为romfs.img)下载到地址0x0c400000;

7.2启动

从0xc008000地址处开始运行,可以从超级终端上观察到如下所示的输出信息:
Linux version 2.4.24-uc0 (root@localhost) (gcc
version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http:/fiddes
.net/coldfire/)(uClinux XIP and shared lib patches from http:/www.snapgear.com/
)) #165 五 10月 8 20:04:10 CST 2004
Processor: Samsung S3C44B0X revision 0
Architecture: S3C44B0X
On node 0 totalpages: 2048
zone(0): 0 pages.
zone(1): 2048 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/rom0 init=/linuxrc
Calibrating delay loop... 31.84 BogoMIPS
Memory: 8MB = 8MB total
Memory: 6592KB available (1270K code, 155K data, 40K init)
Dentry cache hash table entries: 1024 (order: 1, 8192 bytes)
Inode cache hash table entries: 512 (order: 0, 4096 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 2048 (order: 1, 8192 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
ttyS0 at I/O 0x1d00000 (irq = 3) is a S3C44B0
ttyS1 at I/O 0x1d04000 (irq = 2) is a S3C44B0
ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com)
Last modified Nov 1, 2000 by Paul Gortmaker
NE*000 ethercard probe at 0x8000000: 00 00 e8 12 34 56
eth0: NE1000 found at 0x8000000, using IRQ 22

Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: C400000-C47CBFF [VIRTUAL C400000-C47CBFF] (RO)
RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: IC
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 512 bind 512)
VFS: Mounted root (romfs filesystem) readonly.
Freeing init memory: 40K
Shell invoked to run file: /etc/rc
Command: hostname Samsung
Command: /bin/expand /etc/ramfs.img /dev/ram0
Command: mount -t proc proc /proc
Command: mount -t ext2 /dev/ram0 /var
Command: mkdir /var/config
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: cat /etc/motd
Welcome to
____ _ _
/ __| ||_|
_ _| | | | _ ____ _ _ _ _
| | | | | | || | _ \| | | |\ \/ /
| |_| | |__| || | | | | |_| |/ \
| ___\____|_||_|_| |_|\____|\_/\_/
| |
|_|

For further information check:
http:/www.uclinux.org/

Command: ifconfig lo 127.0.0.1
Command: route add -net 127.0.0.0 netmask 255.255.255.0 lo
Command: ifconfig eth0 192.168.253.2 netmask 255.255.255.0 up
Execution Finished, Exiting

Sash command shell (version 1.1.1)
/>

其中的前面一组黑体部分说明系统已经识别到了RTL8019器件,该设备的I/O地址为0x8000000,中断号为0x22。MAC地址为:00 00 e8 12 34 56。
MAC地址的设置对应于: unsigned char ne_defethaddr[6] = {0x00, 0x00, 0xe8, 0x12, 0x34, 0x56};
可能你的文件中是设成{0x00, 0x00, 0xe8, 0x34, 0x00, 0x00}的,所以显示出来的MAC不同,这个关系不大,只要与主机不冲突就行了

后面一组黑体部分是对以太网控制器的IP地址、子网掩码的设置。

8.Ping测试

启动后直接输入如下的命令行:
/> ping 192.168.253.3
PING 192.168.253.3 (192.168.253.3): 56 data bytes
64 bytes from 192.168.253.3: icmp_seq=0 ttl=128 time=0.0 ms
64 bytes from 192.168.253.3: icmp_seq=1 ttl=128 time=0.0 ms
64 bytes from 192.168.253.3: icmp_seq=2 ttl=128 time=0.0 ms
64 bytes from 192.168.253.3: icmp_seq=3 ttl=128 time=0.0 ms
64 bytes from 192.168.253.3: icmp_seq=4 ttl=128 time=0.0 ms
64 bytes from 192.168.253.3: icmp_seq=5 ttl=128 time=0.0 ms

--- 192.168.253.3 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

用Ctrl+C键中止ping过程。

感谢ARMSYS用户noavay网友提供的移植心得体会。

请通过发邮件到support@hzlitai.com.cn来同作者交流或指出这篇文档的问题。



上一篇:S3C44B0X有哪些可用的I/O口 下一篇:没有了