Atheros SDK研究与使用

最近空闲时间很多,索性研究起了Atheros SDK。正如很多读者所知道的, 笔者本人并非软件出身,所以很基础的问题在我看来都很高深,Atheros的SDK也同样如此,看了1,2天代码,我总算研究清楚怎样使用,后续争取将我的研究与使用成果在这里与读者分享。第一阶段的研究目的是如何将自己需要的软件一同编译,最终可以在目标板上运行,本文也正是围绕着这样的主题展开。

Atheros SDK初体验

这次使用的Atheros SDK版本是LSDK-9.2.0,使用的板子是 笔者自己设计的基于AR9344的大功率无线AP。按照官方文档中的说明,将源代码解压至工作目录,如下图。

SourceCode-Directory

然后进入build目录运行如下命令

make BOARD_TYPE=db12x BUILD_TYPE=jffs2

因为是第一次使用,需要编译工具链,所以耗费的时间很长,好在编译过程中没有出现任何问题,顺利地完成了全部的编译过程,并得到了最终的二进制文件,如下图。

Images-Built

将得到的二进制文件烧写至Flash,板子可以正常启动,说明以上的操作都是正确的。

变更Flash容量

由于我的设计是16MB Flash,与db12x默认的8MB Flash不符,因此需要更改源代码,将Flash配置为16MB。经过了一段时间的摸索,发现Flash容量定义在了以下文件中

boot/u-boot/include/configs/db12x.h

将其中的的第12行变更为

#define FLASH_SIZE              16

再次编译,烧写得到的二进制文件,发现在u-boot中已经正确地识别为16MB Flash。

分析Makefile

接下来研究如何将自己编写的代码编译成为可执行文件,并在目标板中运行。在通读了build目录中的Makefile文件后,发现其会包含build/scripts目录下相应的Makefile,这样只需要变更build/scripts/db12x下的Makefile即可更改编译进来的软件。按照Atheros官方的注释,也是如此

# Adding make instructions:

# Usually board/scripts/<target> is the correct place to do this.

# IMPORTANT: all “make targets” which add to $(INSTALL_ROOT)

再来分析build/scripts/db12x/Makefile.db12x文件,发现其最开始的一段输出了较多的环境变量,例如

export HAL=$(TOPDIR)/drivers/wlan/hal

export ENETDIR=$(TOPDIR)/linux/drivers/ethernet

分析这样做的好处是方便后续软件版本的变更及增加代码的可读性,我在这里面加了一行

export TOM_DIR=$(TOPDIR)/apps/tom

这样,我就可以将自己的代码放在tom目录下。

build/scripts/db12x/Makefile.db12x中定义了多个编译模块(暂时这样称呼,因为我还不知道其专有名词),例如iptables_build,samba_build等,这些编译模块中的大部分又统一放置于common_mainline中,然后根据/build/scripts/db12x/config.db12x中相应的配置决定启用哪些编译模块,例如本例中config.db12x设定BUILD_ATHR_HOSTAP为1,则根据条件判断语句编译如下模块:

common_mainline: check_tftp rootfs_prep toolchain_build
kernel_build kernel_info enet_build busybox_build athr-hostapd athr-wpa_supplicant
sar cgi lzma_uimage uboot_mainline samba_build
ntfs3g_build $(stage2_build)

到这里,相信读者也一定知道怎样将自己的代码编译进去了,将自己的代码仿照apps/tom目录下,在build/scripts/db12x/Makefile.db12x定义一个唯一的模块如tom_build,并将tom_build添加到common_mainline中即可。

Hello World

按照以上思路,将hello.c放在apps/tom目录下,hello.c的代码内容如下

#include <stdio.h>
int main() {
printf(“Hello Worldn”);
return 0;
}

定义tom_build如下

tom_build:
@echo making Toms Hello World
sleep 60
cd $(TOM_DIR) &&
$(TOOLPREFIX)gcc hello.c -o hello &&
cp hello $(INSTALL_ROOT)/sbin/hello

再次编译,可以看到正在编译hello.c的过程( 笔者故意设置了打印信息及暂停60秒),如下

Making 编译完成后,首先进入apps/tom目录,发现已经得到hello可执行文件,使用file命令查看这个可执行文件,结果如下

File-Hello 看来交叉编译工具已经正确指定且得到了可在目标板上执行的文件。再次将得到的二进制文件烧写至Flash,启动,运行hello,得到了激动人心的“Hello World”。

hello-world

