MAKEDEV.tmpl revision 1.53
1#!/bin/sh -
2#	$NetBSD: MAKEDEV.tmpl,v 1.53 2006/06/19 15:44:35 gdamore Exp $
3#
4# Copyright (c) 2003 The NetBSD Foundation, Inc.
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15# 3. All advertising materials mentioning features or use of this software
16#    must display the following acknowledgement:
17#        This product includes software developed by the NetBSD
18#        Foundation, Inc. and its contributors.
19# 4. Neither the name of The NetBSD Foundation nor the names of its
20#    contributors may be used to endorse or promote products derived
21#    from this software without specific prior written permission.
22#
23# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
24# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
27# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33# POSSIBILITY OF SUCH DAMAGE.
34#
35#
36###########################################################################
37#
38#   PLEASE RUN "cd ../share/man/man8 ; make makedevs"
39#   AFTER CHANGING THIS FILE, AND COMMIT THE UPDATED MANPAGE!
40#
41###########################################################################
42#
43# Device "make" file.  Valid special arguments:
44#	all	makes all known devices, including local devices.
45#		Tries to make the 'standard' number of each type.
46#	init	A set of devices that is used for MFS /dev by init.
47#		May be equal to "all".
48#	floppy	devices to be put on install floppies
49#	ramdisk	devices to be put into INSTALL kernel ramdisks.
50#	std	standard devices
51#	local	configuration specific devices
52#	wscons	make wscons devices
53#	usbs	make USB devices
54#	isdns	make ISDN devices
55#
56# Tapes:
57#	st*	SCSI tapes
58#	wt*	QIC-interfaced (e.g. not SCSI) 3M cartridge tape
59#	ht*	MASSBUS TM03 and TU??
60#	mt*	MSCP tapes (e.g. TU81, TK50)
61#	tm*	UNIBUS TM11 and TE10 emulations (e.g. Emulex TC-11)
62#	ts*	UNIBUS TS11
63#	ut*	UNIBUS TU45 emulations (e.g. si 9700)
64#	uu*	TU58 cassettes on DL11 controller
65#
66# Disks:
67#	ccd*	concatenated disk devices
68#	cd*	SCSI or ATAPI CD-ROM
69#	cgd*	cryptographic disk devices
70#	raid*	RAIDframe disk devices
71#	sd*	SCSI disks
72#	wd*	"winchester" disk drives (ST506,IDE,ESDI,RLL,...)
73#	bmd*	Nereid bank memory disks
74#	ed*	IBM PS/2 ESDI disk devices
75#	fd*	"floppy" disk drives (3 1/2", 5 1/4")
76#	fss*	Files system snapshot devices
77#	gdrom*	Dreamcast "gigadisc" CD-ROM drive
78#	hk*	UNIBUS RK06 and RK07
79#	hp*	MASSBUS RM??
80#	ld*	Logical disk devices (e.g., hardware RAID)
81#	mcd*	Mitsumi CD-ROM
82#	md*	memory pseudo-disk devices
83#	ofdisk*	OpenFirmware disk devices
84#	ra*	MSCP disks (RA??, RD??)
85#	rb*	730 IDC w/ RB80 and/or RB02
86#	rd*	HDC9224 RD disks on VS2000
87#	rl*	UNIBUS RL02
88#	rx*	MSCP floppy disk (RX33/50/...)
89#	up*	other UNIBUS devices (e.g. on Emulex SC-21V controller)
90#	vnd*	"file" pseudo-disks
91#	xbd*	Xen virtual disks
92#	xd*	Xylogic 753/7053 disks
93#	xy*	Xylogic 450/451 disks
94#
95# Pointing devices:
96#	wsmouse* wscons mouse events
97#	lms*	Logitech bus mouse
98#	mms*	Microsoft bus mouse
99#	qms*	"quadrature mouse"
100#	pms*	PS/2 mouse
101#	mouse	mouse (provides events, for X11)
102#
103# Keyboard devices:
104#	wskbd*	wscons keyboard events
105#	kbd	raw keyboard (provides events, for X11)
106#	kbdctl	keyboard control
107#
108# Terminals/Console ports:
109#	tty[01]*	standard serial ports
110#	tty0*	SB1250 ("sbscn") serial ports (sbmips)
111#	ttyE*	wscons - Workstation console ("wscons") glass-tty emulators
112#	ttyCZ?	Cyclades-Z multiport serial boards.  Each "unit"
113#		makes 64 ports.
114#	ttyCY?	Cyclom-Y multiport serial boards. Each "unit" makes
115#		32 ports.
116#	ttye*	ITE bitmapped consoles
117#	ttyv0	pccons
118#	ttyC?	NS16550 ("com") serial ports
119#	ttyS*	SA1110 serial port (hpcarm)
120#	ttyTX?	TX39 internal serial ports (hpcmips)
121#	ttyB?	DEC 3000 ZS8530 ("scc") serial ports (alpha)
122#	ttyA*	mfc serial ports (amiga)
123#	ttyB*	msc serial ports (amiga)
124#	ttyC*	com style serial ports (DraCo, HyperCom) (amiga)
125#		On the DraCo, units 0 and 1 are the built-in "modem" and
126#		"mouse" ports, if configured.
127#	ttyA0   8530 Channel A (formerly ser02) (atari)
128#	ttyA1	8530 Channel B (formerly mdm02) (atari)
129#	ttyB0	UART on first 68901 (formerly mdm01) (atari)
130#	ixpcom	IXP12x0 COM ports
131#	epcom	EP93xx COM ports
132#	ttyM?	HP200/300 4 port serial mux interface (hp300)
133#	ttya	"ttya" system console (luna68k)
134#	ttyb	second system serial port (luna68k)
135#	tty*	Onboard serial ports (mvme68k)
136#		On the mvme147 these are: ttyZ1, ttyZ2 and ttyZ3.
137#		On the mvme167, and '177: ttyC1, ttyC2 and ttyC3.
138#		Note that tty[CZ]0 is grabbed by the console device
139#		so is not created by default
140#	dc*	PMAX 4 channel serial interface (kbd, mouse, modem, printer)
141#	scc*	82530 serial interface (pmax)
142#	ttyZ*	Zilog 8530 ("zstty") serial ports
143#	tty[abcd]	Built-in serial ports (sparc)
144#	tty*	Z88530 serial controllers (sparc64)
145#	ttyh*	SAB82532 serial controllers (sparc64)
146#	tty[a-j]	Built-in serial ports (sun2, sun3)
147#	ttyC?	pccons (arc)
148#	dz*	UNIBUS DZ11 and DZ32 (vax)
149#	dh*	UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11) (vax)
150#	dmf*	UNIBUS DMF32 (vax)
151#	dhu*    UNIBUS DHU11 (vax)
152#	dmz*    UNIBUS DMZ32 (vax)
153#	dl*	UNIBUS DL11 (vax)
154#	xencons	Xen virtual console
155#
156# Terminal multiplexors:
157#	dc*	4 channel serial interface (keyboard, mouse, modem, printer)
158#	dh*	UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11)
159#	dhu*	UNIBUS DHU11
160#	dl*	UNIBUS DL11
161#	dmf*	UNIBUS DMF32
162#	dmz*	UNIBUS DMZ32
163#	dz*	UNIBUS DZ11 and DZ32
164#	scc*	82530 serial interface
165#
166# Call units:
167#	dn*	UNIBUS DN11 and emulations (e.g. Able Quadracall)
168#
169# Pseudo terminals:
170#	ptm	pty multiplexor device.
171#	pty*	set of 16 master and slave pseudo terminals
172#	opty	first 16 ptys, to save inodes on install media
173#	ipty	first 2 ptys, for install media use only
174#
175# Printers:
176#	arcpp*	Archimedes parallel port
177#	lpt*	stock lp
178#	lpa*	interruptless lp
179#	par*	Amiga motherboard parallel port
180#
181# USB devices:
182#	usb*	USB control devices
183#	uhid*	USB generic HID devices
184#	ulpt*	USB printer devices
185#	ugen*	USB generic devices
186#	urio*	USB Diamond Rio 500 devices
187#	uscanner*	USB scanners
188#	ttyU*	USB modems
189#	ttyY*	USB serial adapters
190#
191# ISDN devices:
192#	isdn	communication between userland isdnd and kernel
193#	isdnctl	control device
194#	isdnbchan* raw b-channel access
195#	isdntel*	telephony device
196#	isdnteld*	telephony dialout device
197#	isdntrc*	trace device
198#
199# Video devices:
200#	bwtwo*	monochromatic frame buffer
201#	cgtwo*	8-bit color frame buffer
202#	cgthree*	8-bit color frame buffer
203#	cgfour*	8-bit color frame buffer
204#	cgsix*	accelerated 8-bit color frame buffer
205#	cgeight*	24-bit color frame buffer
206#	etvme	Tseng et-compatible cards on VME (atari)
207#	ik*	UNIBUS interface to Ikonas frame buffer
208#	leo	Circad Leonardo VME-bus true color (atari)
209#	ps*	UNIBUS interface to Picture System 2
210#	qv*	QVSS (MicroVAX) display
211#	tcx*	accelerated 8/24-bit color frame buffer
212#
213# Maple bus devices:
214#	maple	Maple bus control devices
215#	mlcd*	Maple bus LCD devices
216#	mmem*	Maple bus storage devices
217#
218# IEEE1394 bus devices:
219#	fw*	IEEE1394 bus generic node access devices
220#	fwmem*	IEEE1394 bus physical memory of the remote node access devices
221#
222# Special purpose devices:
223#	ad*	UNIBUS interface to Data Translation A/D converter
224#	agp*	AGP GART devices
225#	altq	ALTQ control interface
226#	apm	power management device
227#	audio*	audio devices
228#	bell*	OPM bell device (x68k)
229#	bktr	Brooktree 848/849/878/879 based TV cards
230#	bpf	packet filter
231#	bthubctl Bluetooth HUB control
232#	cfs*	Coda file system device
233#	ch*	SCSI media changer
234#	cir*	Consumer IR
235#	clockctl clock control for non root users
236#	crypto	hardware crypto access driver
237#	dmoverio hardware-assisted data movers
238#	dpt*	DPT/Adaptec EATA RAID management interface
239#	dpti*	DPT/Adaptec I2O RAID management interface
240#	fb*	PMAX generic framebuffer pseudo-device
241#	fd	file descriptors
242#	grf*	graphics frame buffer device
243#	hil	HP300 HIL input devices
244#	icp	ICP-Vortex/Intel RAID control interface
245#	iic*	IIC bus device
246#	iop*	I2O IOP control interface
247#	ipl	IP Filter
248#	irframe* IrDA physical frame
249#	ite*	terminal emulator interface to HP300 graphics devices
250#	joy*	joystick device
251#	kttcp	kernel ttcp helper device
252#	lkm	loadable kernel modules interface
253#	magma*	Magma multiport serial/parallel cards
254#	midi*	MIDI
255#	mlx*	Mylex DAC960 control interface
256#	mly*	Mylex AcceleRAID/eXtremeRAID control interface
257#	np*	UNIBUS Ethernet co-processor interface, for downloading.
258#	nsmb*	SMB requester
259#	openfirm OpenFirmware accessor
260#	pci*	PCI bus access devices
261#	pf	PF packet filter
262#	pow*	power management device (x68k)
263#	px*	PixelStamp Xserver access
264#	radio*	radio devices
265#	random	Random number generator
266#	rtc*	RealTimeClock
267#	satlink* PlanetConnect satellite receiver driver
268#	scsibus* SCSI busses
269#	se*	SCSI Ethernet
270#	ses*	SES/SAF-TE SCSI Devices
271#	speaker	PC speaker		(XXX - installed)
272#	sram	battery backuped memory (x68k)
273#	ss*	SCSI scanner
274#	stic*	PixelStamp interface chip
275#	sysmon	System Monitoring hardware
276#	systrace syscall tracer
277#	tap*	virtual Ethernet device
278#	tun*	network tunnel driver
279#	twe	3ware Escalade control interface
280#	uk*	unknown SCSI device
281#	veriexec verified executable fingerprint loader
282#	vmegen*	generic VME access
283#	view*	generic interface to graphic displays (Amiga)
284#	wsfont*	console font control
285#	wsmux*	wscons event multiplexor
286#	xenevt	Xen event interface
287
288
289PATH=/sbin:/usr/sbin:/bin:/usr/bin:/rescue
290
291
292usage()
293{
294	cat 1>&2 << _USAGE_
295Usage: ${0##*/} [-f] [-m mknod] [-s]  special [...]
296	Create listed special devices.  Options:
297	-f		Force permissions to be updated on existing devices.
298	-m mknod	Name of mknod(8) program.  [\$TOOL_MKNOD or mknod]
299	-s		Generate mtree(8) specfile instead of creating devices.
300
301_USAGE_
302	exit 1
303}
304
305# zeropad width number
306#	display number with a zero (`0') padding of width digits.
307#
308zeropad()
309{
310	case $(($1 - ${#2})) in
311	5)	echo 00000$2;;
312	4)	echo 0000$2;;
313	3)	echo 000$2;;
314	2)	echo 00$2;;
315	1)	echo 0$2;;
316	0)	echo $2;;
317	*)	echo "$0: bad padding" 1>&2; exit 1;;
318	esac
319}
320
321# hexprint number
322#	display (base10) number as hexadecimal
323#
324hexprint()
325{
326	case $1 in
327	[0-9])	echo $1 ;;
328	10)	echo a ;;
329	11)	echo b ;;
330	12)	echo c ;;
331	13)	echo d ;;
332	14)	echo e ;;
333	15)	echo f ;;
334	*)	echo $(hexprint $(($1 / 16)))$(hexprint $(($1 % 16))) ;;
335	esac
336}
337
338do_force=false
339do_specfile=false
340while getopts fm:s ch; do
341	case ${ch} in
342	f)	do_force=true ;;
343	m)	TOOL_MKNOD=${OPTARG} ;;
344	s)	do_specfile=true ;;
345	*)	usage ;;
346	esac
347done
348shift $((${OPTIND} - 1))
349[ $# -gt 0 ] || usage
350
351
352MKNOD="${TOOL_MKNOD:-mknod} -F netbsd"
353if $do_force; then
354	MKNOD="${MKNOD} -R"
355else
356	MKNOD="${MKNOD} -r"
357fi
358
359u_root="%uid_root%"
360u_uucp="%uid_uucp%"
361g_kmem="%gid_kmem%"
362g_ntpd="%gid_ntpd%"
363g_operator="%gid_operator%"
364g_wheel="%gid_wheel%"
365dialin=0
366dialout=524288
367callunit=262144
368
369# only allow read&write for owner by default
370umask 077
371
372# Check if we have fdesc mounted
373if [ -d fd ]; then
374        case "`df fd`" in
375        *fdesc*)	nofdesc=false;;
376        *)		nofdesc=true;;
377        esac
378else
379        nofdesc=true
380fi
381
382
383if $do_specfile; then
384	echo ". type=dir"
385fi
386
387
388#
389# functions available to create nodes:
390#
391# mkdev name [b|c] major minor [mode{=600} [gid{=0} [uid{=0}]]]
392#	create device node `name' with the appropriate permissions
393#
394# lndev src target
395#	create a symlink from src to target
396#
397# makedir dir mode
398#	create directory with appropriate mode
399#
400
401mkdev()
402{
403	if $do_specfile; then
404		case $2 in
405		b)	type=block ;;
406		c)	type=char ;;
407		esac
408		echo "./$1 type=${type} device=netbsd,$3,$4 mode=${5:-600} gid=${6:-$g_wheel} uid=${7:-$u_root}"
409	else
410		${MKNOD} -m ${5:-600} -g \#${6:-$g_wheel} -u \#${7:-$u_root} $1 $2 $3 $4
411	fi
412}
413
414lndev()
415{
416	if $do_specfile; then
417		echo "./$2 type=link link=$1 mode=0700 gid=$g_wheel uid=$u_root"
418	else
419		ln -f -s $1 $2
420	fi
421}
422
423makedir()
424{
425	if $do_specfile; then
426		echo "./$1 type=dir mode=$2 gid=$g_wheel uid=$u_root"
427	else
428		mkdir $1 2>/dev/null
429		chmod $2 $1
430	fi
431}
432
433warn()
434{
435	echo 1>&2 "$0: $*"
436}
437
438
439
440# makedev special [...]
441#	the main loop
442#
443
444makedev()
445{
446
447for i
448do
449
450case $i in
451
452%MD_DEVICES%
453
454all)
455	makedev all_md
456	makedev std fd ptm pty0 pty1 pty2 pty3
457	makedev ccd0 ccd1 ccd2 ccd3
458	makedev cgd0 cgd1 cgd2 cgd3
459	makedev fss0 fss1 fss2 fss3
460	makedev md0 md1
461	makedev raid0 raid1 raid2 raid3 raid4 raid5 raid6 raid7
462	makedev vnd0 vnd1 vnd2 vnd3
463	makedev bpf
464	makedev tun0 tun1 tun2 tun3
465	makedev ipl pf crypto random systrace
466	makedev lkm clockctl
467	makedev local
468	makedev atabus0 atabus1 atabus2 atabus3
469	makedev tap tap0 tap1 tap2 tap3
470	makedev gpio gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
471	;;
472
473init)
474	# unless overridden by MD entry, this is equal to 'all'
475	makedev all
476	;;
477
478%MI_DEVICES_BEGIN%
479audio)
480	makedev audio0 audio1 audio2 audio3
481	lndev sound0 sound
482	lndev audio0 audio
483	lndev mixer0 mixer
484	lndev audioctl0 audioctl
485	;;
486
487gpio)
488	makedev gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
489	lndev gpio0 gpio
490	;;
491
492radio)
493	makedev radio0 radio1
494	lndev radio0 radio
495	;;
496
497ramdisk)
498	makedev floppy md0
499	;;
500
501usbs)
502	makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7
503	makedev uhid0 uhid1 uhid2 uhid3
504	makedev ulpt0 ulpt1
505	makedev ttyU0 ttyU1
506	makedev ttyY0 ttyY1
507	makedev urio0
508	makedev uscanner0 uscanner1
509	makedev utoppy0 utoppy1
510	makedev ugen0
511	;;
512
513isdns)
514	makedev isdn isdnctl isdnbchan0 isdnbchan1 isdntel0 isdntel1 isdnteld0 isdnteld1 isdntrc0 isdntrc1
515	;;
516
517std)
518	mkdev		console	c %cons_chr% 0	600
519	mkdev		constty	c %cons_chr% 1	600
520	mkdev		drum	c %swap_chr% 0	640 $g_kmem
521	mkdev		kmem	c %mem_chr% 1	640 $g_kmem
522	mkdev		mem	c %mem_chr% 0	640 $g_kmem
523	mkdev		null	c %mem_chr% 2	666
524	mkdev		zero	c %mem_chr% 12	666
525	mkdev		klog	c %log_chr% 0	600
526	mkdev		ksyms	c %ksyms_chr% 0	444
527	if $nofdesc; then
528		mkdev	tty	c %ctty_chr% 0		666
529		mkdev	stdin	c %filedesc_chr% 0	666
530		mkdev	stdout	c %filedesc_chr% 1	666
531		mkdev	stderr	c %filedesc_chr% 2	666
532	fi
533	;;
534
535usb)
536	mkdev usb c %usb_chr% 255 444
537	;;
538
539usb*)
540	unit=${i#usb}
541	usb=usb$unit
542	mkdev usb$unit c %usb_chr% $unit
543	;;
544
545uhid*)
546	unit=${i#uhid}
547	mkdev uhid$unit c %uhid_chr% $unit 666
548	;;
549
550ulpt*)
551	unit=${i#ulpt}
552	mkdev ulpt$unit c %ulpt_chr% $unit
553	mkdev ulpn$unit c %ulpt_chr% $(($unit + 64))
554	;;
555
556urio*)
557	unit=${i#urio}
558	mkdev urio$unit c %urio_chr% $unit 666
559	;;
560
561uscanner*)
562	unit=${i#uscanner}
563	mkdev uscanner$unit c %uscanner_chr% $unit
564	;;
565
566utoppy*)
567	unit=${i#utoppy}
568	mkdev utoppy$unit c %utoppy_chr% $unit
569	;;
570
571ttyY*)
572	unit=${i#ttyY}
573	mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin  )) "" "" $u_uucp
574	mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp
575	mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp
576	;;
577
578ttyU*)
579	unit=${i#ttyU}
580	mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin  )) "" "" $u_uucp
581	mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp
582	mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp
583	;;
584
585ugen*)
586	unit=${i#ugen}
587	for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
588	do
589		mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0}))
590	done
591	;;
592
593wscons)
594	makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7
595	makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3
596	makedev wskbd0 wskbd1 wskbd2 wskbd3
597	makedev wsmux0 wsmux1 wsmux2 wsmux3
598	makedev wsmouse wskbd
599	makedev ttyEcfg ttyEstat
600	makedev wsfont
601	;;
602
603wsmouse)
604	mkdev wsmouse c %wsmux_chr% 0
605	;;
606
607wskbd)
608	mkdev wskbd c %wsmux_chr% 1
609	;;
610
611wsmux*)
612	unit=${i#wsmux}
613	mkdev wsmux$unit    c %wsmux_chr% $unit
614	mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200
615	;;
616
617xenevt)
618	mkdev xenevt c %xenevt_chr% 0
619	;;
620
621xencons)
622	mkdev xencons c %xencons_chr% 0
623	;;
624
625ttyEstat)
626	mkdev ttyEstat c %wsdisplay_chr% 254
627	;;
628
629ttyEcfg)
630	mkdev ttyEcfg c %wsdisplay_chr% 255
631	;;
632
633ttyE*)
634	unit=${i#ttyE}
635	mkdev ttyE$unit c %wsdisplay_chr% $unit
636	;;
637
638wsmouse*)
639	unit=${i#wsmouse}
640	mkdev wsmouse$unit c %wsmouse_chr% $unit
641	;;
642
643wskbd*)
644	unit=${i#wskbd}
645	mkdev wskbd$unit c %wskbd_chr% $unit
646	;;
647
648fd)
649	if $nofdesc; then
650		makedir fd 755
651		n=0
652		while [ $n -lt 64 ]
653		do
654			mkdev fd/$n c %filedesc_chr% $n 666
655			n=$(($n + 1))
656		done
657	fi
658	;;
659
660wt*)
661	case $i in
662	wt*) name=wt;  unit=${i#wt};	chr=%wt_chr%;	blk=%wt_blk%;;
663	esac
664	for sub in $unit $(($unit+8)) $(($unit+16))
665	do
666		mkdev $name$sub		b $blk $(($sub + 0)) 660 $g_operator
667		mkdev n$name$sub	b $blk $(($sub + 4)) 660 $g_operator
668		mkdev r$name$sub	c $chr $(($sub + 0)) 660 $g_operator
669		mkdev nr$name$sub	c $chr $(($sub + 4)) 660 $g_operator
670	done
671	;;
672
673md*)
674	makedisk_minimal md ${i#md} %md_blk% %md_chr%
675	;;
676
677fss*)
678	case $i in
679	fss*) name=fss; unit=${i#fss};	blk=%fss_blk%;	chr=%fss_chr%
680	esac
681	mkdev $name$unit	b $blk $unit 660 $g_operator
682	mkdev r$name$unit	c $chr $unit 660 $g_operator
683	;;
684
685ss*)
686	case $i in
687	ss*) name=ss;	unit=${i#ss};	chr=%ss_chr%;;
688	esac
689	mkdev $name$unit	c $chr $(($unit * 16 + 0)) 640 $g_operator
690	mkdev n$name$unit	c $chr $(($unit * 16 + 1)) 640 $g_operator
691	mkdev en$name$unit	c $chr $(($unit * 16 + 3)) 640 $g_operator
692	;;
693
694ccd*|cgd*|raid*|vnd*)
695	case $i in
696	ccd*)	name=ccd;	unit=${i#ccd};	blk=%ccd_blk%;	chr=%ccd_chr%;;
697	cgd*)	name=cgd;	unit=${i#cgd};	blk=%cgd_blk%;	chr=%cgd_chr%;;
698	raid*)	name=raid;	unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;;
699	vnd*)	name=vnd;	unit=${i#vnd};	blk=%vnd_blk%;	chr=%vnd_chr%;;
700	esac
701	%MKDISK% $name $unit $blk $chr
702	;;
703
704sd*)
705	name=sd; unit=${i#sd};	blk=%sd_blk%;	chr=%sd_chr%
706	%MKDISK% $name $unit $blk $chr
707	;;
708
709wd*)
710	name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr%
711	%MKDISK% $name $unit $blk $chr
712	;;
713
714fd*)
715	name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr%
716	%MKDISK% $name $unit $blk $chr
717	;;
718
719ld*)
720	name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr%
721	%MKDISK% $name $unit $blk $chr
722	;;
723
724ed*)
725	name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr%
726	%MKDISK% $name $unit $blk $chr
727	;;
728
729ofdisk*)
730	name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr%
731	%MKDISK% $name $unit $blk $chr
732	;;
733
734xbd*)
735	name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr%
736	%MKDISK% $name $unit $blk $chr
737	;;
738
739ttyCY*)
740	name=tyCY; chr=%cy_chr%; off=32
741	unit=${i#t${name}}
742	minor=$(($unit * $off))
743	eminor=$(($minor + $off))
744	while [ $minor -lt $eminor ]
745	do
746		# nminor=$(zeropad 3 $minor)
747		nminor=000$minor
748		nminor=${nminor#${nminor%???}}
749		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
750		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
751		minor=$(($minor + 1))
752	done
753	;;
754
755ttyCZ*)
756	name=tyCZ; chr=%cz_chr%; off=64
757	unit=${i#t${name}}
758	minor=$(($unit * $off))
759	eminor=$(($minor + $off))
760	while [ $minor -lt $eminor ]
761	do
762		# nminor=$(zeropad 4 $minor)
763		nminor=0000$minor
764		nminor=${nminor#${nminor%????}}
765		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
766		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
767		minor=$(($minor + 1))
768	done
769	;;
770
771
772tty[0-9]|tty0[0-9])
773	# some archs have built-in zstty (major %zstty_chr%) instead
774	# of NS16550; create ttyZ* and hardlink as [dt]ty0*; this
775	# needs to be before com entry, for archs which have both
776	unit=${i#tty}
777	unit=$(($unit + 0))
778	makedev ttyZ${unit}
779	lndev ttyZ$unit tty0${unit}
780	lndev dtyZ$unit dty0${unit}
781	;;
782
783tty0*|tty1*|tty[0-9])
784	unit=${i#tty}
785	# ounit=$(zeropad 2 $unit)
786	ounit=00$unit
787	ounit=${ounit#${ounit%??}}
788	mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp
789	mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp
790	;;
791
792ttyC*)
793		# some archs call com_chr ttyC traditionally
794	unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr%
795	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
796	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
797	;;
798
799ttyh*)
800	unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr%
801	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
802	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
803	;;
804
805ttyTX*)
806	unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr%
807	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
808	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
809	;;
810
811ttyZ*)
812	unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr%
813	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
814	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
815	;;
816
817opty)
818	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
819	do
820		case $j in
821		[0-9])	jn=$j ;;
822		a)	jn=10 ;;
823		b)	jn=11 ;;
824		c)	jn=12 ;;
825		d)	jn=13 ;;
826		e)	jn=14 ;;
827		f)	jn=15 ;;
828		esac
829		mkdev ttyp$j c %pts_chr% $jn 666
830		mkdev ptyp$j c %ptc_chr% $jn 666
831	done
832	;;
833
834pty*)
835	class=${i#pty}
836	d1="p q r s t u v w x y z P Q R S T"
837	if [ "$class" -ge 64 ]
838	then
839		warn "$i: pty unit must be between 0 and 63"
840		continue
841	elif [ "$class" -lt 16 ]
842	then
843		offset=0
844		mult=0
845		d2="0 1 2 3 4 5 6 7 8 9 a b c d e f"
846	else
847		class=$(($class - 16))
848		offset=256
849		mult=2
850		d2="g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
851	fi
852	start=$(($class * 16))
853	set -- $d2
854	nt=$#
855	s1=$(($start / $nt))
856	set -- $d1
857	shift $s1
858	t1=$1
859	if [ "$t1" = v ]; then
860		warn "$i: pty unit conflicts with console ttyv0 device"
861		continue
862	fi
863	s2=$(($start % ($nt - $s1 * $mult)))
864	set -- $d2
865	shift $s2
866	t2=$1
867	unit=$(($start + $offset - $s1 * $mult))
868	end=$(($unit + 16))
869	while [ "$unit" -lt "$end" ]
870	do
871		mkdev tty$t1$t2 c %pts_chr% $unit 666
872		mkdev pty$t1$t2 c %ptc_chr% $unit 666
873		shift
874		t2=$1
875		if [ -z "$t2" ]
876		then
877			break
878		fi
879		unit=$(($unit + 1))
880	done
881	;;
882
883stic*)
884	unit=${i#stic}
885	mkdev stic$unit c %stic_chr% $unit
886	;;
887
888st*)
889	case $i in
890	st*) name=st;	unit=${i#st};	chr=%st_chr%;	blk=%st_blk%;;
891	esac
892	mkdev $name$unit	b $blk $(($unit * 16 + 0)) 660 $g_operator
893	mkdev n$name$unit	b $blk $(($unit * 16 + 1)) 660 $g_operator
894	mkdev e$name$unit	b $blk $(($unit * 16 + 2)) 660 $g_operator
895	mkdev en$name$unit	b $blk $(($unit * 16 + 3)) 660 $g_operator
896	mkdev r$name$unit	c $chr $(($unit * 16 + 0)) 660 $g_operator
897	mkdev nr$name$unit	c $chr $(($unit * 16 + 1)) 660 $g_operator
898	mkdev er$name$unit	c $chr $(($unit * 16 + 2)) 660 $g_operator
899	mkdev enr$name$unit	c $chr $(($unit * 16 + 3)) 660 $g_operator
900	;;
901
902ses*|ch*|uk*)
903	case $i in
904	ch*)	name=ch;	unit=${i#ch};	chr=%ch_chr%;;
905	uk*)	name=uk;	unit=${i#uk};	chr=%uk_chr%;;
906	ses*)	name=ses;	unit=${i#ses};	chr=%ses_chr%;;
907	esac
908	mkdev $name$unit c $chr $unit 640 $g_operator
909	;;
910
911cd*)
912	makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr% %
913	;;
914
915mcd*)
916	makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr%
917	;;
918
919gdrom*)
920	makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr%
921	;;
922
923lpt*|lpa*)
924	case $i in
925	lpt*) name=lpt;	unit=${i#lpt};	chr=%lpt_chr%;	flags=0;;
926	lpa*) name=lpa;	unit=${i#lpa};	chr=%lpt_chr%;	flags=128;;
927	esac
928	mkdev $name$unit c $chr $(($unit + $flags))
929	mkdev lpt${unit}ctl c $chr $(($unit + 256))
930	;;
931
932bpf)
933	mkdev bpf	c %bpf_chr% 0
934	lndev bpf bpf0
935	;;
936
937bthubctl)
938	mkdev bthubctl c %bthub_chr% 0
939	;;
940
941tun*)
942	unit=${i#tun}
943	mkdev tun$unit c %tun_chr% $unit
944	;;
945
946joy*)
947	unit=${i#joy}
948	mkdev joy$unit c %joy_chr% $unit
949	;;
950
951ipl)
952	mkdev ipl	c %ipl_chr% 0
953	mkdev ipnat	c %ipl_chr% 1
954	mkdev ipstate	c %ipl_chr% 2
955	mkdev ipauth	c %ipl_chr% 3
956	;;
957
958pf)
959	mkdev pf c %pf_chr% 0
960	;;
961
962crypto)
963	mkdev crypto c %crypto_chr% 0 666
964	;;
965
966speaker)
967	mkdev speaker c %spkr_chr% 0
968	;;
969
970lkm)
971	mkdev lkm c %lkm_chr% 0 640 $g_kmem
972	;;
973
974audio*)
975	unit=${i#audio}
976	audio=audio$unit
977	sound=sound$unit
978	mixer=mixer$unit
979	audioctl=audioctl$unit
980	: ${unit:-0}
981	mkdev $sound    c %audio_chr% $(($unit + 0))	666
982	mkdev $audio    c %audio_chr% $(($unit + 128))	666
983	mkdev $mixer    c %audio_chr% $(($unit + 16))	666
984	mkdev $audioctl c %audio_chr% $(($unit + 192))	666
985	;;
986
987gpio*)
988	unit=${i#gpio}
989	mkdev gpio$unit c %gpio_chr% $unit 644
990	;;
991
992rmidi*)
993	unit=${i#rmidi}
994	mkdev rmidi$unit c %midi_chr% $unit 666
995	;;
996
997music*)
998	unit=${i#music}
999	: ${unit:-0}
1000	mkdev music$unit     c %sequencer_chr% $(($unit + 0))	666
1001	mkdev sequencer$unit c %sequencer_chr% $(($unit + 128))	666
1002	;;
1003
1004radio*)
1005	unit=${i#radio}
1006	: ${unit:-0}
1007	mkdev radio$unit c %radio_chr% $unit 666
1008	;;
1009
1010apm)
1011	mkdev apm	c %apm_chr% 0 644
1012	mkdev apmctl	c %apm_chr% 8 644
1013	;;
1014
1015apm)
1016		# hpcmips uses `apmdev_chr' instead of `apm_chr'
1017	mkdev apm	c %apmdev_chr% 0 644
1018	mkdev apmctl	c %apmdev_chr% 8 644
1019	;;
1020
1021satlink*)
1022	unit=${i#satlink}
1023	mkdev satlink$unit c %satlink_chr% $unit 444
1024	;;
1025
1026random)
1027	mkdev random	c %rnd_chr% 0 444
1028	mkdev urandom	c %rnd_chr% 1 644
1029	;;
1030
1031cfs*)
1032	unit=${i#cfs}
1033	mkdev cfs$unit c %vcoda_chr% $unit
1034	;;
1035
1036sysmon)
1037	mkdev sysmon	c %sysmon_chr% 0 644
1038	mkdev watchdog	c %sysmon_chr% 1 644
1039	mkdev power	c %sysmon_chr% 2 640
1040	;;
1041
1042scsibus*)
1043	unit=${i#scsibus}
1044	mkdev scsibus$unit c %scsibus_chr% $unit 644
1045	;;
1046
1047bktr)
1048	makedev bktr0 bktr1
1049	lndev	bktr0	bktr
1050	lndev	tuner0	tuner
1051	lndev	vbi0	vbi
1052	;;
1053
1054bktr*)
1055	unit=${i#bktr}
1056	mkdev bktr$unit		c %bktr_chr% $(($unit + 0))	444
1057	mkdev tuner$unit	c %bktr_chr% $(($unit + 16))	444
1058	mkdev vbi$unit		c %bktr_chr% $(($unit + 32))	444
1059	;;
1060
1061iop*)
1062	unit=${i#iop}
1063	mkdev iop$unit c %iop_chr% $unit
1064	;;
1065
1066mlx*)
1067	unit=${i#mlx}
1068	mkdev mlx$unit c %mlx_chr% $unit
1069	;;
1070
1071mly*)
1072	unit=${i#mly}
1073	mkdev mly$unit c %mly_chr% $unit
1074	;;
1075
1076twe*)
1077	unit=${i#twe}
1078	mkdev twe$unit c %twe_chr% $unit
1079	;;
1080
1081icp*)
1082	unit=${i#icp}
1083	mkdev icp$unit c %icp_chr% $unit
1084	;;
1085
1086agp*)
1087	unit=${i#agp}
1088	mkdev agp$unit c %agp_chr% $unit 644
1089	if [ "$unit" = "0" ]; then
1090		lndev agp$unit agpgart
1091	fi
1092	;;
1093
1094pci*)
1095	unit=${i#pci}
1096	mkdev pci$unit c %pci_chr% $unit 644
1097	;;
1098
1099dpti*)
1100	unit=${i#dpti}
1101	mkdev dpti$unit c %dpti_chr% $unit
1102	;;
1103
1104dpt*)
1105	unit=${i#dpt}
1106	mkdev dpt$unit c %dpt_chr% $unit
1107	;;
1108
1109altq)
1110	makedir altq 755
1111	unit=0
1112	for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq
1113	do
1114		mkdev altq/$dev c %altq_chr% $unit 644
1115		unit=$(($unit + 1))
1116	done
1117	;;
1118
1119isdn)
1120	mkdev isdn c %isdn_chr% 0
1121	;;
1122
1123isdnctl)
1124	mkdev isdnctl c %isdnctl_chr% 0
1125	;;
1126
1127isdnbchan*)
1128	unit=${i#isdnbchan}
1129	mkdev isdnbchan$unit c %isdnbchan_chr% $unit
1130	;;
1131
1132isdnteld*)
1133	unit=${i#isdnteld}
1134	mkdev isdnteld$unit c %isdntel_chr% $(($unit + 64))
1135	;;
1136
1137isdntel*)
1138	unit=${i#isdntel}
1139	mkdev isdntel$unit c %isdntel_chr% $unit
1140	;;
1141
1142isdntrc*)
1143	unit=${i#isdntrc}
1144	mkdev isdntrc$unit c %isdntrc_chr% $unit
1145	;;
1146
1147vmegen)
1148	makedev vmegen0 vmegen1 vmegen2 vmegen3
1149	;;
1150
1151vmegen*)
1152	unit=${i#vmegen}
1153	mkdev vmegen$unit c %vmegeneric_chr% $(($unit * 16 + 0))
1154	;;
1155
1156wsfont)
1157	mkdev wsfont c %wsfont_chr% 0
1158	;;
1159
1160cir*)
1161	unit=${i#cir}
1162	mkdev cir$unit c %cir_chr% $unit 666
1163	;;
1164
1165irframe*)
1166	unit=${i#irframe}
1167	mkdev irframe$unit c %irframe_chr% $unit
1168	;;
1169
1170fcom*)
1171	unit=${i#fcom}
1172	mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp
1173	;;
1174
1175openfirm)
1176	mkdev openfirm c %openfirm_chr% 0 444
1177	;;
1178
1179nvram)
1180	mkdev nvram c %nvram_chr% 0 644
1181	;;
1182
1183rtc)
1184	mkdev rtc c %rtc_chr% 0 644
1185	;;
1186
1187clockctl)
1188	mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd
1189	;;
1190
1191nsmb)
1192	makedev nsmb0 nsmb1 nsmb2 nsmb3
1193	;;
1194
1195nsmb*)
1196	unit=${i#nsmb}
1197	mkdev nsmb$unit c %nsmb_chr% $unit 644
1198	;;
1199
1200systrace)
1201	mkdev systrace c %systrace_chr% 0 644
1202	;;
1203
1204kttcp)
1205	mkdev kttcp c %kttcp_chr% 0
1206	;;
1207
1208dmoverio)
1209	mkdev dmoverio c %dmoverio_chr% 0 644
1210	;;
1211
1212veriexec)
1213	mkdev veriexec c %veriexec_chr% 0 600
1214	;;
1215
1216ttyv*)
1217	unit=${i#ttyv}
1218	mkdev ttyv$unit c %pc_chr% $unit
1219	;;
1220
1221# arm, acorn32
1222ttyv*)
1223	unit=${i#ttyv}
1224	mkdev ttyv$unit c %physcon_chr% $unit
1225	;;
1226
1227arcpp*)
1228	unit=${i#arcpp}
1229	mkdev arcpp$unit c %arcpp_chr% $unit
1230	;;
1231
1232par*)
1233	unit=${i#par}
1234	case $unit in
1235	0)
1236		mkdev par$unit c %par_chr% $unit
1237		;;
1238	*)
1239		warn "bad unit for par in: $i"
1240		;;
1241	esac
1242	;;
1243
1244ite*|ttye*)
1245	case $i in
1246	ite*)	unit=${i#ite};;
1247	ttye*)	unit=${i#ttye};;
1248	esac
1249	mkdev ttye$unit	c %ite_chr% $unit
1250	;;
1251
1252pms*)
1253	unit=${i#pms}
1254	mkdev pms$unit c %opms_chr% $unit
1255	;;
1256
1257qms*)
1258	unit=${i#qms}
1259	mkdev qms$unit c %qms_chr% $unit
1260	;;
1261
1262lms*)
1263	unit=${i#lms}
1264	mkdev lms$unit c %lms_chr% $unit
1265	;;
1266
1267mms*)
1268	unit=${i#mms}
1269	mkdev mms$unit c %mms_chr% $unit
1270	;;
1271
1272mouse-*)
1273	case $i in
1274	mouse-pms*) name=pms ;;
1275	mouse-qms*) name=qms ;;
1276	esac
1277	unit=${i#mouse-${name}}
1278	lndev $name$unit mouse
1279	;;
1280
1281kbd)
1282	mkdev kbd c %kbd_chr% 0
1283	;;
1284
1285kbdctl)
1286	mkdev kbdctl c %kbd_chr% 1
1287	;;
1288
1289vidcconsole0)
1290	mkdev vidcconsole0 c %vidcconsole_chr% 0 640
1291	;;
1292
1293view*)
1294	unit=${i#view}
1295	mkdev view$unit	c %view_chr% $unit 666
1296	;;
1297
1298mouse*)
1299	unit=${i#mouse}
1300	case $unit in
1301	0|1)
1302		mkdev mouse$unit c %ms_chr% $unit 666
1303		if [ $unit = 0 ]; then
1304			lndev mouse$unit mouse
1305		fi
1306		;;
1307	*)
1308		warn "bad unit for mouse in: $i"
1309		;;
1310	esac
1311	;;
1312
1313panel)
1314	mkdev panel0 c %panel_chr% 0 660
1315	;;
1316
1317tslcd)
1318	mkdev tslcd0 c %tslcd_chr% 0 660
1319	;;
1320
1321ipty)
1322	mkdev ttyp0 c %pts_chr% 0 666
1323	mkdev ttyp1 c %pts_chr% 1 666
1324	mkdev ptyp0 c %ptc_chr% 0 666
1325	mkdev ptyp1 c %ptc_chr% 1 666
1326	;;
1327
1328ptm)
1329	mkdev ptmx c %ptm_chr% 0 666
1330	mkdev ptm c %ptm_chr% 1 666
1331	;;
1332
1333grf*)
1334	unit=${i#grf}
1335	mkdev grf$unit c %grf_chr% $unit 666
1336	;;
1337
1338etvme)
1339	mkdev etvme c %et_chr% 0
1340	;;
1341
1342leo*)
1343	unit=${i#leo}
1344	mkdev leo$unit c %leo_chr% $unit
1345	;;
1346
1347scif*)
1348	unit=${i#scif}
1349	mkdev scif$unit c %scif_chr% $unit "" "" $u_uucp
1350	;;
1351
1352sci*)
1353	unit=${i#sci}
1354	mkdev sci$unit c %sci_chr% $unit "" "" $u_uucp
1355	;;
1356
1357maple*)
1358	case $i in
1359	mapleA*) name="mapleA"; unit=0;;
1360	mapleB*) name="mapleB"; unit=1;;
1361	mapleC*) name="mapleC"; unit=2;;
1362	mapleD*) name="mapleD"; unit=3;;
1363	esac
1364	subunit=${i#$name}
1365	mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit))
1366	;;
1367
1368mmem*)
1369	unit=${i#mmem}
1370	for pt in 0	# 1 2 3 4 ... 255
1371	do
1372#		mkdev mmem${unit}.${pt}a  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
1373		mkdev mmem${unit}.${pt}c  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
1374#		mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
1375		mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
1376	done
1377	;;
1378
1379mlcd*)
1380	unit=${i#mlcd}
1381	for pt in 0	# 1 2 3 4 ... 255
1382	do
1383		mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator
1384	done
1385	;;
1386
1387ixpcom*)
1388	unit=${i#ixpcom}
1389	mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp
1390	;;
1391
1392epcom*)
1393	unit=${i#epcom}
1394	mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp
1395	;;
1396
1397ucbsnd)
1398	mkdev ucbsnd c %ucbsnd_chr% 0 666
1399	;;
1400
1401adb)
1402	mkdev adb c %aed_chr% 0 666
1403	;;
1404
1405asc*)
1406	unit=${i#asc}
1407	mkdev asc$unit c %asc_chr% $unit 666
1408	;;
1409
1410bwtwo*)
1411	unit=${i#bwtwo}
1412	mkdev bwtwo$unit c %bwtwo_chr% $unit 666
1413	;;
1414
1415cgtwo*)
1416	unit=${i#cgtwo}
1417	mkdev cgtwo$unit c %cgtwo_chr% $unit 666
1418	;;
1419
1420cgthree*)
1421	unit=${i#cgthree}
1422	mkdev cgthree$unit c %cgthree_chr% $unit 666
1423	;;
1424
1425cgfour*)
1426	unit=${i#cgfour}
1427	mkdev cgfour$unit c %cgfour_chr% $unit 666
1428	;;
1429
1430cgsix*)
1431	unit=${i#cgsix}
1432	mkdev cgsix$unit c %cgsix_chr% $unit 666
1433	;;
1434
1435cgeight*)
1436	unit=${i#cgeight}
1437	mkdev cgeight$unit c %cgeight_chr% $unit 666
1438	;;
1439
1440tcx*)
1441	unit=${i#tcx}
1442	mkdev tcx$unit c %tcx_chr% $unit 666
1443	;;
1444
1445xd*|xy*)
1446	case $i in
1447	xd*)	name=xd; unit=${i#xd}; blk=%xd_blk%;	chr=%xd_chr%;;
1448	xy*)	name=xy; unit=${i#xy}; blk=%xy_blk%;	chr=%xy_chr%;;
1449	esac
1450	%MKDISK% $name $unit $blk $chr
1451	;;
1452
1453magma*)
1454	unit=${i#magma}
1455	if [ 0$unit -gt 3 ]; then
1456		warn "bad unit for $i: $unit"
1457		break
1458	fi
1459	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
1460	do
1461		case $j in
1462		[0-9])	jn=$j ;;
1463		a)	jn=10 ;;
1464		b)	jn=11 ;;
1465		c)	jn=12 ;;
1466		d)	jn=13 ;;
1467		e)	jn=14 ;;
1468		f)	jn=15 ;;
1469		esac
1470		mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn))
1471	done
1472	mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0))
1473	mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1))
1474	;;
1475
1476clcd*)
1477	unit=${i#clcd}
1478	if [ 0$unit -gt 7 ]; then
1479		warn "bad unit for $i: $unit"
1480		break
1481	fi
1482	for j in 0 1 2 3 4 5 6 7
1483	do
1484		mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp
1485		mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp
1486	done
1487	;;
1488
1489spif*)
1490	unit=${i#spif}
1491	if [ 0$unit -gt 3 ]; then
1492		warn "bad unit for $i: $unit"
1493		break
1494	fi
1495	for j in 0 1 2 3 4 5 6 7; do
1496		mkdev ttyS$unit$j c 102 $(($unit * 64 + $j)) "" "" $u_uucp
1497	done
1498	mkdev bppS${unit}0 c 103 $(($unit * 64 + 0))
1499	mkdev bppS${unit}1 c 103 $(($unit * 64 + 1))
1500	;;
1501
1502bpp*)
1503	unit=${i#bpp}
1504	mkdev bpp$unit c %bpp_chr% $(($unit + 0))
1505	;;
1506
1507tctrl*)
1508	unit=${i#tctrl}
1509	mkdev tctrl$unit c %tctrl_chr% $unit 666
1510	;;
1511
1512bmd*)
1513	unit=${i#bmd}
1514	mkdev bmd${unit}a  b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator
1515	mkdev bmd${unit}c  b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator
1516	mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator
1517	mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator
1518	;;
1519
1520sram)
1521	mkdev sram c %sram_chr% 0 644
1522	;;
1523
1524pow*)
1525	unit=${i#pow}
1526	case $unit in
1527	0|1)
1528		mkdev pow${unit} c %pow_chr% ${unit} 644
1529		if [ $unit = 0 ]; then
1530			lndev pow${unit} pow
1531		fi
1532		;;
1533	*)
1534		warn "bad unit for pow in: $i"
1535		;;
1536	esac
1537	;;
1538
1539ttyS*)
1540	unit=${i#ttyS}
1541	mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp
1542	mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp
1543	;;
1544
1545atabus*)
1546	unit=${i#atabus}
1547	mkdev atabus$unit c %atabus_chr% $unit 644
1548	;;
1549
1550drvctl)
1551	mkdev drvctl c %drvctl_chr% 0 644
1552	;;
1553
1554tap*)
1555	unit=${i#tap}
1556	case "$unit" in
1557	[0-9]*)
1558		mkdev tap${unit} c %tap_chr% ${unit} 600
1559		;;
1560	*)
1561		mkdev tap c %tap_chr% 0xfffff 600
1562		;;
1563	esac
1564	;;
1565
1566fw*)
1567	unit=${i#fw}
1568	for j in 0 1 2 3
1569	do
1570		mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator}
1571		mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator}
1572	done
1573	;;
1574
1575midevend)
1576%MI_DEVICES_END%
1577local)
1578	if [ -f "$0.local" ]; then
1579		umask 0
1580		sh $0.local all
1581		umask 077
1582	fi
1583	;;
1584
1585*)
1586	warn "$i: unknown device"
1587	;;
1588
1589esac
1590done
1591
1592}
1593
1594
1595# three variants of disk partitions - max 8, max 16, max 16 with highpartoffset
1596# hack; only the one used by port is retained in final MAKEDEV script
1597# routine is called as:
1598# makedisk name unit blk chr
1599makedisk_p8()
1600{
1601	name="$1"; unit="$2"; blk="$3"; chr="$4"
1602
1603	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
1604	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
1605	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
1606	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
1607	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
1608	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
1609	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
1610	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
1611	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
1612	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
1613	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
1614	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
1615	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
1616	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
1617	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
1618	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
1619}
1620
1621makedisk_p16()
1622{
1623	name="$1"; unit="$2"; blk="$3"; chr="$4"
1624
1625	mkdev ${name}${unit}a	b $blk $(($unit * 16 + 0))	640 $g_operator
1626	mkdev ${name}${unit}b	b $blk $(($unit * 16 + 1))	640 $g_operator
1627	mkdev ${name}${unit}c	b $blk $(($unit * 16 + 2))	640 $g_operator
1628	mkdev ${name}${unit}d	b $blk $(($unit * 16 + 3))	640 $g_operator
1629	mkdev ${name}${unit}e	b $blk $(($unit * 16 + 4))	640 $g_operator
1630	mkdev ${name}${unit}f	b $blk $(($unit * 16 + 5))	640 $g_operator
1631	mkdev ${name}${unit}g	b $blk $(($unit * 16 + 6))	640 $g_operator
1632	mkdev ${name}${unit}h	b $blk $(($unit * 16 + 7))	640 $g_operator
1633	mkdev ${name}${unit}i	b $blk $(($unit * 16 + 8))	640 $g_operator
1634	mkdev ${name}${unit}j	b $blk $(($unit * 16 + 9))	640 $g_operator
1635	mkdev ${name}${unit}k	b $blk $(($unit * 16 + 10))	640 $g_operator
1636	mkdev ${name}${unit}l	b $blk $(($unit * 16 + 11))	640 $g_operator
1637	mkdev ${name}${unit}m	b $blk $(($unit * 16 + 12))	640 $g_operator
1638	mkdev ${name}${unit}n	b $blk $(($unit * 16 + 13))	640 $g_operator
1639	mkdev ${name}${unit}o	b $blk $(($unit * 16 + 14))	640 $g_operator
1640	mkdev ${name}${unit}p	b $blk $(($unit * 16 + 15))	640 $g_operator
1641	mkdev r${name}${unit}a	c $chr $(($unit * 16 + 0))	640 $g_operator
1642	mkdev r${name}${unit}b	c $chr $(($unit * 16 + 1))	640 $g_operator
1643	mkdev r${name}${unit}c	c $chr $(($unit * 16 + 2))	640 $g_operator
1644	mkdev r${name}${unit}d	c $chr $(($unit * 16 + 3))	640 $g_operator
1645	mkdev r${name}${unit}e	c $chr $(($unit * 16 + 4))	640 $g_operator
1646	mkdev r${name}${unit}f	c $chr $(($unit * 16 + 5))	640 $g_operator
1647	mkdev r${name}${unit}g	c $chr $(($unit * 16 + 6))	640 $g_operator
1648	mkdev r${name}${unit}h	c $chr $(($unit * 16 + 7))	640 $g_operator
1649	mkdev r${name}${unit}i	c $chr $(($unit * 16 + 8))	640 $g_operator
1650	mkdev r${name}${unit}j	c $chr $(($unit * 16 + 9))	640 $g_operator
1651	mkdev r${name}${unit}k	c $chr $(($unit * 16 + 10))	640 $g_operator
1652	mkdev r${name}${unit}l	c $chr $(($unit * 16 + 11))	640 $g_operator
1653	mkdev r${name}${unit}m	c $chr $(($unit * 16 + 12))	640 $g_operator
1654	mkdev r${name}${unit}n	c $chr $(($unit * 16 + 13))	640 $g_operator
1655	mkdev r${name}${unit}o	c $chr $(($unit * 16 + 14))	640 $g_operator
1656	mkdev r${name}${unit}p	c $chr $(($unit * 16 + 15))	640 $g_operator
1657}
1658
1659makedisk_p16high()
1660{
1661	ho=524280	# offset for partition 9 to 16
1662	name="$1"; unit="$2"; blk="$3"; chr="$4"
1663
1664	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
1665	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
1666	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
1667	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
1668	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
1669	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
1670	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
1671	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
1672	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8))	640 $g_operator
1673	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9))	640 $g_operator
1674	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
1675	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
1676	mkdev ${name}${unit}m	b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator
1677	mkdev ${name}${unit}n	b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator
1678	mkdev ${name}${unit}o	b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator
1679	mkdev ${name}${unit}p	b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator
1680	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
1681	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
1682	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
1683	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
1684	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
1685	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
1686	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
1687	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
1688	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8))	640 $g_operator
1689	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9))	640 $g_operator
1690	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
1691	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
1692	mkdev r${name}${unit}m	c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator
1693	mkdev r${name}${unit}n	c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator
1694	mkdev r${name}${unit}o	c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator
1695	mkdev r${name}${unit}p	c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator
1696}
1697
1698# make only the very few basic disk device nodes - 'a' partition
1699# and raw partition
1700makedisk_minimal()
1701{
1702	name=$1; unit=$2; blk=$3; chr=$4
1703	doff=%DISKMINOROFFSET%
1704	ro=%RAWDISK_OFF%
1705	rn=%RAWDISK_NAME%
1706
1707	mkdev ${name}${unit}a	b $blk $(($unit * $doff + 0))	640 $g_operator
1708	mkdev ${name}${unit}$rn	b $blk $(($unit * $doff + $ro))	640 $g_operator
1709	mkdev r${name}${unit}a	c $chr $(($unit * $doff + 0))	640 $g_operator
1710	mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator
1711}
1712
1713makedev $*
1714