105 lines
2.2 KiB
Bash
105 lines
2.2 KiB
Bash
#!/bin/sh
|
|
|
|
OPTION=FRAMEBUFFER
|
|
PREREQ="udev"
|
|
prereqs()
|
|
{
|
|
echo "$PREREQ"
|
|
}
|
|
case $1 in
|
|
# get pre-requisites
|
|
prereqs)
|
|
prereqs
|
|
exit 0
|
|
;;
|
|
esac
|
|
|
|
|
|
# The options part of the kernel "video=" argument (i.e. everyting
|
|
# after "video=<fbdriver>:") has very inconsistent rules.
|
|
#
|
|
# Generally the following applies:
|
|
# 1) options are comma-separated
|
|
# 2) options can be in either of these three forms:
|
|
# <arg>=<value>, <arg>:<value>, <boolean-arg>.
|
|
# 3) the "mode" option has the form <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m]
|
|
# and may or may not start with "mode="
|
|
#
|
|
# When the options are used with modules, they need to be space-separated
|
|
# and the following conversions are needed:
|
|
# <arg>:<value> -> <arg>=<value>
|
|
# <boolean-arg> -> <boolean-arg>=1
|
|
# <modevalue> -> mode=<modevalue>
|
|
parse_video_opts()
|
|
{
|
|
local OPTS="$1"
|
|
local IFS=","
|
|
|
|
# Must be a line like video=<fbdriver>:<opt1>,[opt2]...
|
|
if [ "${OPTS}" = "${OPTS%%:*}" ]; then
|
|
return
|
|
fi
|
|
OPTS="${OPTS#*:}"
|
|
for opt in ${OPTS}; do
|
|
# Already in the "<arg>=<value>" form
|
|
if [ "${opt}" != "${opt#*=}" ]; then
|
|
echo -n "$opt "
|
|
# In the "<arg>:<value>" form
|
|
elif [ "${opt}" != "${opt#*:}" ]; then
|
|
echo -n "${opt%:*}=${opt#*:} "
|
|
# Presumably a modevalue without the "mode=" prefix
|
|
elif [ "${opt}" != "${opt#[0-9]*x[0-9]}" ]; then
|
|
echo -n "mode=$opt "
|
|
# Presumably a boolean
|
|
else
|
|
echo -n "${opt}=1 "
|
|
fi
|
|
done
|
|
}
|
|
|
|
FB=""
|
|
OPTS=""
|
|
|
|
for x in $(cat /proc/cmdline); do
|
|
case ${x} in
|
|
vga=*)
|
|
FB="vesafb";
|
|
OPTS="";
|
|
;;
|
|
video=*)
|
|
FB=${x#*=}
|
|
FB="${FB%%:*}"
|
|
OPTS="$(parse_video_opts "${x}")"
|
|
esac
|
|
done
|
|
|
|
# Map command line name to module name
|
|
case ${FB} in
|
|
matroxfb)
|
|
FB=matroxfb_base
|
|
;;
|
|
esac
|
|
|
|
if [ -n "${FB}" ]; then
|
|
# Some framebuffer devices need character devices :-/
|
|
udevadm settle
|
|
MODPROBE_OPTIONS=-q modprobe ${FB} ${OPTS}
|
|
# Wait for the framebuffer devices to be ready
|
|
udevadm settle
|
|
else
|
|
# If we have no graphics devices yet, wait for udev to settle
|
|
[ -d /sys/class/graphics/fbcon ] || udevadm settle
|
|
[ -d /sys/class/graphics/fb0 ] || udevadm settle
|
|
[ -d /sys/class/drm/card0 ] || udevadm settle
|
|
fi
|
|
|
|
# Force fb mode via /sys interface
|
|
for x in $(cat /proc/cmdline); do
|
|
case ${x} in
|
|
fbmode=*)
|
|
MODE=${x#*=}
|
|
echo "$MODE" > /sys/class/graphics/fb0/mode
|
|
;;
|
|
esac
|
|
done
|