#!/bin/sh # # ti processor sdk linux am335x evm /bin/setup-tftp.sh hacking # 说明: # 本文主要对TI的sdk中的setup-tftp.sh脚本进行解读,是为了了解其工作机制。 # # 2016-4-16 深圳 南山平山村 曾剑锋 # This distribution contains contributions or derivatives under copyright # as follows: # # Copyright (c) 2010, Texas Instruments Incorporated # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # - Neither the name of Texas Instruments nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # 获取当前工作路径,并执行common.sh,是为了使用里面的函数 cwd=`dirname $0` . $cwd/common.sh # tftp配置文件路径 tftpcfg=/etc/xinetd.d/tftp # tftp根目录路径 tftprootdefault=/tftpboot # 创建tftpcfg文件,并将设定好的配置放入里面; tftp() { echo " service tftp { protocol = udp port = 69 socket_type = dgram wait = yes user = nobody server = /usr/sbin/in.tftpd server_args = $tftproot disable = no } " | sudo tee $tftpcfg > /dev/null check_status echo echo "$tftpcfg successfully created" } echo "--------------------------------------------------------------------------------" echo "Which directory do you want to be your tftp root directory?(if this directory does not exist it will be created for you)" # 采用默认的tftproot还是自定义路径,有这部分决定。 read -p "[ $tftprootdefault ] " tftproot if [ ! -n "$tftproot" ]; then tftproot=$tftprootdefault fi # # 1. 查看结果: # Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00$ ls -al # total 294792 # ...... # -rw-rw-r-- 1 Qt Qt 10 Aug 14 2015 .tftproot # Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00$ cat .tftproot # /tftpboot # 2. 由上面可知,确实生成了.tftproot文件,里面确实也是/tftpboot echo $tftproot > $cwd/../.tftproot echo "--------------------------------------------------------------------------------" echo echo "--------------------------------------------------------------------------------" echo "This step will set up the tftp server in the $tftproot directory." echo # 接下来需要设定tftp服务器,需要root权限。 echo "Note! This command requires you to have administrator priviliges (sudo access) " echo "on your host." read -p "Press return to continue" REPLY # 查看目录是否存在,如果存在,那么不用创建,如果不存在,那么就创建。 if [ -d $tftproot ]; then echo echo "$tftproot already exists, not creating.." else sudo mkdir -p $tftproot check_status sudo chmod 777 $tftproot check_status sudo chown nobody $tftproot check_status fi # # #platform # PLATFORM=am335x-evm # #defconfig # DEFCONFIG=singlecore-omap2plus_defconfig # #Architecture # ARCH=armv7-a # #u-boot machine # UBOOT_MACHINE=am335x_evm_config # #Points to the root of the TI SDK # export TI_SDK_PATH=/home/Qt/ti-processor-sdk-linux-am335x-evm-01.00.00.00 # #root of the target file system for installing applications # DESTDIR=/home/Qt/ti-processor-sdk-linux-am335x-evm-01.00.00.00/targetNFS # #Points to the root of the Linux libraries and headers matching the # #demo file system. # export LINUX_DEVKIT_PATH=$(TI_SDK_PATH)/linux-devkit # #Cross compiler prefix # export CROSS_COMPILE=$(LINUX_DEVKIT_PATH)/sysroots/i686-arago-linux/usr/bin/arm-linux-gnueabihf- # #Default CC value to be used when cross compiling. This is so that the # #GNU Make default of "cc" is not used to point to the host compiler # export CC=$(CROSS_COMPILE)gcc # #Location of environment-setup file # export ENV_SETUP=$(LINUX_DEVKIT_PATH)/environment-setup # #The directory that points to the SDK kernel source tree # LINUXKERNEL_INSTALL_DIR=$(TI_SDK_PATH)/board-support/linux-3.14.26-g2489c02 # CFLAGS= -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8 # SDK_PATH_TARGET=$(TI_SDK_PATH)/linux-devkit/sysroots/cortexa8t2hf-vfp-neon-linux-gnueabi/ # MAKE_JOBS=4 # platform=`cat $cwd/../Rules.make | grep -e "^PLATFORM=" | cut -d= -f2` kernelimage="zImage-""$platform"".bin" # 之前编译好的文件 kernelimagesrc=`ls -1 $cwd/../board-support/prebuilt-images/$kernelimage` # 如果tftp根目录下存在了对应的内核文件 if [ -f $tftproot/$kernelimage ]; then echo echo "$tftproot/$kernelimage already exists. The existing installed file can be renamed and saved under the new name." # 由用户决定是使用哪种方式,重命名还是重写。 echo "(r) rename (o) overwrite (s) skip copy " read -p "[r] " exists case "$exists" in s) echo "Skipping copy of $kernelimage, existing version will be used" ;; o) sudo cp $kernelimagesrc $tftproot check_status echo echo "Successfully overwritten $kernelimage in tftp root directory $tftproot" ;; *) dte="`date +%m%d%Y`_`date +%H`.`date +%M`" echo "New name for existing kernelimage: " # 默认用kernelimage名加上日期来代表老版本的文件名 read -p "[ $kernelimage.$dte ]" newname if [ ! -n "$newname" ]; then newname="$kernelimage.$dte" fi sudo mv "$tftproot/$kernelimage" "$tftproot/$newname" check_status sudo cp $kernelimagesrc $tftproot check_status echo echo "Successfully copied $kernelimage to tftp root directory $tftproot as $newname" ;; esac else # 当然如果文件本身就不存在,那么直接cp就行了。 sudo cp $kernelimagesrc $tftproot check_status echo echo "Successfully copied $kernelimage to tftp root directory $tftproot" fi dtbfiles=`cd $cwd/../board-support/prebuilt-images/;ls -1 *.dtb` prebuiltimagesdir=`cd $cwd/../board-support/prebuilt-images/ ; echo $PWD` # 这里跟前面的kernel操作差不多。 for dtbfile in $dtbfiles do if [ -f $tftproot/$dtbfile ]; then echo echo "$tftproot/$dtbfile already exists. The existing installed file can be renamed and saved under the new name." echo "(o) overwrite (s) skip copy " read -p "[o] " exists case "$exists" in s) echo "Skipping copy of $dtbfile, existing version will be used" ;; *) sudo cp "$prebuiltimagesdir/$dtbfile" $tftproot check_status echo echo "Successfully overwritten $$dtbfile in tftp root directory $tftproot" ;; esac else sudo cp "$prebuiltimagesdir/$dtbfile" $tftproot check_status echo echo "Successfully copied $dtbfile to tftp root directory $tftproot" fi done echo # 如果tftpcfg文件已经存在,需要查看tftp配置中的tftp根目录是否在我们需要的位置, # 如果不在,那么还是需要另外配置。 if [ -f $tftpcfg ]; then echo "$tftpcfg already exists.." #Use = instead of == for POSIX and dash shell compliance if [ "`cat $tftpcfg | grep server_args | cut -d= -f2 | sed 's/^[ ]*//'`" \ = "$tftproot" ]; then echo "$tftproot already exported for TFTP, skipping.." else echo "Copying old $tftpcfg to $tftpcfg.old" sudo cp $tftpcfg $tftpcfg.old check_status tftp fi else # 如果tftpcfg文件不存在,那么就创建tftp配置文件。 tftp fi echo echo "Restarting tftp server" sudo /etc/init.d/xinetd stop # stop tftp服务 check_status sleep 1 sudo /etc/init.d/xinetd start # start tftp服务使tftpcfg有效。 check_status echo "--------------------------------------------------------------------------------"