这几天尝试着在我的开发板上移植了u-boot,当串口、flash都没问题以后,在网络接口上却出了很多问题,经过很多次的修改和编译,问题最终都得到解决。现在把移植过程中要注意的问题分享给大家,希望能对大家有所帮助,在移植过程中少走弯路。
首先说一下我的开发板网络部分的配置:
网络接口芯片:RTL8019AS
地址空间:连接在s3c44b0的bank3
数据总线宽度:8位
在移植时下面这些部分需要注意:
1.网络芯片所在的bank的数据总线要和网络芯片数据位宽相同,对于RTL8019AS,当它的96脚IOCS16B接一个上拉电阻的话,它工作在16位模式,否则工作在8位模式。一定要看开发板上这个电阻在不在,有些开发板设计的时候有,但是没有焊上。确定了数据总线位宽以后,要在board/对应的开发板目录下lowlevel_init.S中MEMORY_CONFIG:下面的第一个数据进行修改,这个数据是(BUS WIDTH & WAIT CONTROL REGISTER)BWSCON寄存器的值,根据ARM芯片资料,把网络芯片所在的bank的数据总线宽度设置成网络芯片工作的位宽,如果数据总线设置不对,在用tftp下载时会出现packet too big的警告错误。
2.使能对应bank的片选信号nGCS,这个要看nGCS在哪个IO口上。以我的为例,nGCS3在GPB8,那么就要设置PCONB寄存器,把PB8设置为nGCS3功能,具体设置值参考ARM芯片资料。这个寄存器的设置在board/对应开发板目录下的对应开发板的c文件里面board_init()函数下。
3.网络芯片中断设置,要把和网络芯片中断引脚相连的IO口的中断功能使能,并把这个中断屏蔽掉。u-boot没有用到这个中断,这个中断供linux用。该项在board_init()函数里面。具体寄存器和设置值参考ARM芯片资料。
4.确定网络芯片IO端口的基地址,这要看IOS3-0(85,84,82,81脚)是否接上拉电阻(一定要看开发板上这些电阻是否接了),如果接的话那么对应的引脚为1,否则为零。然后用IOS3-0的值去查RTL8019AS的芯片手册,在CONFIG1: RTL8019AS Configuration Register 1 (04H; Type=R except Bit7=R/W) 这个寄存器里有。例如我的开发板上IOS3-0都没有接上拉电阻,那么IOS3-0为0000,然后芯片资料,0000对应的IO基地址为300H。我的开发板上RTL8019AS 接在bank3,bank3的起始地址为0x06000000,所以网络芯片的IO端口基地址为0x06000300。这个值在include/configs/ 对应的开发板头文件下修改。以我的为例#define RTL8019_BASE 0x06000300。
5.修改网络芯片的驱动程序头文件,在driver/目录下。如果网络芯片的SA0-SA4对应ARM的ADDR0-ADDR4,那么所有的寄存器偏移地址不需要偏移。即 :
#define RTL8019_REG_00 (RTL8019_BASE + 0x00)
#define RTL8019_REG_01 (RTL8019_BASE + 0x01)
#define RTL8019_REG_02 (RTL8019_BASE + 0x02)
#define RTL8019_REG_03 (RTL8019_BASE + 0x03)
.
.
.
如果网络芯片的SA0-SA4对应ARM的ADDR1-ADDR5,那么所有的寄存器偏移地址都需要向左移一位。
即 :
#define RTL8019_REG_00 (RTL8019_BASE + 0x00 << 1)
#define RTL8019_REG_01 (RTL8019_BASE + 0x01 << 1)
#define RTL8019_REG_02 (RTL8019_BASE + 0x02 << 1)
#define RTL8019_REG_03 (RTL8019_BASE + 0x03 << 1)
.
.
.