summaryrefslogblamecommitdiffstats
path: root/initrd/initrd-stuff/bin/hwautocfg
blob: 75470349d09cc5db521c9f5977cdd9427f2781b3 (plain) (tree)
1
2
3
4
5
6
7
8
9
10





                                                                          

                                                               

                                                          
 
                      
 
                                       




                            
                                                   



































                                                                   
                         
                                           
                       

                                        

                           



























                                                                         
 
 



                                        
                                                      
              
                                   
    

                                                      

                                                                                               



                                                                                         




                                                                          
  
 




                                                                                

                  


                                                                       

                  
                                                                                
                                                                  
                           
  
              
 






                                                               
                                       






                                                                 
                                  





                                                   

                                                                    

                                                            

                                                                                  




































                                                                             



                                                                      

                                   



                                                         
                                                                 








                                    











                                                                       
                                                 
                               
 
                            

                                         
    

                                                                          



                                                  
                            
 
                                                                      

                                                                      
                                                                      
                      
                                                    
                                                    




                                                    
                                 

                                                                        
 



                                                                   
                                               
                                                                     
 
                                                             
                           





                                                         
                              


                                                                          
 


                                                                


                                                                 



                                           
                                             
                                                             
                                               
                  


                                           
                                                     

                                                     
             


                                           





                                                                       

                                      
                                               
                     

                                           
                                                       



                                     
                            
 
                                     
                                               






                                                 
                            


                                 



                                               
                                                     






                                                                      


                                                                       
                                                                      
                                                     
                                           


                                                                      
                                                         
 
                             
                       

                                                                    
                                                                  
                                                                 
  
 

                                            
                                                                        
                                                               
  
                                                 







                                                                          

















                                                                          

                                                        
 



                                                 

                                                                        




                                                                 
                                                                         



                                                                         
                                      
                                                            
                                          

                                                                         
         







                                                                   
    
                                                                  
                                                   
 







                                                                  
  
                                           
                         
                                   

                            
#!/bin/sh
#
# Description:  universal (distro independent) hardware autoconfiguration 
#		script for linux diskless clients, using hwconfig from 
#		knoppix as base tool 
#
# Author(s):    Dirk von Suchodoletz <dirk@goe.net>, 09-04-2006
#		Felix Endres
#
# Copyright:    (c) 2003 - 2006 - RZ Universitaet Freiburg
#
# Version:      0.3.2a

