slitaz-arm annotate sat-rpi @ rev 50

Moved RPi custom system files to flavors/rpi and some small fixes
author Christophe Lincoln <pankso@slitaz.org>
date Tue Mar 11 00:10:34 2014 +0100 (2014-03-11)
parents 27666463d629
children bc8365a12dc7
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@49 18 boot="$distro/boot"
pankso@49 19 rootfs="$distro/rootfs"
pankso@49 20 rpi_git="$rpi/git"
pankso@49 21 kernel="$rpi_git/linux"
pankso@49 22 firmware="$rpi_git/firmware"
pankso@49 23 tools="$rpi_git/tools"
pankso@49 24
pankso@49 25 # URLs
pankso@49 26 rpi_mirror="http://mirror.slitaz.org/arm/rpi/"
pankso@49 27 fw_url="https://github.com/raspberrypi/firmware/raw/master/boot/"
pankso@49 28 tools_url="https://raw.github.com/raspberrypi/tools/master/mkimage/"
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 toolslist="imagetool-uncompressed.py args-uncompressed.txt \
pankso@49 34 boot-uncompressed.txt"
pankso@49 35
pankso@49 36 #
pankso@49 37 # Functions
pankso@49 38 #
pankso@49 39
pankso@49 40 usage() {
pankso@49 41 cat << EOT
pankso@49 42
pankso@49 43 $(boldify "Usage:") $(basename $0) [command] [--option]
pankso@49 44
pankso@49 45 SliTaz Raspberry Pi Tool
pankso@49 46
pankso@49 47 $(boldify "Commands:")
pankso@49 48 info Display paths and distro info
pankso@49 49 install Install SliTaz RPi to sdcard
pankso@49 50 gen Generate a new SliTaz RPi distro
pankso@49 51 cook-linux Build the Raspberry Pi Linux kernel
pankso@49 52 get-linux Get the SliTaz RPi linux package
pankso@49 53 get-fw Download or update minimal RPi firmware
pankso@49 54 clone-fw Clone the RPi firmware repository
pankso@49 55 get-tools Download or update RPi Tools (mkimage)
pankso@49 56 get-prebuilt Get a prebuilt SliTaz ARM toolchain
pankso@49 57 clean Clean the current work directory
pankso@49 58
pankso@49 59 $(boldify "Options:")
pankso@49 60 --up Update for commands: firmware, tools, kernel
pankso@49 61 --turbo Force the RPi to run at the highest arm_freq
pankso@49 62 --oclock= Set the RPi overclocking mode in config.txt
pankso@49 63 --vc Install the RPi VC libraries in /opt/vc
pankso@49 64 --nosat Don't regenerate the distro with sat
pankso@49 65 --git Remove RPi git files on clean up
pankso@49 66
pankso@49 67 EOT
pankso@49 68 }
pankso@49 69
pankso@49 70 error() {
pankso@49 71 echo "[ $(colorize 31 'ERROR') ] $@"
pankso@49 72 }
pankso@49 73
pankso@49 74 header() {
pankso@49 75 newline
pankso@49 76 boldify "$@"
pankso@49 77 separator
pankso@49 78 }
pankso@49 79
pankso@49 80 # Get minimal RPi firmware
pankso@49 81 get_fw() {
pankso@49 82 mkdir -p $firmware/boot
pankso@49 83 for fw in $fwlist
pankso@49 84 do
pankso@49 85 [ "$up" ] && rm -f $firmware/boot/$fw
pankso@49 86 if [ ! -f "$firmware/boot/$fw" ]; then
pankso@49 87 echo -n "Fetching: $fw"
pankso@49 88 wget -q --no-check-certificate ${fw_url}${fw} \
pankso@49 89 -O $firmware/boot/${fw}; status
pankso@49 90 fi
pankso@49 91 done
pankso@49 92 }
pankso@49 93
pankso@49 94 # Get all RPi firmware
pankso@49 95 clone_fw() {
pankso@49 96 [ -d "${rpi_git}/firmware" ] && return 0
pankso@49 97 mkdir -p ${rpi_git} && cd ${rpi_git}
pankso@49 98 git clone --depth 1 ${rpi_git_url}firmware.git
pankso@49 99 }
pankso@49 100
pankso@49 101 # Get RPi tools
pankso@49 102 get_tools() {
pankso@49 103 mkdir -p $tools
pankso@49 104 for t in $toolslist
pankso@49 105 do
pankso@49 106 [ "$up" ] && rm -f ${tools}/${t}
pankso@49 107 if [ ! -f "$tools/$t" ]; then
pankso@49 108 echo -n "Fetching: $t"
pankso@49 109 wget -q --no-check-certificate ${tools_url}${t} \
pankso@49 110 -O ${tools}/${t}; status
pankso@49 111 fi
pankso@49 112 done
pankso@49 113 }
pankso@49 114
pankso@49 115 # --> will move to tazberry
pankso@49 116 set_oclock() {
pankso@49 117 case "$oclock" in
pankso@49 118 none)
pankso@49 119 arm_freq=700
pankso@49 120 core_freq=250
pankso@49 121 sdram_freq=400
pankso@49 122 over_voltage=0 ;;
pankso@49 123 modest)
pankso@49 124 arm_freq=800
pankso@49 125 core_freq=300
pankso@49 126 sdram_freq=400
pankso@49 127 over_voltage=0 ;;
pankso@49 128 medium)
pankso@49 129 arm_freq=900
pankso@49 130 core_freq=333
pankso@49 131 sdram_freq=450
pankso@49 132 over_voltage=2 ;;
pankso@49 133 hight)
pankso@49 134 arm_freq=950
pankso@49 135 core_freq=450
pankso@49 136 sdram_freq=450
pankso@49 137 over_voltage=6 ;;
pankso@49 138 turbo)
pankso@49 139 arm_freq=1000
pankso@49 140 core_freq=500
pankso@49 141 sdram_freq=500
pankso@49 142 over_voltage=6 ;;
pankso@49 143 esac
pankso@49 144 cat >> ${boot}/config.txt << EOT
pankso@49 145 arm_freq=$arm_freq
pankso@49 146 core_freq=$core_freq
pankso@49 147 sdram_freq=$sdram_freq
pankso@49 148 over_voltage=$over_voltage
pankso@49 149 EOT
pankso@49 150 }
pankso@49 151
pankso@49 152 #
pankso@49 153 # Commands
pankso@49 154 #
pankso@49 155
pankso@49 156 case "$1" in
pankso@49 157 info)
pankso@49 158 header "SliTaz Raspberry Pi info"
pankso@49 159 echo "Firmware : $fwlist"
pankso@49 160 echo "RPi path : $rpi"
pankso@49 161 colorize 36 "/boot/cmdline.txt:"
pankso@49 162 cat ${boot}/cmdline.txt
pankso@49 163 colorize 36 "/boot/config.txt:"
pankso@49 164 cat ${boot}/config.txt
pankso@49 165 separator && newline ;;
pankso@49 166
pankso@49 167 install)
pankso@49 168 rpiboot="/media/rpi/boot"
pankso@49 169 rpiroot="/media/rpi/rootfs"
pankso@49 170 header "SliTaz Raspberry Pi install"
pankso@49 171 if [ ! "$dev" ]; then
pankso@49 172 echo "Missing: --dev= cmdline option"
pankso@49 173 newline && exit 1
pankso@49 174 fi
pankso@49 175
pankso@49 176 # Store sdcard partition(s) list
pankso@49 177 fdisk -l /dev/${dev} | grep "^/dev/$dev" | awk '{print $1}' \
pankso@49 178 > ${data}/sdcard.part
pankso@49 179 partnb=$(cat ${data}/sdcard.part | wc -l)
pankso@49 180 if [ "$partnb" != 3 ]; then
pankso@49 181 error "SliTaz RPi needs 3 partitions on the sdcard"
pankso@49 182 newline && exit 1
pankso@49 183 fi
pankso@49 184
pankso@49 185 # Mount sdcard
pankso@49 186 if mount | grep -q "^/dev/$dev[1-3]"; then
pankso@49 187 debug "Unmounting: /dev/$dev"
pankso@49 188 umount /dev/${dev}1 2>/dev/null || exit 1
pankso@49 189 umount /dev/${dev}3 2>/dev/null || exit 1
pankso@49 190 fi
pankso@49 191 echo -n "Mounting: /dev/$dev partitions"
pankso@49 192 mkdir -p ${rpiboot} ${rpiroot}
pankso@49 193 mount /dev/${dev}1 ${rpiboot}
pankso@49 194 mount /dev/${dev}3 ${rpiroot}; status
pankso@49 195 echo -n "Cleaning: filesystem directories"
pankso@49 196 for dir in bin dev etc lib media mnt proc sbin sys tmp usr var run
pankso@49 197 do
pankso@49 198 rm -rf ${rpiroot}/${dir}
pankso@49 199 done; status
pankso@49 200 echo -n "Installing: boot files"
pankso@49 201 cp -rf ${boot}/* ${rpiboot}; status
pankso@49 202 echo -n "Installing: rootfs files"
pankso@49 203 cp -a ${rootfs}/* ${rpiroot}; status
pankso@49 204
pankso@49 205 # Unmount
pankso@49 206 echo -n "Unmounting: RPi sdcard"
pankso@49 207 umount ${rpiboot} || exit 1
pankso@49 208 umount ${rpiroot} || exit 1
pankso@49 209 status
pankso@49 210
pankso@49 211 # Boot flag
pankso@49 212 #echo -n "Setting boot flag on: /dev/${dev}1"
pankso@49 213 #fdisk /dev/${dev} >/dev/null << EOF
pankso@49 214 #a
pankso@49 215 #1
pankso@49 216 #w
pankso@49 217 #EOF
pankso@49 218 #status
pankso@49 219 rm -f ${data}/sdcard.part
pankso@49 220 separator && newline ;;
pankso@49 221
pankso@49 222 ls-dev)
pankso@49 223 newline
pankso@49 224 fdisk -l | grep "^Disk /dev/sd*"
pankso@49 225 newline ;;
pankso@49 226
pankso@49 227 gen)
pankso@49 228 # Separate boot files since the Raspberry Pi boots off a FAT32 /boot
pankso@49 229 # partition on the sdcard.
pankso@49 230 : ${flavor=rpi}
pankso@49 231 : ${oclock=none}
pankso@49 232
pankso@49 233 # Use the rootfs generated by sat
pankso@49 234 if [ ! -x "/usr/bin/sat" ]; then
pankso@49 235 error "Sat is not installed" && exit 1
pankso@49 236 fi
pankso@49 237
pankso@49 238 # We may want to simply regenerate the RPi distro
pankso@49 239 if [ ! "$nosat" ]; then
pankso@50 240 sat gen --work="$work" --flavor="$flavor" --kmap --noinit --nolinux
pankso@49 241 fi
pankso@49 242
pankso@49 243 header "SliTaz Raspberry Pi distro"
pankso@49 244
pankso@49 245 # Boot firmware
pankso@49 246 echo -n "Copying: firmware files..."
pankso@49 247 mkdir -p ${boot} && get_fw
pankso@49 248 for fw in $fwlist
pankso@49 249 do
pankso@49 250 cp ${firmware}/boot/${fw} ${boot}
pankso@49 251 done
pankso@49 252 status
pankso@49 253
pankso@49 254 # TazBerry
pankso@49 255 echo -n "Installing TazBerry..."
pankso@49 256 cp -f ${rpi}/tazberry ${rootfs}/usr/bin
pankso@49 257 status
pankso@49 258
pankso@49 259 # Overclocking
pankso@49 260 echo -n "Setting: Overclocking..."
pankso@49 261 set_oclock; status
pankso@49 262
pankso@49 263 # Force turbo
pankso@49 264 if [ "$turbo" ]; then
pankso@49 265 if ! fgrep 'force_turbo=1' ${boot}/config.txt; then
pankso@49 266 echo -n "Config: force_turbo=1"
pankso@49 267 echo "force_turbo=1" >> ${boot}/config.txt; status
pankso@49 268 fi
pankso@49 269 fi
pankso@49 270
pankso@49 271 # RPi VC libraries
pankso@49 272 if [ "$vc" ]; then
pankso@49 273 vc="${rootfs}/opt/vc"
pankso@49 274 if [ ! -d "$firmware/opt/vc" ]; then
pankso@49 275 error "Missing firmware git repository" && exit 1
pankso@49 276 fi
pankso@49 277 echo -n "Copying: standard VC libraries"
pankso@49 278 cp -a ${firmware}/opt ${rootfs}
pankso@49 279 # --> armv6hf
pankso@49 280 #cp -a ${firmware}/hardfp/opt ${rootfs}
pankso@49 281 chown -R root.root ${rootfs}/opt
pankso@49 282 status
pankso@49 283 echo -n "Cleaning: VC libraries devel files"
pankso@49 284 cross_tools="/cross/${arch}/tools/bin"
pankso@49 285 rm -rf ${vc}/include ${vc}/src ${vc}/lib/*.a
pankso@49 286 ${cross_tools}/${arch}-slitaz-linux-gnueabi-strip -s ${vc}/lib/*.so
pankso@49 287 status
pankso@49 288 fi
pankso@49 289
pankso@49 290 # Kernel at last
pankso@49 291 . $data/linux-*/receipt
pankso@49 292 kvers="$VERSION"
pankso@49 293 kpkg="$rootfs/var/lib/tazpkg/installed/linux"
pankso@49 294 fs="$data/linux-$kvers/fs"
pankso@49 295 ksize=$(du -sh $fs | awk '{print $1}')
pankso@49 296 if [ -d "$fs" ]; then
pankso@49 297 echo -n "Copying: kernel $kvers ($ksize)"
pankso@49 298 rm -rf ${rootfs}/lib/modules
pankso@49 299 cp -rf ${fs}/lib/* ${rootfs}/lib
pankso@49 300 cp -f ${fs}/boot/* ${boot}
pankso@49 301 mkdir -p ${kpkg}
pankso@49 302 cd ${data}/linux-${kvers}
pankso@49 303 cp -f files.list md5sum receipt ${kpkg}
pankso@49 304 status
pankso@49 305 else
pankso@50 306 echo "SliTaz RPi Kernel: not used"
pankso@49 307 fi
pankso@49 308
pankso@49 309 separator
pankso@49 310 echo -n "Boot: $(du -sh $boot | awk '{print $1}') "
pankso@49 311 echo "- Rootfs: $(du -sh $rootfs | awk '{print $1}')"
pankso@49 312 newline ;;
pankso@49 313
pankso@49 314 cook-linux)
pankso@49 315 # Native SliTaz Toolchain and cross toolchain must be installed
pankso@49 316 check_root
pankso@49 317 install="$data/linux-install"
pankso@49 318 if [ ! -d "/cross/$arch" ]; then
pankso@49 319 error "Missing cross toolchain in: /cross/$arch"
pankso@49 320 exit 1
pankso@49 321 fi
pankso@49 322
pankso@49 323 # Kernel source
pankso@49 324 cd ${rpi_git}
pankso@49 325 [ -d "$kernel" ] || git clone --depth 1 ${rpi_git_url}linux.git
pankso@49 326
pankso@49 327 # Compile
pankso@49 328 if [ ! -d "$install" ]; then
pankso@49 329 cd ${kernel}
pankso@49 330 export PATH=$PATH:/cross/${arch}/tools/bin
pankso@49 331 export HOST_SYSTEM=${arch}-slitaz-linux-gnueabi
pankso@49 332 make mrproper &&
pankso@49 333 make ARCH=arm bcmrpi_defconfig
pankso@49 334 echo "Patching SliTaz RPi Linux .config"
pankso@49 335 patch -p1 -i ${rpi}/linux-rpi.config || exit 1
pankso@49 336 make ARCH=arm CROSS_COMPILE=${HOST_SYSTEM}- zImage &&
pankso@49 337 make ARCH=arm CROSS_COMPILE=${HOST_SYSTEM}- modules &&
pankso@49 338 make ARCH=arm CROSS_COMPILE=${HOST_SYSTEM}- \
pankso@49 339 INSTALL_MOD_PATH=${install} modules_install || exit 1
pankso@49 340 mkdir -p ${install}/boot
pankso@50 341 cp -a arch/arm/boot/zImage ${install}/boot/kernel.img
pankso@49 342 fi
pankso@49 343
pankso@49 344 # Kernel version
pankso@49 345 kvers=$(ls ${install}/lib/modules)
pankso@49 346 kvers=${kvers%-slitaz-rpi+}+
pankso@49 347
pankso@49 348 # Compress modules
pankso@49 349 cd ${install}/lib/modules/${kvers%+}-slitaz-rpi+/ || exit 1
pankso@49 350 mods=$(find . -name "*.ko$" | wc -l)
pankso@49 351 newline
pankso@49 352 echo "Compressing kernel modules: $mods"
pankso@49 353 find . -name "*.ko$" -exec gzip '{}' \; #2> /dev/null
pankso@50 354
pankso@49 355 # Rebuild modules.dep
pankso@49 356 cd ${install}
pankso@49 357 depmod -b . ${kvers%+}-slitaz-rpi+
pankso@49 358
pankso@50 359 # Kernel
pankso@49 360 fs="$data/linux-$kvers/fs"
pankso@49 361 echo "Kernel version: $kvers"
pankso@49 362 if [ -d "$install" ]; then
pankso@49 363 rm -rf ${data}/linux-${kvers}
pankso@49 364 mkdir -p ${data}/linux-${kvers}
pankso@49 365 cp -a ${install} ${fs}
pankso@50 366 rm -f ${fs}/lib/modules/*/build \
pankso@50 367 ${fs}/lib/modules/*/source
pankso@49 368 fi
pankso@50 369
pankso@50 370 #get_tools
pankso@50 371 #echo "Compressing: zImage to kernel.img"
pankso@50 372 #cd ${tools}
pankso@50 373 #python imagetool-uncompressed.py ${fs}/boot/zImage
pankso@50 374 #mv -f kernel.img ${fs}/boot && rm ${fs}/boot/zImage
pankso@50 375
pankso@50 376 # Pack .tazpkg
pankso@49 377 cd ${data}
pankso@49 378 echo "Creating package: receipt"
pankso@49 379 cat > linux-$kvers/receipt << EOT
pankso@49 380 # SliTaz package receipt
pankso@49 381
pankso@49 382 PACKAGE="linux"
pankso@49 383 VERSION="$kvers"
pankso@49 384 SHORT_DESC="SliTaz Linux Kernel for the Raspberry Pi."
pankso@49 385 WEB_SITE="http://www.kernel.org"
pankso@49 386
pankso@49 387 EOT
pankso@49 388 tazpkg pack linux-$kvers ;;
pankso@49 389
pankso@49 390 get-fw)
pankso@49 391 get_fw ;;
pankso@49 392
pankso@49 393 get-tools)
pankso@49 394 get_tools ;;
pankso@49 395
pankso@49 396 get-linux)
pankso@49 397 # Precook RPi kernel
pankso@49 398 mkdir -p ${data}
pankso@49 399
pankso@49 400 # Last version
pankso@49 401 rm -f ${data}/linux-version.txt
pankso@49 402 if busybox wget -q -s ${rpi_mirror}/last-linux.txt; then
pankso@49 403 echo -n "Fetching latest Kernel string..."
pankso@49 404 wget -q ${rpi_mirror}/last-linux.txt \
pankso@49 405 -O ${data}/linux-version.txt || exit 1
pankso@49 406 status
pankso@49 407 else
pankso@49 408 echo "Mirror is unreachable" && exit 1
pankso@49 409 fi
pankso@49 410 kvers=$(cat $data/linux-version.txt)
pankso@49 411 [ "$up" ] && rm -rf ${data}/linux-${kvers}*
pankso@49 412 echo "Kernel version: $kvers"
pankso@49 413
pankso@49 414 # Download
pankso@49 415 if [ ! -f "$data/linux-$kvers.tazpkg" ]; then
pankso@49 416 echo -n "Fetching latest Linux package..."
pankso@49 417 wget -q ${rpi_mirror}/linux-${kvers}.tazpkg \
pankso@49 418 -O ${data}/linux-${kvers}.tazpkg; status
pankso@49 419 fi
pankso@49 420
pankso@49 421 # Extract
pankso@49 422 if [ ! -d "$data/linux-$kvers" ]; then
pankso@49 423 cd ${data} && tazpkg extract linux-${kvers}.tazpkg
pankso@49 424 fi
pankso@49 425 rm -f ${data}/linux-version.txt ;;
pankso@49 426
pankso@49 427 get-prebuilt)
pankso@49 428 # --> in cross ??
pankso@49 429 : ${arch=arm}
pankso@49 430 name="slitaz-$arch-toolchain"
pankso@49 431 vers="20140304"
pankso@49 432 tarball="$name-$vers.tar.bz2"
pankso@49 433 url="http://mirror.slitaz.org/packages/cross/"
pankso@49 434 mkdir -p /cross
pankso@49 435 cd /cross
pankso@49 436 if [ ! -f "$tarball" ]; then
pankso@49 437 if busybox wget -qs ${url%/}/${tarball}; then
pankso@49 438 busybox wget ${url%/}/${tarball}
pankso@49 439 else
pankso@49 440 echo "Toolchain URL is unreachable" && exit 1
pankso@49 441 fi
pankso@49 442 fi
pankso@49 443 if [ ! -d "${name}-${vers}" ]; then
pankso@49 444 echo "Extracting: $tarball"
pankso@49 445 tar xjf ${tarball}
pankso@49 446 fi
pankso@49 447 echo "Copying: ${name}-${vers}/${arch}"
pankso@49 448 mkdir -p ${arch}
pankso@49 449 cp -a ${name}-${vers}/${arch}/* ${arch}
pankso@49 450 echo "Tools path: /cross/${arch}/tools/bin" ;;
pankso@49 451
pankso@49 452 clone-fw)
pankso@49 453 clone_fw ;;
pankso@49 454
pankso@49 455 release)
pankso@49 456 # Used to release official SliTaz RPi images
pankso@49 457 cd ${distro} || exit 1
pankso@49 458 if [ ! "$flavor" ]; then
pankso@49 459 . $distro/rootfs/etc/slitaz/flavor.conf || exit 1
pankso@49 460 flavor="$FLAVOR"
pankso@49 461 fi
pankso@49 462 dirname="slitaz-$flavor-$(date +%Y%m%d)"
pankso@49 463 dsize=$(du -sh $distro | awk '{print $1}' | cut -d "." -f 1)
pankso@49 464 mkdir ${dirname}
pankso@49 465 # To be continued...
pankso@49 466 ;;
pankso@49 467
pankso@49 468 clean)
pankso@49 469 echo "Cleaning: $rpi"
pankso@49 470 rm -rf ${data}
pankso@49 471 [ "$git" ] && rm -rf ${rpi_git} ;;
pankso@49 472 *) usage ;;
pankso@49 473 esac
pankso@49 474 exit 0