前段时间也编译个RT3070驱动,开发板是mini2440,内核时2.6.32.遇到很多问题,但都解决了,详细请看博客。这几天因为要在另外一块板子移植驱动板子是sam9x5,内核2.3.39,因为有前面的经验,以为会很容易,没想到,各种问题的出现,而且是以前没遇到个的。不过努力之后还搞定了。关于修改Makefile和config.mk就不在一步步说了,前面的博客里都有说明,大同小异。主要是说下遇到的问题吧。
刚开始我平台选择:PLATFORM = IXP,对于平台选择我也不是很懂,只晓得这与芯片有关,但每个PLATFORM具体代表那个厂家芯片我不知道,有知道的博友请在评论里给我说说,这里先谢了,因为网上看到有用ATMEL芯片的也选择这平台。编译时出现错误如下:
mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c: In function 'NICInitRecv':
/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c:789:3: error: implicit declaration of function 'usb_buffer_alloc'
/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c:789:30: warning: assignment makes pointer from integer without a cast
/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c:818:4: error: implicit declaration of function 'usb_buffer_free'
make[2]: *** [/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.o] Error 1
make[1]: *** [_module_/mcuzone/wifi/rt3070sta/os/linux] Error 2
make[1]: Leaving directory `/mcuzone/work/linux-2.6.39'
make: *** [LINUX] Error 2
以前编译时好像也出现过类似问题,记得是内核没编译好的原因,于是一遍遍的编译内核,在测试,但没有解决。关于内核的配置,这个博客写得比较详细http://blog.csdn.net/unsigned_/article/details/6123876。想了想可能是平台的原因,平台不同,CFLAG也就不同,于是选择以前用的平台PLATFORM = PC。编译时出现问题如下:
/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c: In function 'NICInitRecv':
/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c:789:3: error: implicit declaration of function 'usb_buffer_alloc'
/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c:789:30: warning: assignment makes pointer from integer without a cast
/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c:818:4: error: implicit declaration of function 'usb_buffer_free'
make[2]: *** [/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.o] Error 1
make[1]: *** [_module_/mcuzone/wifi/rt3070sta/os/linux] Error 2
make[1]: Leaving directory `/mcuzone/work/linux-2.6.39'
make: *** [LINUX] Error 2
因为内核该配置的我都配置了,不用的以防万一我也编译成模块了,所以排除内核。以前2.6.32版本并没有出现这样的问题,这次是2.3.39版本的,那么就可能是内核版本差异造成的,经过努力发现2.6.35 内核后, usb_buffer_alloc 和 usb_buffer_free 被替换成 usb_alloc_coherent 和 usb_free_coherent。所以编译才会报错。修改 include/os/rt_linux.h 文件。如下
#define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr) usb_buffer_alloc(pUsb_Dev, BufSize, GFP_ATOMIC, pDma_addr)
#define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) usb_buffer_free(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)
替换成:
#define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr) usb_alloc_coherent(pUsb_Dev, BufSize, GFP_ATOMIC, pDma_addr)
#define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) usb_free_coherent(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)
然后在make。通过。另外出现的第一个问题也就是PLATFORM = IXP,有人如果有解决的经验,请告诉我。