最近空闲时间很多,索性研究起了Atheros SDK。正如很多读者所知道的, 笔者本人并非软件出身,所以很基础的问题在我看来都很高深,Atheros的SDK也同样如此,看了1,2天代码,我总算研究清楚怎样使用,后续争取将我的研究与使用成果在这里与读者分享。第一阶段的研究目的是如何将自己需要的软件一同编译,最终可以在目标板上运行,本文也正是围绕着这样的主题展开。
Atheros SDK初体验
这次使用的Atheros SDK版本是LSDK-9.2.0,使用的板子是 笔者自己设计的基于AR9344的大功率无线AP。按照官方文档中的说明,将源代码解压至工作目录,如下图。
然后进入build目录运行如下命令
make BOARD_TYPE=db12x BUILD_TYPE=jffs2
因为是第一次使用,需要编译工具链,所以耗费的时间很长,好在编译过程中没有出现任何问题,顺利地完成了全部的编译过程,并得到了最终的二进制文件,如下图。
将得到的二进制文件烧写至Flash,板子可以正常启动,说明以上的操作都是正确的。
变更Flash容量
由于我的设计是16MB Flash,与db12x默认的8MB Flash不符,因此需要更改源代码,将Flash配置为16MB。经过了一段时间的摸索,发现Flash容量定义在了以下文件中
boot/u-boot/include/configs/db12x.h
将其中的的第12行变更为
#define FLASH_SIZE16
再次编译,烧写得到的二进制文件,发现在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秒),如下
编译完成后,首先进入apps/tom目录,发现已经得到hello可执行文件,使用file命令查看这个可执行文件,结果如下
看来交叉编译工具已经正确指定且得到了可在目标板上执行的文件。再次将得到的二进制文件烧写至Flash,启动,运行hello,得到了激动人心的“Hello World”。
Alex, 按前文的方法编译出来的几个文件没问题,(我编译出来的是AP123 ,板子用的是AR9341),但如果FLASH 用的是16M ,用tftp 的方式,怎样把ap123-jffs2 和vmlinux_ap123.lzma.uImage 两个文件下载到AP板上。
2015-12-10 17:20用的是官方SDK吗?官方SDK的u-boot里面有几个命令,设置好ipaddr和serverip之后,可以分别运行lu,lk,lf更新u-boot,kernel,rootffs。
2015-12-10 17:29是用官方的SDK 但Uboot 不是官方的,我用了一起编译出来的tuboot ,串口打印出来的信息有点乱(偶尔有一两个乱码,行列对不齐),只能猜测打印出的信息,所以我就不用官方的uboot.
2015-12-10 17:40哦,不是官方的就不清楚了。
2015-12-10 18:36顺便问一句:官网改了logo? 好像版主的名也改了?
2015-12-10 17:46是的,都改了,以全新的,公开的身份运作工作室。
2015-12-10 17:48祝愿:厚积薄发,人气飙升!
2015-12-10 17:53对于这种专业性很强的网站人气飙升的可能性就很小了,客户多些就行了,哈哈
2015-12-10 18:37还是延续刚才的问题,我用了第三方的u-boot 不支持lk lf 脚本,所以我想请教的是,用第三方的U-boot 如何下载, 第三方的u-boot 支持tftp下载。
2015-12-10 18:13通常的思路就是先定义好Flash分区,在u-boot下设置好serverip和ipaddr,然后使用tftpboot命令将文件下载到内存中,使用erase命令擦除Flash中的相关区域,最后使用cp.b命令将内存中的文件写入Flash。
2015-12-10 18:39以下是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
2015-12-10 18:42看起来这个把kernel和rootfs合在一起了啊,是firmware分区,没法单独刷kerner和rootfs,或者改一下环境变量吧。
2015-12-10 19:16谢谢!!
2015-12-10 19:45更改flash容量的,感觉只是uboot识别了,linux kernel好像没有识别
2016-06-17 10:12可能需要更新一下分区表
2016-06-17 10:35请问官方SDK的linux内核版本是多少?谢谢!
2016-09-21 11:122.6.31
2016-09-21 11:16hi,lics
2016-12-08 23:38我搭建的环境编译出现这个问题怎么解决,帮忙看下
/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:~$
不清楚这个情况,不好意思~
2016-12-09 09:41hi,lics
请教下,修改分区信息是在哪个文件修改? uboot+firmware大小的分区,我想增加一个分区进来,求教方法,感谢~
2016-12-26 21:32以db12x为例,修改boot/u-boot/include/configs/db12x.h,修改MTDPARTS_DEFAULT即可。
2016-12-27 09:07