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