lwIP+ucos2移植于S3C2440过程(2)
- UID
- 1029342
- 性别
- 男
|
lwIP+ucos2移植于S3C2440过程(2)
**************************************
struct netif{
struct netif *next ;
struct ip_addr ip_addr ;
struct ip_addr netmask ;
struct ip_addr gw ;
err_t(*input)(struct pbuf *p , struct netif *inp) ;
err_t(*output)struct netif*netif,struct pbuf *p,struct ip_addr *ipaddr) ;
err_t(*linkoutput)(struct netif*netif,struct pbuf *p) ;
#if LWIP_DHCP
struct dhcp *dhcp;
#endif
/** number of bytes used in hwaddr */
unsigned char hwaddr_len;
/** link level hardware address of this interface */
unsigned char hwaddr[NETIF_MAX_HWADDR_LEN];
/** maximum transfer unit (in bytes) */
U16 mtu;
/** flags (see NETIF_FLAG_ above) */
U8 flags;
/** link type */
U8 link_type;
/** descriptive abbreviation */
char name[2];
/** number of this interface */
U8 num;
};
//alt_lwip_dev结构体描述了符合LWIP规范的网络端口设备
struct alt_lwip_dev
{
/* The netif pointer MUST be the first element in the structure */
struct netif* netif;
const char* name;
err_t (*init_routine)(struct netif*); //初始化函数
void (*rx_routine)(); //数据接收函数
};
//alt_lwip_dev_list:设备链表
typedef struct
{
alt_llist llist; /* for internal use */
alt_lwip_dev dev;
}alt_lwip_dev_list;
typedef struct alt_llist_s alt_llist;
struct alt_llist_s {
alt_llist* next; /* Pointer to the next element in the list. */
alt_llist* previous; /* Pointer to the previous element in the list. */
};
//在LWIP定义的这些结构体类型的基础上,DE2_WEB_SERVER定义了针对DM9000网络接口的一个结构体
typedef struct
{
alt_lwip_dev_list lwip_dev_list; //与之关联的设备链表
int base_addr; //寄存器的基地址
int irq; //中断编号
u_char hwaddr[6]; //MAC地址
int index_offset;
int data_offset;
int dm9k_tx_space;
int dm9k_linked;
sys_sem_t arp_semaphore;
sys_sem_t tx_semaphore;
} alt_avalon_dm9k_if;
先让驱动起来,移植s3c2440加到其它程序一起.
焦海波那个有可能考虑.因为那一些写的比较完整,但总是低估了它的难度.
果然,焦已经形成文档了
下载下来看看,或许有解的机会.
移植被LwIP到一个新的目标系统时,只需要修改这个接口艰险可,那个接口? sys_arch
操作系统模拟层(sys_arch) 它在底层操作系统和LwIP之间提供了一个接口?
sys_arch需要为LwIP提供信号量(sem)和邮箱(mailboxes)
信号量是可以计数信号量,也可以二值信号量,---LwIP都可以正常工作,
邮箱用于消息传递.
int sys_init()
sys_sem_t sys_sem_new() ;
sys_sem_freem() ;
sys_sem_signal()
sys_arch_sem_wait() ;
sys_mbox_t sys_mbox_new() ;
sys_mbox_free(sys_mbox_t mbox) ;
void sys_mbox_post(sys_mbox_t mbox,void *msg)
u32_t sys_arch_mbox_fetch(sys_mbox_t mbox,void **msg,u32_t timeout)
struct sys_timeouts *sys_arch_timeouts(void)
如果底层操作系统支持多线程并且LwIP中需要这样的功能,则一定要实现这个函数.
sys_thread_t sys_thread_new(void(*thread)(void*arg),void *arg,int prio) ;
sys_prot_t sys_arch_protect(void)
void sys_arch_unprotect(sys_prot_t pval) ;
以上是Lwip与操作系统关系.
----------------------------------------------------------------------------
OS支持的模拟层需要添加的头文件:
cc.h 与硬件平台以及编译器相关的环境变量及数据类型声明文件.或者一些移到sys_arch.h中.
与编译器相关的LwIP结构体
PACK_STRUCT_FILED(x)
PACK_STRUCT_STRUCT
PACK_STRUCT_BEGIN
PACK_STRUCT_END
与平台相关
LWIP_PLATFORM_DIAG(X)
memset() 如果编译器不提供,这个文件一定要包含它的定义,即memset()
<errno.h>
perf.h
sys_arch.h sys_arch.c的头文件
整个移植所依赖的操作系统平台.
OK 文件夹和文件指定的路建立后,
先去定数据类型定义.
cc.h:
typedef unsigned char u8_t
typedef signed char s8_t
typedef unsigned short u16_t ;
....... |
|
|
|
|
|