"自己动手编写嵌入式Bootloader之(2)" 在这篇文章中,我们将讨论如何实现通过网口下载内核映像的功能,从底层到上层需要做的工作包括:开发板上的网卡芯片的驱动程序;TCP/IP 协议栈的实现;TFTP 客户端应用程序的实现。 让我们看一下网卡芯片的驱动程序。我们使用的 OK2440 开发板配备 CS8900A 网卡芯片。为了简单起见,网络数据包的发送和接收都使用轮询方式,不使用中断。我们首先需要设置 BANK3 的总线宽度为 16 位,使能 nWait,和使能 UB/LBBANKCON3。然后,我们可以定义 CS8900 的访问基址为 0x19000300。 在 CS8900 中,读写寄存器的方式有些特别。要读一个寄存器,先向 CS8900_PPTR 中写入该寄存器地址,再从 CS8900_PDATA 中读出该寄存器值;要写一个寄存器,先向 CS8900_PPTR 中写入该寄存器地址,再向 CS8900_PDATA 中写入要写入的值。这两个函数可以用来读写寄存器: static unsigned short get_reg (int regno){ CS8900_PPTR = regno; return CS8900_PDATA; } static void put_reg (int regno, unsigned short val){ CS8900_PPTR = regno; CS8900_PDATA = val; } 我们可以使用这两个函数来读取 CS8900 的芯片 ID,读该寄存器得到的正确值应该是 0x630E,这可以初步判断一些地址/引脚的设置是否正确。如果读出的不是 0x630E,那么 CS8900 肯定不能正常工作。 在设置 MAC 地址时,我们需要使用 unsigned char 类型的数组来保存网络配置信息: unsigned char NetOurEther[6] = /* Our ethernet address */ {0x00, 0x09, 0x58, 0xD8, 0x11, 0x22}; unsigned char NetServerEther[6] = /* Boot server enet address */ {0x00, 0x14, 0x2A, 0xA5, 0x50, 0x97}; unsigned long NetOurIP = 0xC0A801FC; /* Our IP addr 192.168.1.252 */ unsigned long NetServerIP = 0xC0A801F9; /* Server IP 192.168.1.249 */ 网络协议中 IP 地址一般是用一个 4 字节整型数表示的。 在实现 TFTP 客户端应用程序时,我们需要使用全局配置信息发送和接收的数据缓冲区,使用全局静态缓冲区,不使用动态内存分配: unsigned char *TxBuf = (unsigned char *)0; unsigned char *RxBuf = (unsigned char *)1024; 这些都是实现通过网口下载内核映像的功能所需要的基本步骤。在下一篇文章中,我们将继续讨论实现 TFTP 客户端应用程序的细节。
剩余13页未读,继续阅读
- 粉丝: 18
- 资源: 392
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助