xref: /freebsd/tools/tools/nanobsd/FlashDevice.sub (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
1#!/bin/sh
2#
3# Copyright (c) 2005 Poul-Henning Kamp.
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26#
27#
28# Convenience function for commonly used Flash devices.
29#
30# There is a hook over in nanobsd.sh which allows you to call into
31# this function simply with a line like:
32#
33#	FlashDevice Sandisk 256
34#
35# This file will then set NANO_MEDIASIZE, NANO_HEADS and NANO_SECTS for you.
36#
37
38sub_FlashDevice () {
39
40	a1=`echo $1 | tr '[:upper:]' '[:lower:]'`
41	a2=`echo $2 | tr '[:upper:]' '[:lower:]'`
42	case $a1 in
43	hitachi)
44		case $a2 in
45		256|256mb)
46			NANO_MEDIASIZE=`expr 256204800 / 512`
47			NANO_HEADS=15
48			NANO_SECTS=48
49			;;
50		*)
51			echo "Unknown Hitachi Flash capacity"
52			exit 2
53			;;
54		esac
55		;;
56	integral)
57		# Source: mich@FreeBSD.org
58		case $a2 in
59		256|256mb)
60			NANO_MEDIASIZE=`expr 259596288 / 512`
61			NANO_HEADS=16
62			NANO_SECTS=63
63			;;
64		*)
65			echo "Unknown Integral i-Pro Flash capacity"
66			exit 2
67			;;
68		esac
69		;;
70	kodak)
71		# Source: mwlucas@FreeBSD.org
72		case $a2 in
73		64|64mb)
74			NANO_MEDIASIZE=`expr 64487424 / 512`
75			NANO_HEADS=4
76			NANO_SECTS=32
77			;;
78		*)
79			echo "Unknown Kodak Flash capacity"
80			exit 2
81			;;
82		esac
83		;;
84	memorycorp)
85		# Source: simon@FreeBSD.org
86		case $a2 in
87		512|512mb)
88			# MC512CFLS2
89			NANO_MEDIASIZE=`expr 519192576 / 512`
90			NANO_HEADS=16
91			NANO_SECTS=63
92			;;
93		*)
94			echo "Unknown Memory Corp Flash capacity"
95			exit 2
96			;;
97		esac
98		;;
99	sandisk)
100		# Source:
101		#	SanDisk CompactFlash Memory Card
102		#	Product Manual
103		#	Version 10.9
104		#	Document No. 20-10-00038
105		#	April 2005
106		# Table 2-7
107		# NB: notice math error in SDCFJ-4096-388 line.
108		#
109		case $a2 in
110		32|32mb)
111			NANO_MEDIASIZE=`expr 32112640 / 512`
112			NANO_HEADS=4
113			NANO_SECTS=32
114			;;
115		64|64mb)
116			NANO_MEDIASIZE=`expr 64225280 / 512`
117			NANO_HEADS=8
118			NANO_SECTS=32
119			;;
120		128|128mb)
121			NANO_MEDIASIZE=`expr 128450560 / 512`
122			NANO_HEADS=8
123			NANO_SECTS=32
124			;;
125		256|256mb)
126			NANO_MEDIASIZE=`expr 256901120 / 512`
127			NANO_HEADS=16
128			NANO_SECTS=32
129			;;
130		512|512mb)
131			NANO_MEDIASIZE=`expr 512483328 / 512`
132			NANO_HEADS=16
133			NANO_SECTS=63
134			;;
135		1024|1024mb|1g)
136			NANO_MEDIASIZE=`expr 1024966656 / 512`
137			NANO_HEADS=16
138			NANO_SECTS=63
139			;;
140		2048|2048mb|2g)
141			NANO_MEDIASIZE=`expr 2048901120 / 512`
142			NANO_HEADS=16
143			NANO_SECTS=63
144			;;
145		4096|4096mb|4g)
146			NANO_MEDIASIZE=`expr -e 4097802240 / 512`
147			NANO_HEADS=16
148			NANO_SECTS=63
149			;;
150		*)
151			echo "Unknown Sandisk Flash capacity"
152			exit 2
153			;;
154		esac
155		;;
156	siliconsystems)
157		case $a2 in
158 		256|256mb)
159 			NANO_MEDIASIZE=`expr 260571136 / 512`
160 			NANO_HEADS=16
161 			NANO_SECTS=32
162 			;;
163		4096|4g)
164			NANO_MEDIASIZE=`expr -e 4224761856 / 512`
165			NANO_HEADS=16
166			NANO_SECTS=63
167			;;
168		*)
169			echo "Unknown SiliconSystems Flash capacity"
170			exit 2
171			;;
172		esac
173		;;
174	soekris)
175		case $a2 in
176		net4526 | 4526 | net4826 | 4826 | 64 | 64mb)
177			NANO_MEDIASIZE=125056
178			NANO_HEADS=4
179			NANO_SECTS=32
180			;;
181		*)
182			echo "Unknown Soekris Flash capacity"
183			exit 2
184			;;
185		esac
186		;;
187	transcend)
188		case $a2 in
189		dom064m)
190			NANO_MEDIASIZE=125184
191			NANO_HEADS=4
192			NANO_SECTS=32
193			;;
194		2048|2g)
195			NANO_MEDIASIZE=4061232
196			NANO_HEADS=16
197			NANO_SECTS=32
198			;;
199		*)
200			echo "Unknown Transcend Flash capacity"
201			exit 2
202			;;
203		esac
204		;;
205	# Generic flash media.  It assumes that we're booting using packet
206	# mode so the HEADS and SECTS don't matter.  The truncation of the
207	# size to a slightly lower number is intentional to be conservative
208	# (eg, 1 sector smaller than N GB is always smaller than any flash
209	# claiming to be N GB, but wastes a little space sometimes when 1GB
210	# really means 1GiB).  This is intended to be used when producing
211	# generic images for anybody to boot.  Media sizes are specified 'Xg'
212	# for X GB (10^9 bytes) flash or Xm for X MB (10^6 bytes) flash.
213	# Power of 2 variants can be specified with gi or mi for GiB and MiB
214	# sizeed flash and don't try to be conservative (use with caution).
215	generic)
216		case $a2 in
217		*.*)	# Catch unsupported 1.5g case, since expr can't
218			# cope with floats.
219			echo "Unsupported generic size $a2"
220			exit 2
221			;;
222		*m)
223			NANO_HEADS=16
224			NANO_SECTS=63
225			NANO_MEDIASIZE=`expr -e ${a2%m} \* 1000000 / 512`
226			;;
227		*g)
228			NANO_HEADS=16
229			NANO_SECTS=63
230			NANO_MEDIASIZE=`expr -e ${a2%g} \* 1000000000 / 512`
231			;;
232		*mi)
233			NANO_HEADS=16
234			NANO_SECTS=63
235			NANO_MEDIASIZE=`expr -e ${a2%mi} \* 1024 \* 1024 / 512`
236			;;
237		*gi)
238			NANO_HEADS=16
239			NANO_SECTS=63
240			NANO_MEDIASIZE=`expr -e ${a2%gi} \* 1024 \* 1024 \* 1024 / 512`
241			;;
242		*)
243			echo "Unsupported generic size $a2"
244			exit 2
245			;;
246		esac
247		;;
248	*)
249		echo "Unknown Flash manufacturer"
250		exit 2
251		;;
252	esac
253}
254