# local functions used within hwautocfg
displaysetup () {
local xfc=$1
# define some defaults
local HSYNCRANGE="31.5-63.5"
local VSYNCRANGE="60-90"
local DEFAULTMODES='"1024x768" "800x600" "640x480"'
local DEFAULTCOLORDPT=24
# set variables representing the xorg.conf sections (version 6.8.x)
local Module='\tLoad\t\t"dbe"\n
\tLoad\t\t"extmod"\n
\tLoad\t\t"type1"\n
\tLoad\t\t"speedo"\n
\tLoad\t\t"freetype"\n
\tLoad\t\t"v4l"'
local ServerFlags='\tOption\t\t"AllowMouseOpenFail"\n
\tOption\t\t"blank time"\t\t"5"\n
\tOption\t\t"standby time"\t\t"10"\n
\tOption\t\t"suspend time"\t\t"15"\n
\tOption\t\t"off time"\t\t"20"'
local Files='\tRgbPath\t\t"/usr/X11R6/lib/X11/rgb"\n
\tModulePath\t"/etc/X11/modules"\n
\tModulePath\t"/usr/X11R6/lib/modules"\n
\tFontPath\t"/usr/X11R6/lib/X11/fonts/misc/:unscaled"\n
\tFontPath\t"/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"\n
\tFontPath\t"/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"'
local InputDevice='\tIdentifier\t"Keyboard1"\n
\tDriver\t\t"keyboard"\n
\tOption\t\t"XkbRules"\t\t"xfree86"\n
\tOption\t\t"XkbLayout"\t\t"XKEYBOARD"\n
\tOption\t\t"XkbModel"\t\t"pc105"'
local InputMouseDef='\tIdentifier  "Mouse1"\n
\tDriver\t\t"mouse"\n
\tOption\t\t"Protocol"\t\t"imps/2"\n
\tOption\t\t"Device"\t\t"/dev/input/mice"\n
\tOption\t\t"Emulate3Buttons"\n
\tOption\t\t"ZAxisMapping"\t\t"4 5"\n
\tOption\t\t"Buttons"\t\t"3"'
local Monitor='\tIdentifier "Default"\n
\tModelName\t"MODEL"\n
\tOption\t"CalcAlgorithm"\t"CheckDesktopGeometry"\n
\tHorizSync\tHS\n
\tVertRefresh\tVS\n
\tOption\t"DPMS"\t"true"'
local Device='\tIdentifier\t"StdGraphics"\n
\tVendorName\t"XDESC"\n
\tDriver\t\t"XMODULE"'
local Screen='\tIdentifier\t"Screen 1"\n
\tDevice\t\t"StdGraphics"\n
\tMonitor\t\t"Default"\n
\tDefaultColorDepth CDP'
local ServerLayout='\tIdentifier\t"Simple Layout"\n
\tScreen\t"Screen 1"\n
\tInputDevice "Keyboard1"\t"CoreKeyboard"\n
\tInputDevice "Mouse1"\t"CorePointer"\n
\tOption\t"BlankTime"\t"5"\n
\tOption\t"StandbyTime"\t"10"\n
\tOption\t"SuspendTime"\t"20"\n
\tOption\t"OffTime"\t"30"'
local DRI='\tGroup\t\t"video"\n
\tMode\t\t0666'

if [ -n "$hw_graphic" ] ; then
  DRV=${hw_graphic% *}
  CDP=${hw_graphic##* }
  msg="Please check your graphic adaptor settings ($hw_graphic)."
  if [ -z "$DRV" ] ; then error "  Manual configuration of your graphic \
hardware module to set failed.\n  $msg" nonfatal
    XMODULE=DRV
  else
    [ -z "${XMODULE}" ] && XMODULE=vesa
  fi
fi
if [ -z "$CDP" ] ; then error "  Manual configuration of your graphic \
systems color depth failed.\n  $msg" nonfatal
  CDP=${DEFAULTCOLORDPT}
fi



if [ -n "$hw_monitor" ] ; then
  # just cut all starting from k(Hz) ...
  HS=${hw_monitor%k*}
  VS=${hw_monitor%Hz*}
  [ "${hw_monitor}" == "$VS" ] && VS=${hw_monitor%hz*}
  VS=${VS##* }
  SCR_MODES="\"${hw_monitor##* }\""
else
  # Gather information about the Monitor capabilities 
  screenres > /tmp/screenres
  VERTSR=`cat /tmp/screenres | sed -n '/Vertical Frequency Range/s/[^0-9]* \([0-9-]*\)/\1/p'`
  HORISR=`cat /tmp/screenres | sed -n '/Horizontal Frequency Range/s/[^0-9]* \([0-9-]*\)/\1/p'`
  HS=$HORISR
  VS=$VERTSR
  # compute max resolution
  SCR_MODES=`cat /tmp/screenres | sed -n '/Recommended Screen Modes:/s/[^"]*\(.*\)/\1/p'`
#  # gather monitor information automatically
#  ddcprobe > /tmp/ddcprobe
#  hwmsg="Please check the output of ddcprobe. The settings where not \
#complete\n  or non existant. The $0 script tried for a fully automatic\n\
#  configuration of display"
fi

hwmsg="Please check your predefined monitor settings ($hw_monitor): Automatic\n\
configuration of display"
if [ -z "$HS" ] ; then error "  $hwmsg timings was attempted, but the \
horizontal frequency could not be detected. Using default frequency \
range (${HSYNCRANGE})" nonfatal
  HS=${HSYNCRANGE}
fi
if [ -z "$VS" ] ; then error "  $hwmsg timings was attempted, but the \
vertical frequency could not be detected. Using default frequency \
range (${VSYNCRANGE})" nonfatal
  VS=${VSYNCRANGE}
fi
if [ -z "$SCR_MODES" ] ; then error "  $hwmsg resolution was attempted but not \
established. Using default resolutions (${DEFAULTMODES})" nonfatal
  SCR_MODES=${DEFAULTMODES}
fi
monmanual=yes 


# finally write config file
echo -e "#\n# autogenerated X hardware configuration by $0\n# \
Dirk von Suchodoletz <dirk@goe.net>, $date" >$xfc
echo -e "# DO NOT EDIT THIS FILE BUT '$0' INSTEAD!\n#" \
  >>$xfc
for section in Files ServerFlags Module InputDevice Monitor \
    Screen Device ServerLayout DRI ; do
  echo "Section \"$section\"" >>$xfc
  case "$section" in
    Files)
      echo -e ${Files} >>$xfc
      # check for 64bit CPU/installation (fixme!!)
      [ -n "$amd64" ] && \
        echo '"\tModulePath\t"/usr/X11R6/lib64/modules"\n' >>$xfc
      for i in ${D_XFONTPATH} ; do
        echo -e "\tFontPath\t\"$i/\"" >>$xfc ; done
    ;;
    ServerFlags)  
      echo -e ${ServerFlags} >>$xfc
    ;;
    Device)
      echo -e ${Device} | \
        sed -e "s,XMODULE,${XMODULE}," -e "s%XDESC%${XDESC}%" >>$xfc
            # special options may be needed for some drivers
            [ $DEBUGLEVEL -gt 1 ] && msg "X setup" \
"adding for some Xfree86 modules (radeon, s3virge, nvidia) special\noptions \
to the 'Device' section. Consult hwsetup if you like to add more or\nremove some."
            [ x$DRV = "xs3virge" ] && {
            echo -e "\tOption\t\t\"XVideo\" \"Off\"\n" >>$xfc
            [ $DEBUGLEVEL -gt 1 ] && msg  "X setup" \
"added special option for \
the s3virge module -> 'XVideo Off'. remove the\nappropriate line in hwsetup \
if you like not to use it." ; }
            [ x$DRV = "xnvidia" ] && {
            echo -e "\tOption\t\t\"NvAGP\" \"3\"" >>$xfc
            echo -e "\tOption\t\t\"NoLogo\" \"1\"" >>$xfc
            [ $DEBUGLEVEL -gt 1 ] && msg  "X setup" \
"added special option for \
the nvidia module -> 'NvAGP '. it sets the use\nof internal or external \
agpgart support." ; }
            [ "$busid" ] && {
            echo -e "\tOption\t\t\"BusID\" \"$busid\"" >>$xfc
            [ $DEBUGLEVEL -gt 1 ] && msg  "X setup" \
"added special option for \
the 'BusID' information - it\ndefines the npostion of graphics adaptor in \
pci/agp bus needed for acceleration." ; }
    ;;
    Module)
      echo -e ${Module} >>$xfc
      [ x$DRM = "xyes" ] && \
        echo -e "\tLoad\t\t\"dri\"" >>$xfc
      [ x$GLX != "xno" ] && \
        echo -e "\tLoad\t\t\"glx\"" >>$xfc
    ;;
    Monitor)
      echo -e ${Monitor} | \
        sed -e "s,HS,${HS},g" -e "s,VS,${VS},g" >>$xfc
    ;;
    InputDevice)
      echo -e ${InputDevice} | sed -e "s,XKEYBOARD,${XKEYBOARD},g" \
        >>$xfc
      [ "${XKEYBOARD}" = "de" ] && \
        echo -e '\tOption\t\t"XkbVariant"\t\t"nodeadkeys"' >>$xfc
      echo -e "EndSection\n\nSection \"$section\"" >>$xfc
      # if special synaptics touchpad was detected and specific driver
      # is present
      # strinfile " synaptics " /tmp/hwsetup.info 
      # synaptics_drv.o
      echo -e $InputMouseDef >>$xfc
    ;;
    Screen)
      echo -e ${Screen} | sed -e "s,CDP,${CDP}," >>$xfc
      for BPP in 15 16 24 32
        do echo -e '\tSubSection "Display"\n\t\tDepth\t'\
          $BPP'\n\t\tModes\t'$SCR_MODES'\n\tEndSubSection' >>$xfc
        [ $BPP = "$CDP" ] && break
      done
    ;;
    ServerLayout)
      echo -e ${ServerLayout} >>$xfc
    ;;
  esac
  echo -e "EndSection\n" >>$xfc
done
}

#######################################################################
# script starts here

# functions common for all distros
. /etc/functions
# load distro specific configuration variables and functions. distro
# specific functions may overwrite functions defined in /etc/functions
. /etc/sysconfig/config
. /etc/distro-functions

# heavy debugging output in level 3 and above ...
[ $DEBUGLEVEL -gt 3 ] && set -x

# set X11 configuration file
if [ -n "${D_XF86CONFFILE}" ] ; then
  D_XF86CONFFILE="/mnt/${D_XF86CONFFILE}"
else
  D_XF86CONFFILE="/mnt/etc/X11/xorg.conf"
  error "  You should define the variable D_XF86CONFFILE in yours distro \
configuration\n  file" nonfatal
fi

# USB core is needed for presence of /proc/bus/usb
modprobe ${MODPRV} usbcore &

# "drivers" (pseudo, placeholder strings, ...) to exclude from loading
# depending on distro more hw modules have to be excluded too. use the
# D_HWMODTOIGNORE for that purpose
DRIVERLIST=" disabled unknown ignore pcspkr synaptics keybdev kanotix\
  ${D_HWMODTOIGNORE} "
# driver blacklist (real modules which fail to load)
DRIVERLIST=${DRIVERLIST}"hw_random genericwheelusb "
# hack for pseudo modules (not to load)
for i in $DRIVERLIST ; do 
  echo -e "alias\t$i\tusbcore" >> /etc/modprobe.conf
done

# load kernel module for ps2 mice
[ -f /lib/modules/${KERNEL}/kernel/drivers/input/mouse/psmouse.ko ] && \
  modprobe ${MODPRV} psmouse

# and map the mousehandler to /dev/input/mice
[ -f /lib/modules/${KERNEL}/kernel/drivers/input/mousedev.ko ] && \
  modprobe ${MODPRV} mousedev

# start the knoppix hardware autodetection tool
( hwsetup -v > /tmp/hwsetup.info && echo "hwsetup" > /tmp/hwrun1 ) & 

# ACPI configuration - at least not needed with SuSE 9.3/10.0
# needed for other distros?

# AGP configuration (agpgart and chipset specific driver)
modprobe ${MODPRV} agpgart || \
    modprobe ${MODPRV} agpgart agp_try_unsupported=1

# wait for /tmp/hwsetup.info to appear
waitfor /tmp/hwrun1 50000 || \
  error "  Expected information from hwsetup to appear in \
/tmp/hwsetup.info.\n  Unable to configure parts of the systems hardware. \
Please check that\n  hwsetup is properly installed and executable."

# load ide drivers first, takes a while to initialize
for DRIVER in cmd64x hpt366 piix slc90e66 cs5520 it821x rz1000 \
    triflex aec62xx cs5530 ns87415 sc1200 trm290 alim15x3 \
    cy82c693 opti621 serverworks via82cxxx amd74xx pdc202xx_new \
    siimage atiixp hpt34x pdc202xx_old sis5513; do
  strinfile " ${DRIVER}" /tmp/hwsetup.info && {
    IDE="yes"
    modprobe ${MODPRV} ${DRIVER} &
    DRIVERLIST="${DRIVERLIST} ${DRIVER}"; }
done
# check for IDE/SCSI (SATA) - incomplete list
for DRIVER in ata_piix sata_via sata_nv sata_sil sata_sis; do
  strinfile " ${DRIVER}" /tmp/hwsetup.info && {
    #SCSIIDE="yes"
    modprobe ${MODPRV} ${DRIVER} &
    DRIVERLIST="${DRIVERLIST} ${DRIVER}"; }
done
# check for USB, pcmcia and ieee1394 hardware drivers
for DRIVER in ohci-hcd uhci-hcd ehci-hcd ohci1394; do
  strinfile " ${DRIVER}" /tmp/hwsetup.info && {
    USB="yes"
    modprobe ${MODPRV} ${DRIVER}
    DRIVERLIST="${DRIVERLIST} ${DRIVER}"; }
done
# load usbhid (for USB keyboard/mouse) or remove usbcore module if USB 
# not present
if [ -n "$USB" ] ; then
  modprobe ${MODPRV} usbhid &
else rmmod usbcore
fi
# remove unneeded network card modules
for DRIVER in ${NWMODULES}; do
  strinfile " ${DRIVER}" /tmp/hwsetup.info || {
    rmmod ${DRIVER} &
    DRIVERLIST="${DRIVERLIST} ${DRIVER}"; }
done
# sound card setup (alsa and oss compatibility drivers)
if [ -f /etc/sysconfig/sound ] ; then
  . /etc/sysconfig/sound
else DRIVER="snd-dummy"
fi
modprobe ${MODPRV} ${DRIVER}

DRIVERLIST="${DRIVERLIST} ${DRIVER} "
modprobe -a ${MODPRV} snd_pcm_oss snd_mixer_oss
# check for PCMCIA / cardbus stuff
for DRIVER in yenta_socket i82365 pd6729 tcic; do
  strinfile ${DRIVER} /tmp/hwsetup.info && {
    modprobe ${MODPRV} ${DRIVER}
    DRIVERLIST="${DRIVERLIST} ${DRIVER}"
    PCMCIA="yes"; }
done
if [ -n "${PCMCIA}" ] ; then
  #echo "pcmcia=\"yes\"" > config
  modprobe ${MODPRV} ds
