没有合适的资源?快使用搜索试试~ 我知道了~
自己动手编写嵌入式Bootloader之(2)
需积分: 10 23 下载量 40 浏览量
2009-09-13
08:45:20
上传
评论
收藏 157KB DOC 举报
温馨提示
试读
14页
自己动手编写嵌入式Bootloader之(2) 自己动手编写嵌入式Bootloader之(2) 自己动手编写嵌入式Bootloader之(2) 自己动手编写嵌入式Bootloader之(2)
资源推荐
资源详情
资源评论
第二部分:通过网口下载内核映像
要实现通过网口下载文件的功能,从底层到上层需要做的工作包括:开发板上的网卡芯片的驱动程序; 协议栈的实现; 客户端应用程序的实现。
我们使用的 开发板配备 网卡芯片。 为了简单起见,网络数据包的发送和接收都使用轮询方式,不使用中断;协议栈只使用
协议,不涉及 及其他协议;应用程序只实现最简单的 客户端。
1. 全局配置信息
发送和接收的数据缓冲区,使用全局静态缓冲区,不使用动态内存分配。第一阶段运行结束之后, 内
部 的 可以用作其它用途,我们就用它做网络数据接收、发送的缓冲区。
亦可用作标准输入输出的缓冲区。
!"#$%&' !"#()
!"#$%&' !"#(*)
使用若干个全局变量来保存网络配置信息:
!"+++,"- "./0&++++++++++#" "!"++++++#
+++++++1$2$2$32$2$**2$4)
开发板的 5 地址,这个是任意设置的。
!"+++,"6"- "./0&++++++++++#"6"!"+++#
+++1$2$*2$2$32$32$74)
服务器也就是主机的 5 地址,这个要跟主机 5 一致,可以在主机上运行 %8 命令查到。
9+++,"&$*)++++++#"!"*:*/:*:3+++#
9+++,"6"&$*)++++++#"6"++*:*/:*:+++#
网络协议中 地址一般是用一个 字节整型数表示的。
2. CS8900A 以太网驱动程序
硬件电路决定了 的物理地址是在 ,; 的区间内, 是 */ 位的寄存器,故我们设置 ,; 的 <= 也为 */ 位。设置 ,;:
总线宽度 */,使能 <!2使能 >
BANKCON3:0x1F7C
网卡 CS8900 的访问基址为 0x19000000,之所以再偏移 0x300 是由它的特性决定的
#define CS8900_BASE 0x19000300
CS8900 读写寄存器的方式有些特别。要读一个寄存器,先向 CS8900_PPTR 中写入该寄存
器地址,再从 CS8900_PDATA 中读出该寄存器值;要写一个寄存器,先向 CS8900PPTR 中
写入该寄存器地址,再向 CS8900_PDATA 中写入要写入的值。不管是寄存器地址还是要读
写的数值,都是 16 位的,也就是说都是 unsigned short 类型的。因此,读写寄存器的函数
如下:
! "?"'"(
1
++++?&")
++++""?)
4
+
!6?"'"2 "6!9(
1
++++?&")
++++?&6!9)
4
读芯片 : 的芯片 存放在 ? 寄存器中,读该寄存器得到的正确值应该是 $/;-,这可以初步判断一些地址/引脚的设置是否正确,
如果读出的不是 $/;-,那么 肯定不能正常工作。
设置 5 地址:
5 地址并不是固定的,可以由我们随意设置。从寄存器 ? 开始的 / 个字节存放 5 地址。比如下面的代码把 5 地址设为 3**@
+++?"'?A2$B$CC()
++++?"'?A2$3B$CC()
++++?"'?A2$**B$CC()
因为是 >9-!2所以 $CC, 但是在寄存器内存中还是 $ 放在前面。
寄存器初始化: 设置 CS8900 的工作模式
+++#只接收目标地址为本网卡的无错误数据包 #
++++?"'?$>2?$>?B?$>?"!!B
?$>?$()
++++#当进行接收操作时,不要产生任何中断 #
++++?"'?$D2()
++++#当进行发送操作时,不要产生任何中断 #
++++?"'?$D2()
++++#当进行缓存操作时,不要产生任何中断 #
++++?"'?%D2()
++++#使能发送和接收模式 #
++++?"'?>>2?>>?$B?>>?$()
发送数据包:
?'69!96#!E29 (
两个参数:要发送的数据包首地址、长度
TxCMD 和 TxLen 寄存器用来初始化数据包的发送,其具体含义见 CS8900 数据手册第 70
页。这里 PP_TxCmd_TxStart_Full 被定义为 0x00C0,表示直到整个数据侦都加载到
CS8900 内部缓存之后才开始发送,数据侦的长度为 CS8900_TxLEN.
#!!"!FG#
++++?$5&?$F?$!"?99)
++++?$>-,&9 )
使用 TxCMD 下达发送数据的命令后,再读取 PP_BusSTAT 总线状态寄存器判断是否做好
发送数据的准备。当 get_reg (PP_BusSTAT) & PP_BusSTAT_TxRDY 不等于零时表示可以发
送了。 使用一个循环进行实际的发送操作:
%"'!"&!E)9 H)9 I&(
++++++++1
++++++++++++?&#!"AA)
++++++++4
这里 addr 也是 unsigned short 类型的指针, 每次向 CS8900_RTDATA 写入两个字节数据。
剩余13页未读,继续阅读
资源评论
tjx163
- 粉丝: 18
- 资源: 392
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功