geninitrd/trunk/geninitrd
arekm
cvs at pld-linux.org
Mon Aug 14 11:30:15 CEST 2006
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
}
More information about the pld-cvs-commit
mailing list