21 thoughts on “Atheros SDK研究与使用

  1. Alex, 按前文的方法编译出来的几个文件没问题,(我编译出来的是AP123 ,板子用的是AR9341),但如果FLASH 用的是16M ,用tftp 的方式,怎样把ap123-jffs2 和vmlinux_ap123.lzma.uImage 两个文件下载到AP板上。

    1. 用的是官方SDK吗?官方SDK的u-boot里面有几个命令,设置好ipaddr和serverip之后,可以分别运行lu,lk,lf更新u-boot,kernel,rootffs。

  2. 是用官方的SDK 但Uboot 不是官方的,我用了一起编译出来的tuboot ,串口打印出来的信息有点乱(偶尔有一两个乱码,行列对不齐),只能猜测打印出的信息,所以我就不用官方的uboot.

  3. 还是延续刚才的问题,我用了第三方的u-boot 不支持lk lf 脚本,所以我想请教的是,用第三方的U-boot 如何下载, 第三方的u-boot 支持tftp下载。

    1. 通常的思路就是先定义好Flash分区,在u-boot下设置好serverip和ipaddr,然后使用tftpboot命令将文件下载到内存中,使用erase命令擦除Flash中的相关区域,最后使用cp.b命令将内存中的文件写入Flash。

  4. 以下是U-boot 的环境变量
    uboot> printenv
    bootcmd=bootm 0x9F020000
    bootdelay=1
    baudrate=115200
    ipaddr=192.168.1.1
    serverip=192.168.1.10
    bootfile=”firmware.bin”
    loadaddr=0x80800000
    ncport=6666
    uboot_addr=0x9F000000
    uboot_name=uboot.bin
    uboot_size=0x10000
    uboot_upg=if ping $serverip; then tftp $loadaddr $uboot_name && if itest.l $filesize == $uboot_size; then erase $uboot_addr +$filesize && cp.b $loadaddr $uboot_addr $filesize && echo OK!; else echo ERROR! Wrong file size!; fi; else ERROR! Server not reachable!; fi
    firmware_addr=0x9F020000
    firmware_name=firmware.bin
    firmware_upg=if ping $serverip; then tftp $loadaddr $firmware_name && erase $firmware_addr +$filesize && cp.b $loadaddr $firmware_addr $filesize && echo OK!; else ERROR! Server not reachable!; fi
    art=tftp $loadaddr art-calibration-934x.bin && bootm
    stdin=serial
    stdout=serial
    stderr=serial
    ethact=eth0
    bootargs=board=AP9341FE console=ttyS0,115200 root=31:02 rootfstype=squashfs init=/sbin/init mtdparts=ath-nor0:64k(u-boot),64k(art),16192k(fiwmware)

    Environment size: 979 bytes

    1. 看起来这个把kernel和rootfs合在一起了啊,是firmware分区,没法单独刷kerner和rootfs,或者改一下环境变量吧。

  5. hi,lics
    我搭建的环境编译出现这个问题怎么解决,帮忙看下
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/elf.texi:1: warning: @section missing argument
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/bfd.texinfo:335: unknown command `colophon’
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/bfd.texinfo:346: unknown command `cygnus’
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/bfdt.texi:313: raising the section level of @subsubsection which is too low
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/init.texi:5: raising the section level of @subsubsection which is too low
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/archive.texi:54: raising the section level of @subsubsection which is too low
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/format.texi:27: raising the section level of @subsubsection which is too low
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/reloc.texi:495: raising the section level of @subsubsection which is too low
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/core.texi:8: raising the section level of @subsubsection which is too low
    ./opncls.texi:5: raising the section level of @subsubsection which is too low
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/libbfd.texi:10: raising the section level of @subsubsection which is too low
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/cache.texi:14: raising the section level of @subsubsection which is too low
    /home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/elf.texi:13: raising the section level of @subsubsection which is too low
    make[4]: *** [/home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1/bfd/doc/bfd.info] 错误 1
    make[4]: Leaving directory `/home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1-build/bfd/doc’
    make[3]: *** [install-recursive] 错误 1
    make[3]: Leaving directory `/home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1-build/bfd’
    make[2]: *** [install-bfd] 错误 2
    make[2]: Leaving directory `/home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/toolchain_build_mips_nofpu/binutils-2.16.1-build’
    make[1]: *** [/home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1/build_mips_nofpu//mips-linux-uclibc/bin/ld] 错误 2
    make[1]: Leaving directory `/home/hongxing/LSDK/LSDK-9.2/LSDK-9.2.0/build/gcc-3.4.4-2.16.1′
    make: *** [toolchain_build] 错误 2
    hongxing@Ubuntu:~$

  6. hi,lics

    请教下,修改分区信息是在哪个文件修改? uboot+firmware大小的分区,我想增加一个分区进来,求教方法,感谢~

发表评论