xref: /minix/minix/commands/MAKEDEV/MAKEDEV.sh (revision 08cbf5a0)
1#!/bin/sh
2#
3# MAKEDEV 3.3 - Make special devices.			Author: Kees J. Bot
4# 3.4 - Rewritten to allow mtree line to be printed,	Lionel A. Sambuc
5#       also use getopt for argument parsing
6umask 077
7
8MTREE=false
9STD=false
10RAMDISK=false
11ECHO=
12EXIT=0
13
14# console => lp tty log
15# boot    => kmem mem null ram zero
16RAMDISK_DEVICES="
17	boot
18	console
19	input
20	c0d0 c0d0p0 c0d0p0s0 c0d1 c0d1p0 c0d1p0s0
21	c0d2 c0d2p0 c0d2p0s0 c0d3 c0d3p0 c0d3p0s0
22	c0d4 c0d4p0 c0d4p0s0 c0d5 c0d5p0 c0d5p0s0
23	c0d6 c0d6p0 c0d6p0s0 c0d7 c0d7p0 c0d7p0s0
24	c1d0 c1d0p0 c1d0p0s0 c1d1 c1d1p0 c1d1p0s0
25	c1d2 c1d2p0 c1d2p0s0 c1d3 c1d3p0 c1d3p0s0
26	c1d4 c1d4p0 c1d4p0s0 c1d5 c1d5p0 c1d5p0s0
27	c1d6 c1d6p0 c1d6p0s0 c1d7 c1d7p0 c1d7p0s0
28	fd0 fd1 fd0p0 fd1p0
29	pci
30	ttyc1 ttyc2 ttyc3 tty00 tty01 tty02 tty03
31"
32
33STD_DEVICES="
34	${RAMDISK_DEVICES}
35	bmp085b1s77 bmp085b2s77 bmp085b3s77
36	eepromb1s50 eepromb1s51 eepromb1s52 eepromb1s53
37	eepromb1s54 eepromb1s55 eepromb1s56 eepromb1s57
38	eepromb2s50 eepromb2s51 eepromb2s52 eepromb2s53
39	eepromb2s54 eepromb2s55 eepromb2s56 eepromb2s57
40	eepromb3s50 eepromb3s51 eepromb3s52 eepromb3s53
41	eepromb3s54 eepromb3s55 eepromb3s56 eepromb3s57
42	fb0 fbd filter hello
43	i2c-1 i2c-2 i2c-3
44	klog ptmx random
45	sht21b1s40 sht21b2s40 sht21b3s40
46	tsl2550b1s39 tsl2550b2s39 tsl2550b3s39
47	ttyp0 ttyp1 ttyp2 ttyp3 ttyp4 ttyp5 ttyp6 ttyp7 ttyp8 ttyp9
48	ttypa ttypb ttypc ttypd ttype ttypf
49	ttyq0 ttyq1 ttyq2 ttyq3 ttyq4 ttyq5 ttyq6 ttyq7 ttyq8 ttyq9
50	ttyqa ttyqb ttyqc ttyqd ttyqe ttyqf
51	vnd0 vnd0p0 vnd0p0s0 vnd1 vnd1p0 vnd1p0s0
52	vnd2 vnd3 vnd4 vnd5 vnd6 vnd7
53"
54
55#makedev ${dev} $type ${major} ${minor} ${uname} ${gname} ${permissions} [link_target]
56#When called for a link, major and minor are ignored
57makedev()
58{
59	# Check that all the arguments are there, we trust the caller to put
60	# values which make sens.
61	[ $# -eq 7 ] || [ $# -eq 8 ] || return 1;
62
63	local _dev=$1
64	local __type=$2
65	local _major=$3
66	local _minor=$4
67	local _uname=$5
68	local _gname=$6
69	local _mode=$7
70
71	case ${__type} in
72	b)_type=block;;
73	c) _type=char;;
74	l) _type=link; _target=$8;;
75	*) return 2;;
76	esac
77
78	if [ ${MTREE} = "yes" ]
79	then
80		if [ ${_type} = "link" ]
81		then
82			echo ./dev/${_dev} type=${_type} \
83			    uname=${_uname} gname=${_gname} mode=${_mode} \
84			    link=${_target}
85		else
86			echo ./dev/${_dev} type=${_type} \
87			    uname=${_uname} gname=${_gname} mode=${_mode} \
88			    device=native,${_major},${_minor}
89		fi
90	else
91		if [ ${_type} = "link" ]
92		then
93			${ECHO} ln -f ${_target} ${_dev}
94		else
95			${ECHO} mknod ${_dev} ${__type} ${_major} ${_minor}
96			${ECHO} chmod ${_mode} ${_dev}
97			${ECHO} chown ${_uname}:${_gname} ${_dev}
98		fi
99	fi
100}
101
102# no_return usage()
103usage()
104{
105	cat >&2 <<EOF
106Usage:	$0 [-n|-m] [-s|-r] key ...
107	-n: print the commands instead of executing them
108	-m: print mtree(8) line
109	-s: standard set of devices
110	-r: reduced for ramdisk set of devices
111
112Where key is one of the following:
113  ram mem kmem null boot zero	  # One of these makes all these memory devices
114  fb0			  # Make /dev/fb0
115  i2c-1 i2c-2 i2c-3       # Make /dev/i2c-[1-3]
116  tsl2550b{1,3}s39	  # TSL2550 Ambient Light Sensors
117  sht21b{1,3}s40	  # SHT21 Relative Humidity and Temperature Sensors
118  bmp085b{1,3}s77	  # BMP085 Pressure and Temperature Sensors
119  fd0 fd1 ...		  # Floppy devices for drive 0, 1, ...
120  fd0p0 fd1p0 ...	  # Make floppy partitions fd0p[0-3], fd1p[0-3], ...
121  c0d0 c0d1 ...		  # Make disks c0d0, c0d1, ...
122  c0d0p0 c0d1p0 ...	  # Make partitions c0d0p[0-3], c0d1p[0-3], ...
123  c0d0p0s0 c0d1p0s0 ...	  # Subparts c0d0p[0-3]s[0-3], c0d1p[0-3]s[0-3], ...
124  c1d0(p0)(s0)		  # Likewise for controller 1
125  c0t0 c0t1 c1t0 ...	  # Make tape devices c0t0, c0t0n, c0t1, ...
126  console lp tty log	  # One of these makes all four
127  ttyc1 ... ttyc7         # Virtual consoles
128  tty00 ... tty03         # Make serial lines
129  ttyp0 ... ttyq0 ...     # Make tty, pty pairs
130  audio mixer		  # Make audio devices
131  klog                    # Make /dev/klog
132  ptmx                    # Make /dev/ptmx
133  random                  # Make /dev/random, /dev/urandom
134  filter                  # Make /dev/filter
135  fbd                     # Make /dev/fbd
136  hello                   # Make /dev/hello
137  video                   # Make /dev/video
138  pci                     # Make /dev/pci
139  vnd0 vnd0p0 vnd0p0s0 .. # Make vnode disks /dev/vnd[0-7] and (sub)partitions
140  input                   # Make /dev/kbdmux, /dev/kbd[0-3], idem /dev/mouse~
141EOF
142	exit 1
143}
144
145# Parse options
146while getopts "nmrs" arg
147do
148	case "$arg" in
149	n)
150		ECHO=echo
151		;;
152	m)
153		MTREE=yes
154		;;
155	r)
156		RAMDISK=yes
157		;;
158	s)
159		STD=yes
160		;;
161	h|\?)
162		usage
163		;;
164	esac
165done
166
167if [ ${STD} = "yes" ]
168then
169	DEVICES=${STD_DEVICES}
170elif [ ${RAMDISK} = "yes" ]
171then
172	DEVICES=${RAMDISK_DEVICES}
173else
174	while [ $OPTIND -gt 1 ]
175	do
176		shift
177		OPTIND=$((${OPTIND} - 1))
178	done
179	while [ ! -z "$1" ]
180	do
181		DEVICES="${DEVICES} $1"
182		shift
183	done
184fi
185
186for dev in ${DEVICES}
187do
188	# Reset the defaults
189	uname=root
190	gname=wheel
191	permissions=600
192
193	case ${dev} in
194	c0*) major=3 ;;
195	c1*) major=8 ;;
196	c2*) major=10 ;;
197	c3*) major=12 ;;
198	vnd*) # Whole vnode disk devices.
199		disk=`expr ${dev} : '...\\(.\\)'`
200		major=`expr ${disk} + 56`
201		;;
202	esac
203
204	# The following is lexicographicaly ordered
205	case ${dev} in
206	audio|mixer)
207		# Audio devices.
208		makedev audio c 13 0 ${uname} ${gname} 666
209		makedev mixer c 13 1 ${uname} ${gname} 666
210		;;
211	bmp085b[1-3]s77)
212		# Weather Cape: temperature & pressure sensor
213		bus=`expr ${dev} : 'bmp085b\\(.*\\)s77'` #bus number
214		major=`expr ${bus} + 52`
215
216		makedev bmp085b${bus}s77 c ${major} 0 ${uname} ${gname} 444
217		;;
218	c[0-3]d[0-7])
219		# Whole disk devices.
220		disk=`expr ${dev} : '...\\(.\\)'`
221		minor=`expr ${disk} '*' 5`
222
223		makedev ${dev} b ${major} ${minor} ${uname} ${gname} ${permissions}
224		;;
225	c[0-3]d[0-7]p[0-3])
226		# Disk primary partitions.
227		prefix=`expr ${dev} : '\\(.*\\).'`
228		disk=`expr ${dev} : '...\\(.\\)'`
229
230		for p in 0 1 2 3
231		do
232			minor=`expr ${disk} '*' 5 + 1 + ${p}`
233			makedev ${prefix}${p} b ${major} ${minor} \
234				${uname} ${gname} ${permissions}
235		done
236		;;
237	c[0-3]d[0-7]p[0-3]s[0-3])
238		# Disk subpartition.
239		prefix=`expr ${dev} : '\\(.*\\)...'`
240		disk=`expr ${dev} : '...\\(.\\)'`
241
242		for p in 0 1 2 3
243		do
244			for s in 0 1 2 3
245			do
246				minor=`expr 128 + ${disk} '*' 16 + ${p} '*' 4 + ${s}`
247				makedev ${prefix}${p}s${s} b ${major} ${minor} \
248					${uname} ${gname} ${permissions}
249			done
250		done
251		;;
252	c[0-3]t[0-7]|c[0-3]t[0-7]n)
253		# Tape devices.
254		prefix=`expr ${dev} : '\\(....\\)'`
255		tape=`expr ${dev} : '...\\(.\\)'`
256		minor=`expr 64 + ${tape} '*' 2`
257
258		makedev ${prefix}n c ${major} ${minor} ${uname} ${gname} 660
259		makedev ${prefix} c ${major} `expr ${minor} + 1` ${uname} ${gname} 660
260		;;
261	console|lp|tty|log|video)
262		# Console, line printer, anonymous tty, diagnostics device, video.
263		makedev console c 4 0 ${uname} tty ${permissions}
264		makedev tty c 5 0 ${uname} ${gname} 666
265		makedev lp c 6 0 daemon daemon 200
266		makedev log c 4 15 ${uname} ${gname} 222
267		makedev video c 4 125 ${uname} ${gname} ${permissions}
268		;;
269	eepromb[1-3]s5[0-7])
270		# cat24c256 driver
271		bus=`expr ${dev} : 'eepromb\\(.*\\)s'`
272		# configurable part of slave addr
273		slave_low=`expr ${dev} : 'eepromb.s5\\(.*\\)'`
274		major=`expr ${bus} '*' 8 + ${slave_low} + 17`
275
276		makedev eepromb${bus}s5${slave_low} b ${major} 0 ${uname} ${gname} ${permissions}
277		;;
278	fb0)
279		# Framebuffer driver
280		makedev ${dev} c 19 0 ${uname} ${gname} 644
281		;;
282	fbd)
283		# Faulty block device driver
284		makedev ${dev} b 14 0 ${uname} ${gname} ${permissions}
285		;;
286	fd[0-3])
287		# Floppy disk drive N has minor N.
288		minor=`expr ${dev} : '..\\(.\\)'`
289
290		makedev ${dev} b 2 ${minor} ${uname} ${gname} 666
291		;;
292	fd[0-3]p[0-3])
293		# Floppy disk partitions.
294		prefix=`expr ${dev} : '\\(.*\\).'`
295		drive=`expr ${dev} : '..\\(.\\)'`
296
297		for p in 0 1 2 3
298		do
299			minor=`expr 112 + ${drive} + ${p} '*' 4`
300			makedev ${prefix}${p} b 2 ${minor} \
301				${uname} ${gname} 666
302		done
303		;;
304	filter)
305		# Filter driver
306		makedev ${dev} b 11 0 ${uname} ${gname} ${permissions}
307		;;
308	hello)
309		# Hello driver
310		makedev ${dev} c 17 0 ${uname} ${gname} 644
311		;;
312	i2c-[1-3])
313		# i2c driver
314		bus=`expr ${dev} : '....\\(.*\\)'` # bus number
315		# least significant digit of major
316		major_low=`expr ${dev} : '....\\(.*\\)'`
317		major_low=`expr ${major_low} - 1`
318
319		makedev "i2c-${bus}" c 2${major_low} 0 ${uname} ${gname} ${permissions}
320		;;
321	input)
322		# Input server
323		makedev kbdmux c 64 0 ${uname} ${gname} ${permissions}
324		makedev mousemux c 64 64 ${uname} ${gname} ${permissions}
325
326		for n in 0 1 2 3
327		do
328			minor_keyboard=`expr ${n} + 1`
329			minor_mouse=`expr ${n} + 65`
330
331			makedev kbd${n} c 64 ${minor_keyboard} ${uname} ${gname} ${permissions}
332			makedev mouse${n} c 64 ${minor_mouse} ${uname} ${gname} ${permissions}
333		done
334		;;
335	klog)
336		# Logging device.
337		makedev ${dev} c 15 0 ${uname} ${gname} ${permissions}
338		;;
339	pc[0-3]|at[0-3]|qd[0-3]|ps[0-3]|pat[0-3]|qh[0-3]|PS[0-3])
340		# Obsolete density locked floppy disk drive n.
341		drive=`expr ${dev} : '.*\\(.\\)'`
342		minor=${drive}
343
344		for prefix in pc at qd ps pat qh PS
345		do
346			makedev ${prefix}${drive} b 2 ${minor} \
347				${uname} ${gname} 666
348			minor=`expr ${minor} + 4`
349		done
350		;;
351	pci)
352		# PCI server, manages PCI buses
353		makedev pci c 134 0 ${uname} ${gname} ${permissions}
354		;;
355	ptmx)
356		# Unix98 pseudoterminal master
357		makedev ptmx c 9 0 ${uname} tty 666
358		;;
359	ram|mem|kmem|null|boot|zero|imgrd)
360		# Memory devices.
361		makedev ram   b 1 0 ${uname} kmem ${permissions}
362		makedev mem   c 1 1 ${uname} kmem 640
363		makedev kmem  c 1 2 ${uname} kmem 640
364		makedev null  c 1 3 ${uname} kmem 666
365		makedev boot  b 1 4 ${uname} kmem ${permissions}
366		makedev zero  c 1 5 ${uname} kmem 644
367		makedev imgrd b 1 6 ${uname} kmem ${permissions}
368
369		for n in 0 1 2 3 4 5
370		do
371			minor=`expr ${n} + 7`
372
373			makedev ram${n} b 1 ${minor} ${uname} kmem ${permissions}
374		done
375		;;
376	random|urandom)
377		# Random data generator.
378		makedev random c 16 0 ${uname} ${gname} 644
379		makedev urandom c 16 0 ${uname} ${gname} 644
380		;;
381	sht21b[1-3]s40)
382		# Weather Cape: relative humidity & temperature sensor
383		bus=`expr ${dev} : 'sht21b\\(.*\\)s40'`
384		major=`expr ${bus} + 49`
385
386		makedev sht21b${bus}s40 c ${major} 0 ${uname} ${gname} 444
387		;;
388	tsl2550b[1-3]s39)
389		# Weather Cape: ambient light sensor
390		bus=`expr ${dev} : 'tsl2550b\\(.*\\)s39'`
391		major=`expr ${bus} + 46`
392
393		makedev tsl2550b${bus}s39 c ${major} 0 ${uname} ${gname} 444
394		;;
395	tty0[0-3])
396		# Serial lines.
397		line=`expr ${dev} : '.*\\(.\\)'`
398		minor=`expr ${line} + 16`
399
400		makedev ${dev} c 4 ${minor} ${uname} tty 666
401		;;
402	tty[p-s][0-9a-f]|pty[p-s][0-9a-f])
403		# Pseudo ttys.
404		dev=`expr ${dev} : '...\\(..\\)'`
405		group=`expr ${dev} : '\\(.\\)'`
406		group=`echo ${group} | tr 'pqrs' '0123'`
407		pty=`expr ${dev} : '.\\(.\\)'`
408		case ${pty} in
409			[a-f])	pty=1`/bin/echo ${pty} | tr 'abcdef' '012345'`
410		esac
411		minor_tty=`expr ${group} '*' 16 + ${pty} + 128`
412		minor_pty=`expr ${group} '*' 16 + ${pty} + 192`
413
414		makedev tty${dev} c 9 ${minor_tty} ${uname} tty 666
415		makedev pty${dev} c 9 ${minor_pty} ${uname} tty 666
416		;;
417	ttyc[1-7])
418		# Virtual consoles.
419		minor=`expr ${dev} : '....\\(.*\\)'`
420
421		makedev ${dev} c 4 ${minor} ${uname} tty ${permissions}
422		;;
423	vnd[0-7])
424		# Whole vnode disk devices.
425		makedev ${dev} b ${major} 0 ${uname} ${gname} ${permissions}
426		;;
427	vnd[0-7]p[0-3])
428		# Vnode disk primary partitions.
429		prefix=`expr ${dev} : '\\(.*\\).'`
430		disk=`expr ${dev} : '...\\(.\\)'`
431
432		for p in 0 1 2 3
433		do
434			minor=`expr 1 + ${p}`
435
436			makedev ${prefix}${p} b ${major} ${minor} \
437				${uname} ${gname} ${permissions}
438		done
439		;;
440	vnd[0-7]p[0-3]s[0-3])
441		# Vnode disk subpartition.
442		prefix=`expr ${dev} : '\\(.*\\)...'`
443		disk=`expr ${dev} : '...\\(.\\)'`
444
445		for p in 0 1 2 3
446		do
447			for s in 0 1 2 3
448			do
449				minor=`expr 128 + ${p} '*' 4 + ${s}`
450
451				makedev ${prefix}${p}s${s} b ${major} ${minor} \
452					${uname} ${gname} ${permissions}
453			done
454		done
455		;;
456	*)
457		echo "$0: don't know about ${dev}" >&2
458		EXIT=1
459	esac
460done
461
462exit $EXIT
463