"); //-->
作者,下家山
11.3 需要添加的东东
参考c/src/lib/libbsp/arm/edb7312/include/bsp.h,在c/src/lib/libbsp/arm/gp32/include/bsp.h中添加cs8900相关的东东; 针对s3c2410修改或添加c/src/lib/libbsp/arm/gp32/network/network.c,有下列内容要添加或修改:①定义cs8900基址,即#define CS8900_BASE 0x19000300②中断号,查看原理图,cs8900用的是EINT9号中断,所以cs8900_isr_data数组要改为rtems_irq_connect_data cs8900_isr_data = {BSP_EINT8_23,
(rtems_irq_hdl)cs8900_isr,
cs8900_isr_on,cs8900_isr_off, cs8900_isr_is_on,
3, /* unused for ARM cpus */
0 }; /* unused for ARM cpus */
③EINT9中断初始化,我把EINT9的中断初始化放在 cs8900_isr_on中,这样可以在安装isr_handler时
初始化static void cs8900_isr_on(const rtems_irq_connect_data *unused)
{
rGPGCON = (rGPGCON & 0xfffffff3)|(1<<3); /*PG1/9 = EINT9*/
rGPGUP = 0xffff;
rEXTINT1 = (rEXTINT1 & ~(7<<4)) | 0x4<<4; /*EINT9=high level triggered*/
rEINTPEND=(1<<9);
/*rSRCPND = BIT_EINT8_23; *//*to clear the previous pending states*/
/*rINTPND = BIT_EINT8_23;*/
rEINTMASK = ~(1<<9|0xf);/*enable EINT9*/
rINTMSK &= ~BIT_EINT8_23;/*enable EINT8_23*/
return;
}
④中断复位,即中断发生后要清中断,如:
rtems_isr cs8900_isr(rtems_vector_number v)
{
rEINTPEND=(1<<9);
ClearPending(BIT_EINT8_23);
cs8900_interrupt(v, g_cs);
}
针对s3c2410修改或添加c/src/libchip/network/cs8900.c,有下列内容要添加或修改:
⑤声明cs8900_device结构体,如static cs8900_device cs8900;
⑥attach cs8900_device结构体,即在函数cs8900_driver_attach的if语句前添加config->drv_ctrl=&cs8900;语句,这条语句必须添加,不然出现Driver eth0 already in use.的错误,即[printf ("Driver `%s' already in use.\n", config->name);]
⑦应用程序需要添加的东西,我开始调试的是rtems-4.6.99.3/testsuites/samples/loopback,但后来想到要从PC端PING 2410,就直接换成了调试netlink例程(rtems-4.6.99.3没有network例程,需要下载其他版本的例程),但调试了几天也没调试成功,后来看rtems-4.6.99.3下面的doc文档networking.pdf介绍了netdemo例程,又改成调netdemo。例程netdemo中需要添加networkconfig.h文件,并修改其中的rtems_bsdnet_ifconfig,rtems_bsdnet_config两个结构体.修改后的内容如下:
static char ethernet_address[6] = { 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 };
static struct rtems_bsdnet_ifconfig netdriver_config = {
RTEMS_BSP_NETWORK_DRIVER_NAME, /* name */
RTEMS_BSP_NETWORK_DRIVER_ATTACH, /* attach function */
NULL, /* link to next interface */
"192.168.13.88", /* IP address */
"255.255.255.0", /* IP net mask */
ethernet_address, /* Ethernet hardware address */
0 /* Use default driver parameters */
};
struct rtems_bsdnet_config rtems_bsdnet_config = {
&netdriver_config,
NULL,
0, /* Default network task priority */
0, /* Default mbuf capacity */
0, /* Default mbuf cluster capacity */
"rtems_host", /* Host name */
"nodomain.com", /* Domain name */
"192.168.13.1", /* Gateway */
"192.168.13.11", /* Log host */
{"192.168.13.88" }, /* Name server(s) */
};
11.4 ping开始ping板子,什么反应都没有,所以找了个抓包程序,发现PC端收到的包格式有错误,收到内容如下:ff ff ff ff ff ff 33 44 55 66 77 88 08 06 00 00 00 01 08 00 06 04 00 01 33 44 55 66 77 88 c0 a8 0d 58 00 00 00 00 00 00 c0 a8 0d 0b 0b 0b 0b 0b 0b 0b…分析后发现在08 06 后面多了两个字节00 00,分析原代码(花了很长时间)发现sizeof (struct ether_header)=16(应用到此结构的代码在cpukit/libnetworking/net/if_ethersubr.c),ether_header定义如下:
struct ether_header {
u_char ether_dhost[ETHER_ADDR_LEN];/* ETHER_ADDR_LEN =6*/
u_char ether_shost[ETHER_ADDR_LEN];/**/
u_short ether_type;
};/*见cpukit/libnetworking/net/Ethernet.h*/
按理所sizeof (struct ether_header)应为14但是我printf后的结构却为16,显然多出的两个字节在此,后来问同事说是字节对齐问题,果然在ether_header结构体后加__packed __attribute__((packed))属性后
struct ether_header {
u_char ether_dhost[ETHER_ADDR_LEN];/* ETHER_ADDR_LEN =6*/
u_char ether_shost[ETHER_ADDR_LEN];/**/
u_short ether_type;
}__packed __attribute__((packed));
果然ping通了。
转载:请注明,作者,下家山 请尊重原创!
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
安富利Spartan-6 LX9 Microboard开发教程
电动汽车无线充电演示视频
好人进来看看吧!
fpga基础试验教程
[原创]影响电子产品未来的纳米科技材料 !
Bourns 推出金属合金叠层功率电感器,具备高电流承载能力
Uber Eats 通过 Starship Rollout 进入欧洲机器人配送市场
使用单片机制作的摆动LED电子钟(3)
通过闪存优化的嵌入式文件系统确保智能电表的准确性
招聘信息
lcd显示和中断冲突。
fpga高级试验教程
C语言教程
三极管知识简介(3)
AI存储的下一步:GPU发起和CPU发起存储
智能戒指赋能健康与健身生态系统
四通道数字可调射频滤波器集成电路(RF-Filter IC)覆盖0.5至9 GHz
DC_DC 转换技术手册 BS(D)-1W 系列
低开销、高安全性的NOR闪存解决方案
CF存储卡用户手册
ARM仿真器+44b0开发板全国最低价
TE Connectivity USB 3.0 连接器
通过超高纯度条件实现的高纯度AlScN薄膜原子层沉积
半导体晶圆制造热回路优化
鼠标电路图
全桥电流驱动垂直偏转放大器TDA4866电路图
TI永磁同步BLDC电机控制FOC控制方案演示
后量子加密保障FPGA启动
Spansion最新65nm技术GL-S系列NOR闪存产品
TDA4863AJ基本应用电路图(二)