Author: arekm Date: Mon Aug 14 11:30:08 2006 New Revision: 7669 Modified: geninitrd/trunk/geninitrd Log: Initial firmware loading capabilities.
Modified: geninitrd/trunk/geninitrd ============================================================================== --- geninitrd/trunk/geninitrd (original) +++ geninitrd/trunk/geninitrd Mon Aug 14 11:30:08 2006 @@ -656,6 +656,57 @@ fi } +firmware_install_module_pre() { + module="$1" + linuxrc="$2" + firmware_files="$3" + + [ -n "$verbose" ] && echo "Adding Firmwares ($firmware_files) to initrd for module $module" + # firmware not yet installed + if [ ! -f "$MNTIMAGE/lib/firmware/firmware.sh" ]; then + mkdir -p $MNTIMAGE/lib/firmware +cat << 'EOF' >> "$MNTIMAGE/lib/firmware/firmware.sh" +#!/bin/sh -e + +FIRMWARE_DIRS="/lib/firmware" + +if [ ! -e /sys$DEVPATH/loading ]; then + echo "firmware loader misses sysfs directory" >&2 + exit 1 +fi + +for DIR in $FIRMWARE_DIRS; do + [ -e "$DIR/$FIRMWARE" ] || continue + echo 1 > /sys$DEVPATH/loading + cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data + echo 0 > /sys$DEVPATH/loading + exit 0 +done + +echo -1 > /sys$DEVPATH/loading +echo "Cannot find firmware file '$FIRMWARE'" >&2 +exit 1 +EOF + chmod 755 "$MNTIMAGE/lib/firmware/firmware.sh" + fi + + for firmware in $firmware_files; do + inst "/lib/firmware/$firmware" "$MNTIMAGE/lib/firmware/$firmware" + done + + echo "mount -t proc none /proc" >> "$linuxrc" + echo "mount -t sysfs none /sys" >> "$linuxrc" + echo -n "/lib/firmware/firmware.sh" > /proc/sys/kernel/hotplug +} + +firmware_install_module_post() { + module="$1" + linuxrc="$2" + firmware_files="$3" + echo "umount /sys" >> "$linuxrc" + echo "umount /proc" >> "$linuxrc" +} + modules_install() { modules="$1" @@ -678,8 +729,9 @@ module="`echo $mod | awk -F/ '{ $0=$NF } /'$modext'.*$/ { gsub(/'$modext'.*/, NIL, $0); } { print $0; }'`" options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`" - sleep_module=$(echo "${module}" | awk ' { gsub("-", "_", $0) } { print $0; } ') - sleep_var="$(eval echo \$MODULE_${sleep_module}_USLEEP)" + generic_module=$(echo "${module}" | awk ' { gsub("-", "_", $0) } { print $0; } ') + sleep_var="$(eval echo \$MODULE_${generic_module}_USLEEP)" + firmware_var="$(eval echo \$MODULE_${generic_module}_FIRMWARE)" if [ -n "$verbose" ]; then echo -n "Loading module [$module] " @@ -695,10 +747,16 @@ fi fi + if [ -n "$firmware_var" ]; then + firmware_install_module_pre "$module" "$linuxrc" "$firmware_var" + fi echo "$insmod /lib/modules/$kernel/$MODULE2 $options" >> "$linuxrc" if [ -n "${sleep_var}" ]; then echo "usleep $sleep_var" >> "$linuxrc" fi + if [ -n "$firmware_var" ]; then + firmware_install_module_post "$module" "$linuxrc" "$firmware_var" + fi done } _______________________________________________ pld-cvs-commit mailing list pld-cvs-commit@lists.pld-linux.org http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit