Magellan Linux

Contents of /trunk/installer/include/hwdetection.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1027 - (show annotations) (download) (as text)
Sun May 30 17:49:14 2010 UTC (13 years, 11 months ago) by niro
File MIME type: application/x-sh
File size: 8089 byte(s)
-fixed header
-added remove_duplicates to reduce modules to one instance
-fixed x11 module handling
-added get_evdev_device_path to read event devices (used by kdrive loader script)
-added get_netcard_driver_modules()
-added get_blkid_information() for uuid/label support
-better fstype guessing with new get_fstype()
-added get_uuid() to convert partitions to uuids
-added framebuffer support via uvesafb and use 1024x768x16@60 as standard resolution
-add more generic modules to initrd

1 #!/bin/bash
2 # $Id$
3
4 ## hwdetection, needs >= sys-apps/hwinfo
5
6 # hwinfo wrapper to use hwinfo with sudo if requested
7 hwinfo()
8 {
9 local use_sudo=""
10 case ${SUDO} in
11 yes|y|true|1) use_sudo=sudo ;;
12 esac
13
14 ${use_sudo} /usr/sbin/hwinfo $@
15 }
16
17 # get_hwinfo $hw_item
18 get_hwinfo()
19 {
20 local enable_desc="0"
21
22 if [[ $1 = --with-description ]] || [[ $1 = -d ]]
23 then
24 enable_desc=1
25 shift
26 fi
27
28 local item="$1"
29 local all
30 local i
31
32 # handle special items
33 case ${item} in
34 memory) get_hwinfo_memory; return ;;
35 smp) get_hwinfo_smp; return ;;
36 esac
37
38 all=$(hwinfo --short --"${item}")
39
40 declare -i i=0
41 while read device description
42 do
43 # skip the first line
44 (( i++ ))
45 [ ${i} -eq 1 ] && continue
46
47 if [[ ${enable_desc} = 1 ]]
48 then
49 echo "${device};${description}"
50 else
51 echo "${device}"
52 fi
53 done <<< "${all}"
54 }
55
56
57 # special memory case
58 get_hwinfo_memory()
59 {
60 local memory=$(hwinfo --memory | grep "Memory Size" | cut -d: -f2 | sed "s:\ ::")
61 echo "${memory}"
62 }
63
64
65 # special smp case
66 get_hwinfo_smp()
67 {
68 local smp=$(hwinfo --smp | grep "SMP support:" | cut -d: -f2 | sed "s:\ ::")
69 echo "${smp}"
70 }
71
72
73 # get_driver_modules $hw_item
74 get_driver_modules()
75 {
76 local item="$1"
77 local modules
78
79 # being little tricky here :)
80 # does following:
81 # grep:
82 # -> 'Driver Modules: "via82cxxx", "ide_cd"'
83 # cut:
84 # -> ' "via82cxxx", "ide_cd"'
85 # sed1:
86 # -> ' modules="via82cxxx", "ide_cd"'
87 # sed2:
88 # -> ' modules="via82cxxx ide_cd"'
89 # then evaluate -> eval modules="via82cxxx ide_cd"
90 # and we get a variable $modules with all mods
91 #eval $(hwinfo --"${item}" | grep "Driver Modules:" | cut -d: -f2 | sed -e "s:\":modules=\":" -e "s:\",\ \":\ :")
92
93 local i
94 for i in $(hwinfo --"${item}" | grep "Driver Modules:" | cut -d: -f2 )
95 do
96 eval $(echo "${i}" | sed -e "s:\":modules=\"\${modules}\ :" -e "s:,:\ :")
97 done
98 remove_duplicates "${modules}"
99 }
100
101 # remove_duplicates $list
102 remove_duplicates()
103 {
104 local list="$@"
105 local fixed_list=":"
106 local i
107
108 for i in ${list}
109 do
110 if [[ -z $(echo "${fixed_list}" | fgrep ":${i}:") ]]
111 then
112 fixed_list="${fixed_list}${i}:"
113 fi
114 done
115
116 unset list
117
118 # remove all ':' and show the cleaned list
119 # this way fixes double spaces also
120 local counter
121 declare -i counter=0
122 for i in $(echo ${fixed_list} | sed "s|:| |g")
123 do
124 (( counter++ ))
125 if [[ ${counter} -eq 1 ]]
126 then
127 list="${i}"
128 else
129 list+=" ${i}"
130 fi
131 done
132
133 echo "${list}"
134 }
135
136 get_x11_driver_modules()
137 {
138 local modules
139 modules="$(hwinfo --gfxcard | grep 'XFree86 v4 Server Module:' | sed 's/.*Module:\ \(.*\)/\1/')"
140
141 # remove duplicates from list and show it
142 remove_duplicates "${modules}"
143 }
144
145 get_evdev_device_path()
146 {
147 local device="$1"
148 local path
149
150 case ${device} in
151 mouse|keyboard) true;;
152 *) die "unkown device";;
153 esac
154
155 path="$(hwinfo --${device} | grep 'Device Files:' | sed 's:.*\(/dev/input/event[0-5]\).*:\1:')"
156 echo "${path}"
157 }
158
159 # get_netcard_driver_modules device
160 # e.g. get_netcard_driver_modules eth0
161 get_netcard_driver_modules()
162 {
163 local device="$1"
164 local modules
165
166 if [[ -z ${device} ]]
167 then
168 echo "Error: get_netcard_driver_module(): no device given"
169 return 1
170 fi
171
172 modules=$(hwinfo --netcard | grep -B1 "Device File: ${device}" | sed 's/.*Modules: \"\(.*\)\"/\1/;q')
173 remove_duplicates "${modules}"
174 }
175
176 get_blkid_information()
177 {
178 local partition="$1"
179 local variable="$2"
180 local method
181
182 case $1 in
183 --uuid|-u) shift; method="-U"; partition="$1"; variable="$2" ;;
184 --label|-l) shift; method="-L"; partition="$1"; variable="$2" ;;
185 esac
186
187 if [[ -z ${partition} ]]
188 then
189 echo "Error: get_get_blkid_information()(): no partition given"
190 return 1
191 fi
192
193 if [[ -z ${variable} ]]
194 then
195 echo "Error: get_get_blkid_information()(): no variable given"
196 return 1
197 fi
198
199 blkid -o value -s "${variable}" "${method}" "${partition}"
200 }
201
202 get_fstype()
203 {
204 local partition="$1"
205 if [[ -z ${partition} ]]
206 then
207 echo "Error: get_fstype(): no partition given"
208 return 1
209 fi
210
211 # does not work with uuids
212 #mount -f --guess-fstype ${partition}
213
214 get_blkid_information ${partition} TYPE
215 }
216
217 get_uuid()
218 {
219 local partition="$1"
220 if [[ -z ${partition} ]]
221 then
222 echo "Error: get_uuid(): no partition given"
223 return 1
224 fi
225
226 # does not work with uuids
227 #mount -f --guess-fstype ${partition}
228
229 get_blkid_information ${partition} UUID
230 }
231
232 # create_initrd {/path/to/initrd kernelversion </path/to/config>}
233 # when nothing given then /boot/initrd-$(uname -r).img $(uname -r) will be used
234 # default config path is /etc/conf.d/mkinitrd
235 create_initrd()
236 {
237 local initrd
238 local kernel
239 local config
240 local chroot
241 #local root
242 local modules
243 # enabled framebuffer modules as default
244 local framebuffer=1
245 local uvesafb_config="/etc/modprobe.d/uvesafb.conf"
246
247 # very basic getops
248 for i in $*
249 do
250 case $1 in
251 #--root|-r) shift; root="$1" ;;
252 --initrd|-i) shift; initrd="$1" ;;
253 --config|-c) shift; config="$1" ;;
254 --kernelversion|-v) shift; kernel="$1" ;;
255 --nofb) shift; framebuffer=0
256 esac
257 shift
258 done
259
260 [[ -z ${initrd} ]] && initrd="/boot/initrd-$(uname -r).img"
261 [[ -z ${kernel} ]] && kernel="$(uname -r)"
262 [[ -z ${config} ]] && config="/etc/conf.d/mkinitrd"
263
264 if [[ ! -z ${INSTALL_ROOT} ]]
265 then
266 config="${INSTALL_ROOT}/${config}"
267 uvesafb_config="${INSTALL_ROOT}/${uvesafb_config}"
268 chroot="chrooted"
269 fi
270
271 # get various modules needed to boot
272 modules="$(get_driver_modules disk)"
273 modules+=" $(get_driver_modules scsi)"
274 modules+=" $(get_driver_modules cdrom)"
275
276 # check for special ide_disk drivers (ata support)
277 if [[ ! -z $(echo ${modules} | grep ide_disk) ]]
278 then
279 modules+=" $(grep ide_disk /proc/modules | cut -d' ' -f4 | sed '/-/d;s:,:\ :g')"
280 fi
281
282 # add some generic modules
283 modules+=" sg_mod sg loop sr_mod sd_mod ide-cd ide-cd_mod ide-disk"
284
285 # add generic framebuffer modules
286 if [[ ${framebuffer} = 1 ]]
287 then
288 modules+=" uvesafb"
289
290 # setup modprobe conf too
291 [[ ! -d $(dirname ${uvesafb_config}) ]] && install -d $(dirname ${uvesafb_config})
292 cat > ${uvesafb_config} << EOF
293 # This file sets the parameters for uvesafb module.
294 # The following format should be used:
295 # options uvesafb mode_option=<xres>x<yres>[-<bpp>][@<refresh>] scroll=<ywrap|ypan|redraw> ...
296 #
297 # For more details see:
298 # http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/fb/uvesafb.txt
299 #
300 EOF
301 # default config 1024x768 and 60 HZ
302 echo "options uvesafb mode_option=1024x768-32@60 scroll=ywrap" >> ${uvesafb_config}
303 fi
304
305 # remove all duplicate modules
306 modules="$(remove_duplicates ${modules})"
307
308 # create the config and an initrd
309 echo "# autogenerated config file" > ${config}
310 echo "MODULES=\"${modules}\"" >> ${config}
311 echo "IMAGE_TYPE=\"initramfs\"" >> ${config}
312
313 ${chroot} mkinitrd -f ${initrd} ${kernel}
314 }
315
316 chrooted()
317 {
318 local cmd="$@"
319
320 mount -t sysfs sysfs ${INSTALL_ROOT}/sys
321 mount -t proc proc ${INSTALL_ROOT}/proc
322 mount -o bind /dev ${INSTALL_ROOT}/dev
323
324 chroot ${INSTALL_ROOT} ${cmd}
325
326 umount ${INSTALL_ROOT}/dev
327 umount ${INSTALL_ROOT}/proc
328 umount ${INSTALL_ROOT}/sys
329 }
330
331 # special: memory (size), floppy (modprobe floppy), smp (support y/n)
332 # sound (which module? -> eval $(hwinfo --sound | grep "Driver Modules:" | cut -d: -f2 | sed s:\":a=\":) )
333 #
334
335 # for i in cdrom cpu disk floppy gfxcard keyboard memory monitor mouse
336 # netcard pppoe scsi smp \
337 # sound wlan
338 # do
339 # echo -------- ${i}
340 # get_hwinfo ${i}
341 # echo -------------------------------------------------
342 # echo
343 # done
344
345 # get_driver_modules sound
346 # get_driver_modules wlan
347 # get_driver_modules cdrom
348 # get_driver_modules disk
349 # get_driver_modules gfxcard
350 # get_x11_driver_modules
351
352 # # get a modules list
353 # for i in sound wlan cdrom disk gfxcard
354 # do
355 # ALL_MODULES="${ALL_MODULES} $(get_driver_modules ${i})"
356 # done
357 # ALL_MODULES="${ALL_MODULES} $(get_x11_driver_modules)"
358 # # show a clean list
359 # for i in $(remove_duplicates ${ALL_MODULES})
360 # do
361 # echo ${i}
362 # done
363
364 #create_initrd /root/TEST/initrd
365 #get_driver_modules cdrom
366 #get_driver_modules disk
367 #get_driver_modules scsi
368 #get_driver_modules all
369
370 # network
371 #get_hwinfo --with-description netcard
372 #get_driver_modules netcard
373
374 #get_hwinfo disk
375 #get_hwinfo partition | grep /dev/hda