简介
手头上有一块H743IIT6的开发板,打算来捣鼓下RTT。但是RTT官方没有专门给H743弄BSP适配,我这个也不是支持范围内的有名的开发板,我只能是以正点原子H743Pro的BSP来修改下适配成我的开发板。
记录下适配中的难点。
我适配完成的外设:
- LAN 8720与网络协议栈
- W25Q128与文件系统
- SD卡与文件系统
- TFTP与网络抓包功能tcpdump功能
- Web服务器的移植
成果展示
系统跑起来的~~
SD卡的文件系统
W25Q128的文件系统
板卡ping电脑
电脑ping板卡
tftp功能(RTT加入netutils组件)
文件名也可以显示出中文,但是需要用修改过配置的putty
抓包(这个功能真是太好用)(RTT加入netutils组件)
电脑读取出来的PING抓包
HTTP服务器DEMO(Mongoose)
HTTP服务器(RTT自家的WebNet)
上传文件的玩法没有搞起,运行就会宕机
前端AJAX与板卡进行数据交互
这个需要了解些前端知识
我分享下我的主页
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
var xmlhttp;
function loadXMLDoc(url,cfunc)
{
//这个是根据浏览器判断需要生成哪一种请求
if (window.XMLHttpRequest)
{
//ie7之后它的ajax对象都跟随其他其他浏览器一样,使用的是XMLHttpRequest
xmlhttp=new XMLHttpRequest();
}
else
{
//ie5和ie6支持的ajax对象叫ActiveXObject
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
//当请求被发送到服务器时,我们需要执行一些基于响应的任务。
xmlhttp.onreadystatechange=cfunc;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
var text;
function update(){
loadXMLDoc("/cgi-bin/show_tick",function()
{
//当 readyState 等于 4 且状态为 200 时,表示响应已就绪
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
text = xmlhttp.responseText;
console.log(text);
document.getElementById("h22").innerText = "当前TICK: "+text;
}
});
}
function init()
{
setInterval(update,1000); //1s 1刷新
}
</script>
</head>
<body onload="init()">
<h2 id = "h22">TEXT</h2>
</body>
</html>
在WebNet组件源代码加入一个回调函数
static void cgi_show_tick_handler(struct webnet_session* session)
{
const char* mimetype;
struct webnet_request* request;
RT_ASSERT(session != RT_NULL);
request = session->request;
RT_ASSERT(request != RT_NULL);
/* get mimetype */
mimetype = mime_get_type(".html");
char buff[20] = {0};
/* 设置应答头 */
session->request->result_code = 200;
webnet_session_set_header(session, mimetype, 200, "Ok", -1);
/*把板卡目前的Tick值回复给浏览器*/
webnet_session_printf(session, itoa( rt_tick_get_millisecond(),buff,10) );
}
webnet初始化的时候加入回调函数注册
webnet_cgi_register(“show_tick”, cgi_show_tick_handler);
把网页装到SD卡之后,板卡上电,访问主页,你就可以看到板卡的Tick值1s 1刷新啦
这个搞定了,可以用这个服务器实现很多有意思的功能
想想市售的交换机/路由器等等设备,无需GUI屏幕,无需额外的工具,仅仅需要网页就可以做配置与信息展示,很方便。
移植要点
使用RTT官方做的正点原子H743的BSP
这个BSP初始状态如下:
- 时钟帮调好了,400MHz,开箱即可运行RTT
- 有SD卡驱动(没有加入编译环境,事后发现不太好用,换了一个)
- 有SPI驱动(没有加入编译环境,这个可以用)
- 有SDRAM驱动(没有加入编译环境,没有搞移植适配)
- 有LAN8720的驱动(没有加入编译环境,这个网络的也有点问题没有用,换了一个,并替换ETH的HAL库为我自己调好的HAL源文件,因为我的IO口和正点原子的有点不一样)
- 有点LED的驱动
针对以上
首先通过宏定义在board.h打开需要的外设
#define BSP_USING_SPI5
#define BSP_USING_SDIO
#define BSP_USING_SDIO1
#define BSP_USING_ETH
#define RT_USING_LWIP
#define BSP_USING_ETH
#define PHY_USING_LAN8720A
先弄SPI FLASH
把我自己的SPI5的适配驱动整好,我的板子接的不是QSPI就是普通的SPI
然后RTT设置打开以下设置
注意因为我要同时挂载SPI和SD卡,所以挂载文件系统的最大数目调整成3,最大扇区大小改成4096.
设备驱动程序
POSIX
网络
基本没有改,就是改了IP地址为静态
其他的设置就基本没有动了。
先实现功能再优化
SPI存储
SPI比较好弄,在board.c里面
- 把W25存储器挂载到SPI5上
- 存储器注册块设备
- 存储器挂载到文件系统
SD卡
SD卡比较难弄,主要是不熟悉RTT这个IDE加上它原来的这个驱动也有点问题,一直编译不过,我直接换了一个驱动。套路和SPI存储差不多。
- 把SD挂载到系统里
- SD注册块设备
- SD挂载到文件系统
但是注意SD卡初始化可能时间没有那么块,所以在文件系统初始化阶段要搞一个多次判断监测的机制,待系统读取到SD卡之后,再挂载它到文件系统里。
注意,这个Sconscript似乎可以和IDE联动,如果IDE读取不到BSP宏定义的话,它对应的drv源文件不会显示出来也不会进行编译,可是把我一顿整,我直接把网络和sd卡的这个条件去掉了,让它强制包含。
网络部分
原来的BSP没有做网络部分,这个非常的难搞
- 需要改mpu部分的代码,包含网络DMA描述符的保护
- 需要修改链接文件,包含网络描述符部分的分段
- 需要更换它原本的drv源文件,因为我的IO口和他不一样,而且原来的不知道为什么没有考虑网络描述符
- 原来的PHY地址也不对,正确的应该是0
- 原来的初始化部分也没有注意Cache清除的问题
- 它底层的HAL库部分对于没有启用的部分没有开启,而且它这个库我对比了下和我手头上调通了网络的HAL库也不一样,直接替换掉。
一整个下午都在找问题在那里,一进网络中断就网络DMA异常,最后发现它HAL库部分文件都有问题
最后到了晚上,还是调通了网络
总结
初次搞RTT移植还是问题挺多,不过它这个IDE确实很方便,功能配置很好用,但是也有很多坑需要注意。
最后放出我的工程,需要的可以拿走(H743IIT6开发板+LAN8720+W25Q128移植RT-Thread(包含tftp,web服务器的功能))
链接