fi
# remaining drivers listed in /tmp/hwsetup.info
cat /tmp/hwsetup.info| while read LINE ; do
  if strinstr "driver:" "${LINE}"; then
    DRIVER=${LINE##driver: }
    if ! strinstr " ${DRIVER} " "${DRIVERLIST}"; then
      strinstr "Card:" "${DRIVER}" || strinstr "ps/2" "${DRIVER}" || {
        modprobe ${MODPRV} ${DRIVER} &
        usleep 10; }
      DRIVERLIST="${DRIVERLIST} ${DRIVER}"
    fi
  fi
done
# rerun the knoppix hardware autodetection tool for USB and ide devices
# like dvd or harddisk - wait a few seconds so hopefully the ide driver
# is initialized 
test -f /proc/bus/usb/devices || mount -n -t usbfs usbfs /proc/bus/usb
[ -n "$IDE" ] && modprobe -q ide_generic 2>/dev/null 
usleep 10 && hwsetup -v > /tmp/hwsetup.info
# check if USB mouse and/or keyboard is connected and remove usbhid if
# not
strinfile "genericwheelusb" /tmp/hwsetup.info || \
  (strinfile "keybdev" /tmp/hwsetup.info || rmmod usbhid)

# load IDE high level drivers
if [ -n "$IDE" ] ; then
  # you might want to check /etc/sysconfig/floppy for more info
  strinfile "ZIP" /tmp/hwsetup.info && modprobe ${MODPRV} ide_floppy
  strinfile "CDROM" /tmp/hwsetup.info && modprobe ${MODPRV} ide_cd
  strinfile "HD" /tmp/hwsetup.info && modprobe ${MODPRV} ide_disk
fi

# not rather precise ...
if strinfile "SCSI" /tmp/hwsetup.info ; then
  strinfile "CDROM" /tmp/hwsetup.info && modprobe -a ${MODPRV} sr_mod sg
  strinfile "HD" /tmp/hwsetup.info && modprobe ${MODPRV} sd_mod
fi
# fixme - psmouse entladen, falls nicht vorhanden

# configure some variables from configuration file - wait for dhcp or ldap
# confiurator to complete
waitfor /tmp/dhcp-done 10000 || error "  Did not get any configuration \
data via dhcp until now ..." nonfatal
waitfor /tmp/ldap-done 10000 || error "  Did not get any configuration \
data via ldap until now ..." nonfatal
. /etc/machine-setup

# postpone some commands into normal bootup environment
echo -e "\t# entries added by $0: $date" >> /etc/boot.ld
# run localizator and configure keyboard and console fonts
DEFKEYTABLE="de-latin1-nodeadkeys"
localization $country
if [ -z "${KEYTABLE}" ] ; then
  msg "Keyboard setup" "No settings found for keyboard, using default of \
'${DEFKEYTABLE}' defined\nin $0."
  KEYTABLE=${DEFKEYTABLE}
fi
echo -e "\tloadkeys -q ${KEYTABLE}" >> /etc/boot.ld

# run X11 / Xorg configurator
. /etc/sysconfig/xserver >/dev/null 2>&1 || error "  The xserver \
configuration file generated by hwsetup could not\n  be found." nonfatal
( displaysetup /etc/xorg.conf; echo "ready" > /tmp/xready ) &

# wait for completion of clients root filesystem in /mnt
waitfor /tmp/fscmpl 40000

# add entries to boot.ld
cat /etc/boot.ld >> /mnt/etc/${D_INITDIR}/boot.ld
[ -n "${CONSOLE_FONT}" ] && consolefont

# get idea of availabe harddisk partitions, put swap partitions into
# (/mnt)/etc/fstab and format and mount partitions of type 44 (unknown) 
for hd in $(cat /tmp/hwsetup.info|sed -n -e '/HD$/,/device:/p'| \
    sed -n -e '/device:/p' | sed -e 's/device: //') ; do
  fdisk -l /dev/$hd| sed -n "/^\/dev\//p" > /tmp/hd_part
  for hdpartnr in $(cat /tmp/hd_part | \
      sed -n -e "/ 82 /p"|sed -e "s/[[:space:]].*//") ; do
    echo -e "$hdpartnr\tswap\t\tswap\t\tdefaults\t 0 0" >> /mnt/etc/fstab
  done
  # we use special non assigned partition type for harddisk scratch space
  for hdpartnr in $(cat /tmp/hd_part | \
        sed -n -e "/ 44 /p"|sed -e "s/[[:space:]].*//") ; do
    # ugly message from ext2 mount :-(
    ( mkfs.ext2 -q $hdpartnr; mount -n $hdpartnr /mnt/tmp; \
      echo "$hdpartnr" > /tmp/tmpready ) &
    echo -e "$hdpartnr\t/tmp\t\text2\t\tdefaults\t 0 0" >> /mnt/etc/fstab
    part44=yes
    break
  done
  # put detected linux partitions into /etc/fstab with "noauto"
  for hdpartnr in $(cat /tmp/hd_part | \
        sed -n -e "/ 83 /p"|sed -e "s/[[:space:]].*//") ; do
    mkdir -p /mnt/media/${hdpartnr#/dev/*} 2>/dev/null
    echo -e "$hdpartnr\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto,\
noexec\t 0 0" >> /mnt/etc/fstab
  done 
done
# determine if tmp preparation should wait for format/mount or not
[ -z "$part44" ] && echo "finished" > /tmp/tmpready

# finalize X configuration
# only if X is link itself (normally to /var/X11R6/bin/X) check!!
link=`ls -l /mnt/usr/X11R6/bin/X 2>/dev/null`
if strinstr "/var/X11R6" "$link" ; then
  testmkd /mnt/var/X11R6/bin
  for i in /usr/X11R6/bin/Xorg /usr/X11R6/bin/XFree86 ; do
    [ -e "/mnt/$i" ] && { ln -sf $i /mnt/var/X11R6/bin/X; break; }
  done
fi
# wait for completion of Xorg configuration
waitfor /tmp/xready 10000
cp /etc/xorg.conf ${D_XF86CONFFILE}

echo "finished" > /tmp/hwcfg