slitaz-arm annotate sat-rpi @ rev 122

Full overcloking support in tazberry
author Christophe Lincoln <pankso@slitaz.org>
date Mon Apr 21 10:59:25 2014 +0200 (2014-04-21)
parents 73088f03f824
children aea5676e77c8
rev   line source
pankso@49 1 #!/bin/sh
pankso@49 2 #
pankso@49 3 # Sat RPi - SliTaz Raspberry Pi Build Tool
pankso@49 4 #
pankso@49 5 # Copyright (C) 2012-2014 SliTaz ARM - BSD License
pankso@49 6 # Author: Christophe Lincoln <pankso@slitaz.org>
pankso@49 7 #
pankso@49 8 . /lib/libtaz.sh
pankso@49 9
pankso@49 10 #: ${arch=armv6hf}
pankso@49 11 : ${arch=arm}
pankso@49 12
pankso@49 13 # Paths
pankso@49 14 [ "$work" ] || work="$(pwd)"
pankso@49 15 distro="$work/distro"
pankso@49 16 rpi="$work/rpi"
pankso@49 17 data="$rpi/data"
pankso@94 18 cache="$rpi/cache"
pankso@49 19 boot="$distro/boot"
pankso@49 20 rootfs="$distro/rootfs"
pankso@49 21 rpi_git="$rpi/git"
pankso@49 22 kernel="$rpi_git/linux"
pankso@49 23 firmware="$rpi_git/firmware"
pankso@67 24 dev="$2"
pankso@49 25
pankso@49 26 # URLs
pankso@49 27 rpi_mirror="http://mirror.slitaz.org/arm/rpi/"
pankso@49 28 fw_url="https://github.com/raspberrypi/firmware/raw/master/boot/"
pankso@49 29 rpi_git_url="git://github.com/raspberrypi/"
pankso@49 30
pankso@49 31 # Lists
pankso@49 32 fwlist="bootcode.bin fixup.dat start.elf"
pankso@49 33
pankso@49 34 #
pankso@49 35 # Functions
pankso@49 36 #
pankso@49 37
pankso@49 38 usage() {
pankso@49 39 cat << EOT
pankso@49 40
pankso@49 41 $(boldify "Usage:") $(basename $0) [command] [--option]
pankso@49 42
pankso@49 43 SliTaz Raspberry Pi Tool
pankso@49 44
pankso@49 45 $(boldify "Commands:")
pankso@49 46 info Display paths and distro info
pankso@49 47 install Install SliTaz RPi to sdcard
pankso@49 48 gen Generate a new SliTaz RPi distro
pankso@49 49 cook-linux Build the Raspberry Pi Linux kernel
pankso@49 50 get-linux Get the SliTaz RPi linux package
pankso@49 51 get-fw Download or update minimal RPi firmware
pankso@49 52 clone-fw Clone the RPi firmware repository
pankso@49 53 get-prebuilt Get a prebuilt SliTaz ARM toolchain
pankso@49 54 clean Clean the current work directory
paul@85 55 release Release an installable tarball
pankso@49 56
pankso@49 57 $(boldify "Options:")
pankso@67 58 --up Update for commands: firmware and kernel
pankso@49 59 --vc Install the RPi VC libraries in /opt/vc
pankso@49 60 --nosat Don't regenerate the distro with sat
pankso@49 61
pankso@49 62 EOT
pankso@49 63 }
pankso@49 64
pankso@49 65 error() {
pankso@49 66 echo "[ $(colorize 31 'ERROR') ] $@"
pankso@49 67 }
pankso@49 68
pankso@49 69 header() {
pankso@67 70 newline && colorize 35 "$@" && separator
pankso@49 71 }
pankso@49 72
pankso@49 73 # Get minimal RPi firmware
pankso@49 74 get_fw() {
pankso@49 75 mkdir -p $firmware/boot
pankso@49 76 for fw in $fwlist
pankso@49 77 do
pankso@49 78 [ "$up" ] && rm -f $firmware/boot/$fw
pankso@49 79 if [ ! -f "$firmware/boot/$fw" ]; then
pankso@49 80 echo -n "Fetching: $fw"
pankso@49 81 wget -q --no-check-certificate ${fw_url}${fw} \
pankso@49 82 -O $firmware/boot/${fw}; status
pankso@49 83 fi
pankso@49 84 done
pankso@49 85 }
pankso@49 86
pankso@49 87 # Get all RPi firmware
pankso@49 88 clone_fw() {
pankso@49 89 [ -d "${rpi_git}/firmware" ] && return 0
pankso@49 90 mkdir -p ${rpi_git} && cd ${rpi_git}
pankso@49 91 git clone --depth 1 ${rpi_git_url}firmware.git
pankso@49 92 }
pankso@49 93
pankso@67 94 umount_sd() {
pankso@67 95 umount /dev/${dev}1 2>/dev/null || exit 1
pankso@67 96 umount /dev/${dev}3 2>/dev/null || exit 1
pankso@67 97 }
pankso@67 98
pankso@49 99 #
pankso@49 100 # Commands
pankso@49 101 #
pankso@49 102
pankso@49 103 case "$1" in
pankso@49 104 info)
pankso@49 105 header "SliTaz Raspberry Pi info"
pankso@49 106 echo "Firmware : $fwlist"
pankso@49 107 echo "RPi path : $rpi"
pankso@49 108 colorize 36 "/boot/cmdline.txt:"
pankso@49 109 cat ${boot}/cmdline.txt
pankso@49 110 colorize 36 "/boot/config.txt:"
pankso@49 111 cat ${boot}/config.txt
pankso@49 112 separator && newline ;;
pankso@49 113
pankso@49 114 install)
pankso@49 115 rpiboot="/media/rpi/boot"
pankso@49 116 rpiroot="/media/rpi/rootfs"
pankso@49 117 header "SliTaz Raspberry Pi install"
pankso@69 118 if [ ! "$dev" ]; then
pankso@69 119 echo -n "SD card disk name (ex sdc): "; read dev
pankso@69 120 fi
pankso@69 121 [ ! "$dev" ] && exit 1
pankso@49 122
pankso@49 123 # Store sdcard partition(s) list
pankso@49 124 fdisk -l /dev/${dev} | grep "^/dev/$dev" | awk '{print $1}' \
pankso@94 125 > ${cache}/sdcard.part
pankso@94 126 partnb=$(cat ${cache}/sdcard.part | wc -l)
pankso@49 127 if [ "$partnb" != 3 ]; then
pankso@49 128 error "SliTaz RPi needs 3 partitions on the sdcard"
pankso@49 129 newline && exit 1
pankso@49 130 fi
pankso@49 131
pankso@49 132 # Mount sdcard
pankso@49 133 if mount | grep -q "^/dev/$dev[1-3]"; then
pankso@49 134 debug "Unmounting: /dev/$dev"
pankso@67 135 umount_sd
pankso@49 136 fi
pankso@49 137 echo -n "Mounting: /dev/$dev partitions"
pankso@49 138 mkdir -p ${rpiboot} ${rpiroot}
pankso@58 139 mount /dev/${dev}1 ${rpiboot} || exit 1
pankso@58 140 mount /dev/${dev}3 ${rpiroot} || exit 1
pankso@58 141 status
pankso@49 142 echo -n "Cleaning: filesystem directories"
pankso@49 143 for dir in bin dev etc lib media mnt proc sbin sys tmp usr var run
pankso@49 144 do
pankso@49 145 rm -rf ${rpiroot}/${dir}
pankso@49 146 done; status
pankso@49 147 echo -n "Installing: boot files"
pankso@49 148 cp -rf ${boot}/* ${rpiboot}; status
pankso@49 149 echo -n "Installing: rootfs files"
pankso@49 150 cp -a ${rootfs}/* ${rpiroot}; status
pankso@49 151
pankso@49 152 # Unmount
pankso@49 153 echo -n "Unmounting: RPi sdcard"
pankso@67 154 umount_sd; status
pankso@49 155
pankso@94 156 rm -f ${cache}/sdcard.part
pankso@67 157 separator
pankso@67 158 echo "Insert the SD card into your Raspberry Pi and boot!"
pankso@67 159 newline ;;
pankso@122 160
pankso@49 161 gen)
pankso@49 162 # Separate boot files since the Raspberry Pi boots off a FAT32 /boot
pankso@49 163 # partition on the sdcard.
pankso@54 164 : ${flavor=rpi-base}
pankso@49 165 : ${oclock=none}
pankso@49 166
pankso@49 167 # Use the rootfs generated by sat
pankso@49 168 if [ ! -x "/usr/bin/sat" ]; then
pankso@49 169 error "Sat is not installed" && exit 1
pankso@49 170 fi
pankso@55 171 check_root
pankso@49 172
pankso@49 173 # We may want to simply regenerate the RPi distro
pankso@49 174 if [ ! "$nosat" ]; then
pankso@57 175 sat gen --work="$work" --flavor="$flavor" --noinit --nolinux
pankso@58 176 else
pankso@58 177 newline
pankso@49 178 fi
pankso@49 179
pankso@67 180 colorize 35 "SliTaz Raspberry Pi distro"
pankso@58 181 separator
pankso@63 182 mkdir -p ${boot}
pankso@49 183
pankso@62 184 # Custom RPi rootfs: make sure all files belong to root
pankso@62 185 if [ -d "$rpi/rootfs" ]; then
pankso@62 186 size=$(du -sh $rpi/rootfs | awk '{print $1}')
pankso@62 187 echo -n "Copying custom RPi rootfs: $size"
pankso@62 188 tmp=$distro/tmp-$$
pankso@62 189 mkdir -p $tmp
pankso@62 190 cp -r $rpi/rootfs/* $tmp
pankso@62 191 chown -R root.root $tmp
pankso@62 192 cp -a $tmp/* ${rootfs} && rm -rf $tmp
pankso@63 193 mv -f ${rootfs}/boot/* ${boot}
pankso@62 194 status
pankso@62 195 fi
pankso@62 196
pankso@49 197 # Boot firmware
pankso@49 198 echo -n "Copying: firmware files..."
pankso@63 199 get_fw
pankso@49 200 for fw in $fwlist
pankso@49 201 do
pankso@49 202 cp ${firmware}/boot/${fw} ${boot}
pankso@49 203 done
pankso@49 204 status
pankso@49 205
pankso@67 206 # TazBerry
pankso@119 207 echo -n "Copying utility: TazBerry..."
pankso@55 208 cp -f ${rpi}/tazberry ${rootfs}/usr/bin
pankso@58 209 cp -a ${rpi}/cgi-adm/* ${rootfs}/var/www/adm
pankso@49 210 status
pankso@49 211
pankso@119 212 # PiBoot
pankso@119 213 echo -n "Copying bootloader: PiBoot..."
pankso@119 214 cp -f ${rpi}/piboot ${rootfs}/sbin
pankso@119 215 status
pankso@119 216
pankso@49 217 # RPi VC libraries
pankso@49 218 if [ "$vc" ]; then
pankso@49 219 vc="${rootfs}/opt/vc"
pankso@49 220 if [ ! -d "$firmware/opt/vc" ]; then
pankso@49 221 error "Missing firmware git repository" && exit 1
pankso@49 222 fi
pankso@49 223 echo -n "Copying: standard VC libraries"
pankso@49 224 cp -a ${firmware}/opt ${rootfs}
pankso@49 225 # --> armv6hf
pankso@49 226 #cp -a ${firmware}/hardfp/opt ${rootfs}
pankso@49 227 chown -R root.root ${rootfs}/opt
pankso@49 228 status
pankso@49 229 echo -n "Cleaning: VC libraries devel files"
pankso@49 230 cross_tools="/cross/${arch}/tools/bin"
pankso@49 231 rm -rf ${vc}/include ${vc}/src ${vc}/lib/*.a
pankso@49 232 ${cross_tools}/${arch}-slitaz-linux-gnueabi-strip -s ${vc}/lib/*.so
pankso@49 233 status
paul@121 234 echo -n "Adding: VC binaries to PATH"
pankso@120 235 echo -e '\n# Raspberry Pi VC tools' >> ${rootfs}/etc/profile
pankso@120 236 echo 'export PATH=$PATH:/opt/vc/bin' >> ${rootfs}/etc/profile
pankso@120 237 status
pankso@49 238 fi
pankso@49 239
pankso@49 240 # Kernel at last
pankso@94 241 . $cache/linux-*/receipt
pankso@49 242 kvers="$VERSION"
pankso@49 243 kpkg="$rootfs/var/lib/tazpkg/installed/linux"
pankso@94 244 fs="$cache/linux-$kvers/fs"
pankso@49 245 ksize=$(du -sh $fs | awk '{print $1}')
pankso@49 246 if [ -d "$fs" ]; then
pankso@49 247 echo -n "Copying: kernel $kvers ($ksize)"
pankso@49 248 rm -rf ${rootfs}/lib/modules
pankso@49 249 cp -rf ${fs}/lib/* ${rootfs}/lib
pankso@49 250 cp -f ${fs}/boot/* ${boot}
pankso@49 251 mkdir -p ${kpkg}
pankso@94 252 cd ${cache}/linux-${kvers}
pankso@49 253 cp -f files.list md5sum receipt ${kpkg}
pankso@49 254 status
pankso@49 255 else
pankso@50 256 echo "SliTaz RPi Kernel: not used"
pankso@49 257 fi
pankso@49 258
pankso@49 259 separator
pankso@49 260 echo -n "Boot: $(du -sh $boot | awk '{print $1}') "
pankso@49 261 echo "- Rootfs: $(du -sh $rootfs | awk '{print $1}')"
pankso@49 262 newline ;;
pankso@49 263
pankso@49 264 cook-linux)
pankso@49 265 # Native SliTaz Toolchain and cross toolchain must be installed
pankso@49 266 check_root
pankso@94 267 install="$cache/linux-install"
pankso@49 268 if [ ! -d "/cross/$arch" ]; then
pankso@67 269 error "Missing cross toolchain in: /cross/$arch" && exit 1
pankso@49 270 fi
pankso@49 271
pankso@49 272 # Kernel source
pankso@49 273 cd ${rpi_git}
pankso@49 274 [ -d "$kernel" ] || git clone --depth 1 ${rpi_git_url}linux.git
pankso@49 275
pankso@49 276 # Compile
pankso@52 277 [ "$clean" ] && rm -rf ${install}
pankso@49 278 if [ ! -d "$install" ]; then
pankso@49 279 cd ${kernel}
pankso@49 280 export PATH=$PATH:/cross/${arch}/tools/bin
pankso@49 281 export HOST_SYSTEM=${arch}-slitaz-linux-gnueabi
pankso@49 282 make mrproper &&
pankso@49 283 make ARCH=arm bcmrpi_defconfig
pankso@49 284 echo "Patching SliTaz RPi Linux .config"
pankso@94 285 patch -p0 -i ${data}/linux-rpi.patch || exit 1
pankso@49 286 make ARCH=arm CROSS_COMPILE=${HOST_SYSTEM}- zImage &&
pankso@49 287 make ARCH=arm CROSS_COMPILE=${HOST_SYSTEM}- modules &&
pankso@49 288 make ARCH=arm CROSS_COMPILE=${HOST_SYSTEM}- \
pankso@49 289 INSTALL_MOD_PATH=${install} modules_install || exit 1
pankso@49 290 mkdir -p ${install}/boot
pankso@50 291 cp -a arch/arm/boot/zImage ${install}/boot/kernel.img
pankso@49 292 fi
pankso@49 293
pankso@49 294 # Kernel version
pankso@49 295 kvers=$(ls ${install}/lib/modules)
pankso@49 296 kvers=${kvers%-slitaz-rpi+}+
pankso@49 297
pankso@49 298 # Compress modules
pankso@49 299 cd ${install}/lib/modules/${kvers%+}-slitaz-rpi+/ || exit 1
pankso@49 300 mods=$(find . -name "*.ko$" | wc -l)
pankso@49 301 newline
pankso@49 302 echo "Compressing kernel modules: $mods"
pankso@49 303 find . -name "*.ko$" -exec gzip '{}' \; #2> /dev/null
pankso@50 304
pankso@49 305 # Rebuild modules.dep
pankso@49 306 cd ${install}
pankso@49 307 depmod -b . ${kvers%+}-slitaz-rpi+
pankso@49 308
pankso@50 309 # Kernel
pankso@94 310 fs="$cache/linux-$kvers/fs"
pankso@49 311 echo "Kernel version: $kvers"
pankso@49 312 if [ -d "$install" ]; then
pankso@94 313 rm -rf ${cache}/linux-${kvers}
pankso@94 314 mkdir -p ${cache}/linux-${kvers}
pankso@49 315 cp -a ${install} ${fs}
pankso@50 316 rm -f ${fs}/lib/modules/*/build \
pankso@50 317 ${fs}/lib/modules/*/source
pankso@49 318 fi
pankso@50 319
pankso@50 320 # Pack .tazpkg
pankso@94 321 cd ${cache}
pankso@49 322 echo "Creating package: receipt"
pankso@49 323 cat > linux-$kvers/receipt << EOT
pankso@49 324 # SliTaz package receipt
pankso@49 325
pankso@49 326 PACKAGE="linux"
pankso@49 327 VERSION="$kvers"
pankso@49 328 SHORT_DESC="SliTaz Linux Kernel for the Raspberry Pi."
pankso@49 329 WEB_SITE="http://www.kernel.org"
pankso@49 330
pankso@49 331 EOT
pankso@49 332 tazpkg pack linux-$kvers ;;
pankso@49 333
pankso@49 334 get-fw)
pankso@49 335 get_fw ;;
pankso@67 336
pankso@67 337 clone-fw)
pankso@67 338 clone_fw ;;
pankso@49 339
pankso@49 340 get-linux)
pankso@49 341 # Precook RPi kernel
pankso@55 342 check_root
pankso@94 343 mkdir -p ${cache}
pankso@49 344
pankso@49 345 # Last version
pankso@94 346 rm -f ${cache}/linux-version.txt
pankso@49 347 if busybox wget -q -s ${rpi_mirror}/last-linux.txt; then
pankso@49 348 echo -n "Fetching latest Kernel string..."
pankso@49 349 wget -q ${rpi_mirror}/last-linux.txt \
pankso@94 350 -O ${cache}/linux-version.txt || exit 1
pankso@49 351 status
pankso@49 352 else
pankso@49 353 echo "Mirror is unreachable" && exit 1
pankso@49 354 fi
pankso@94 355 kvers=$(cat $cache/linux-version.txt)
pankso@94 356 [ "$up" ] && rm -rf ${cache}/linux-${kvers}*
pankso@49 357 echo "Kernel version: $kvers"
pankso@49 358
pankso@49 359 # Download
pankso@94 360 if [ ! -f "$cache/linux-$kvers.tazpkg" ]; then
pankso@49 361 echo -n "Fetching latest Linux package..."
pankso@49 362 wget -q ${rpi_mirror}/linux-${kvers}.tazpkg \
pankso@94 363 -O ${cache}/linux-${kvers}.tazpkg; status
pankso@49 364 fi
pankso@49 365
pankso@49 366 # Extract
pankso@94 367 if [ ! -d "$cache/linux-$kvers" ]; then
pankso@94 368 cd ${cache} && tazpkg extract linux-${kvers}.tazpkg
pankso@49 369 fi
pankso@94 370 rm -f ${cache}/linux-version.txt ;;
pankso@49 371
pankso@49 372 get-prebuilt)
pankso@49 373 # --> in cross ??
pankso@49 374 : ${arch=arm}
pankso@49 375 name="slitaz-$arch-toolchain"
pankso@49 376 vers="20140304"
pankso@49 377 tarball="$name-$vers.tar.bz2"
pankso@49 378 url="http://mirror.slitaz.org/packages/cross/"
pankso@49 379 mkdir -p /cross
pankso@49 380 cd /cross
pankso@49 381 if [ ! -f "$tarball" ]; then
pankso@49 382 if busybox wget -qs ${url%/}/${tarball}; then
pankso@49 383 busybox wget ${url%/}/${tarball}
pankso@49 384 else
pankso@49 385 echo "Toolchain URL is unreachable" && exit 1
pankso@49 386 fi
pankso@49 387 fi
pankso@49 388 if [ ! -d "${name}-${vers}" ]; then
pankso@49 389 echo "Extracting: $tarball"
pankso@49 390 tar xjf ${tarball}
pankso@49 391 fi
pankso@49 392 echo "Copying: ${name}-${vers}/${arch}"
pankso@49 393 mkdir -p ${arch}
pankso@49 394 cp -a ${name}-${vers}/${arch}/* ${arch}
pankso@49 395 echo "Tools path: /cross/${arch}/tools/bin" ;;
pankso@49 396
pankso@49 397 release)
pankso@49 398 # Used to release official SliTaz RPi images
pankso@49 399 cd ${distro} || exit 1
pankso@49 400 if [ ! "$flavor" ]; then
pankso@49 401 . $distro/rootfs/etc/slitaz/flavor.conf || exit 1
pankso@49 402 flavor="$FLAVOR"
pankso@49 403 fi
pankso@54 404 dname="slitaz-$flavor-$(date +%Y%m%d)"
pankso@49 405 dsize=$(du -sh $distro | awk '{print $1}' | cut -d "." -f 1)
pankso@54 406 rm -rf ${dname} && mkdir ${dname}
pankso@54 407 cp -a boot rootfs ${dname}
pankso@67 408 echo "Copying: SliTaz release files"
pankso@67 409 cp ${rpi}/release/* ${dname}
pankso@84 410 echo "Creating: ${dname}.tar.bz2"
pankso@84 411 tar -cjf ${dname}.tar.bz2 ${dname}
pankso@55 412 echo "Creating: ${dname}.md5"
pankso@84 413 md5sum ${dname}.tar.bz2 > ${dname}.md5
pankso@55 414 rm -rf ${dname} ;;
pankso@49 415
pankso@49 416 clean)
pankso@49 417 echo "Cleaning: $rpi"
pankso@94 418 rm -rf ${cache} ${rpi_git} ;;
pankso@67 419
pankso@67 420 *|*help) usage ;;
pankso@49 421 esac
pankso@49 422 exit 0