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# $FreeBSD$
28#
29# Convenience function for commonly used Flash devices.
30#
31# There is a hook over in nanobsd.sh which allows you to call into
32# this function simply with a line like:
33#
34#	FlashDevice Sandisk 256
35#
36# This file will then set NANO_MEDIASIZE, NANO_HEADS and NANO_SECTS for you.
37#
38
39sub_FlashDevice () {
40
41	a1=`echo $1 | tr '[:upper:]' '[:lower:]'`
42	a2=`echo $2 | tr '[:upper:]' '[:lower:]'`
43	case $a1 in
44	hitachi)
45		case $a2 in
46		256|256mb)
47			NANO_MEDIASIZE=`expr 256204800 / 512`
48			NANO_HEADS=15
49			NANO_SECTS=48
50			;;
51		*)
52			echo "Unknown Hitachi Flash capacity"
53			exit 2
54			;;
55		esac
56		;;
57	integral)
58		# Source: mich@FreeBSD.org
59		case $a2 in
60		256|256mb)
61			NANO_MEDIASIZE=`expr 259596288 / 512`
62			NANO_HEADS=16
63			NANO_SECTS=63
64			;;
65		*)
66			echo "Unknown Integral i-Pro Flash capacity"
67			exit 2
68			;;
69		esac
70		;;
71	kodak)
72		# Source: mwlucas@FreeBSD.org
73		case $a2 in
74		64|64mb)
75			NANO_MEDIASIZE=`expr 64487424 / 512`
76			NANO_HEADS=4
77			NANO_SECTS=32
78			;;
79		*)
80			echo "Unknown Kodak Flash capacity"
81			exit 2
82			;;
83		esac
84		;;
85	memorycorp)
86		# Source: simon@FreeBSD.org
87		case $a2 in
88		512|512mb)
89			# MC512CFLS2
90			NANO_MEDIASIZE=`expr 519192576 / 512`
91			NANO_HEADS=16
92			NANO_SECTS=63
93			;;
94		*)
95			echo "Unknown Memory Corp Flash capacity"
96			exit 2
97			;;
98		esac
99		;;
100	sandisk)
101		# Source:
102		#	SanDisk CompactFlash Memory Card
103		#	Product Manual
104		#	Version 10.9
105		#	Document No. 20-10-00038
106		#	April 2005
107		# Table 2-7 
108		# NB: notice math error in SDCFJ-4096-388 line.
109		#
110		case $a2 in
111		32|32mb)
112			NANO_MEDIASIZE=`expr 32112640 / 512`
113			NANO_HEADS=4
114			NANO_SECTS=32
115			;;
116		64|64mb)
117			NANO_MEDIASIZE=`expr 64225280 / 512`
118			NANO_HEADS=8
119			NANO_SECTS=32
120			;;
121		128|128mb)
122			NANO_MEDIASIZE=`expr 128450560 / 512`
123			NANO_HEADS=8
124			NANO_SECTS=32
125			;;
126		256|256mb)
127			NANO_MEDIASIZE=`expr 256901120 / 512`
128			NANO_HEADS=16
129			NANO_SECTS=32
130			;;
131		512|512mb)
132			NANO_MEDIASIZE=`expr 512483328 / 512`
133			NANO_HEADS=16
134			NANO_SECTS=63
135			;;
136		1024|1024mb|1g)
137			NANO_MEDIASIZE=`expr 1024966656 / 512`
138			NANO_HEADS=16
139			NANO_SECTS=63
140			;;
141		2048|2048mb|2g)
142			NANO_MEDIASIZE=`expr 2048901120 / 512`
143			NANO_HEADS=16
144			NANO_SECTS=63
145			;;
146		4096|4096mb|4g)
147			NANO_MEDIASIZE=`expr -e 4097802240 / 512`
148			NANO_HEADS=16
149			NANO_SECTS=63
150			;;
151		*)
152			echo "Unknown Sandisk Flash capacity"
153			exit 2
154			;;
155		esac
156		;;
157	siliconsystems)
158		case $a2 in
159 		256|256mb)
160 			NANO_MEDIASIZE=`expr 260571136 / 512`
161 			NANO_HEADS=16
162 			NANO_SECTS=32
163 			;;
164		4096|4g)
165			NANO_MEDIASIZE=`expr -e 4224761856 / 512`
166			NANO_HEADS=16
167			NANO_SECTS=63
168			;;
169		*)
170			echo "Unknown SiliconSystems Flash capacity"
171			exit 2
172			;;
173		esac
174		;;
175	soekris)
176		case $a2 in
177		net4526 | 4526 | net4826 | 4826 | 64 | 64mb)
178			NANO_MEDIASIZE=125056
179			NANO_HEADS=4
180			NANO_SECTS=32
181			;;
182		*)
183			echo "Unknown Soekris Flash capacity"
184			exit 2
185			;;
186		esac
187		;;
188	transcend)
189		case $a2 in
190		dom064m)
191			NANO_MEDIASIZE=125184
192			NANO_HEADS=4
193			NANO_SECTS=32
194			;;
195		2048|2g)
196			NANO_MEDIASIZE=4061232
197			NANO_HEADS=16
198			NANO_SECTS=32
199			;;
200		*)
201			echo "Unknown Transcend Flash capacity"
202			exit 2
203			;;
204		esac
205		;;
206	# Generic flash media.  It assumes that we're booting using packet
207	# mode so the HEADS and SECTS don't matter.  The truncation of the
208	# size to a slightly lower number is intentional to be conservative
209	# (eg, 1 sector smaller than N GB is always smaller than any flash
210	# claiming to be N GB, but wastes a little space sometimes when 1GB
211	# really means 1GiB).  This is intended to be used when producing
212	# generic images for anybody to boot.  Media sizes are specified 'Xg'
213	# for X GB (10^9 bytes) flash or Xm for X MB (10^6 bytes) flash.
214	# Power of 2 variants can be specified with gi or mi for GiB and MiB
215	# sizeed flash and don't try to be conservative (use with caution).
216	generic)
217		case $a2 in
218		*.*)	# Catch unsupported 1.5g case, since expr can't
219			# cope with floats.
220			echo "Unsupported generic size $a2"
221			exit 2
222			;;
223		*m)
224			NANO_HEADS=16
225			NANO_SECTS=63
226			NANO_MEDIASIZE=`expr -e ${a2%m} \* 1000000 / 512`
227			;;
228		*g)
229			NANO_HEADS=16
230			NANO_SECTS=63
231			NANO_MEDIASIZE=`expr -e ${a2%g} \* 1000000000 / 512`
232			;;
233		*mi)
234			NANO_HEADS=16
235			NANO_SECTS=63
236			NANO_MEDIASIZE=`expr -e ${a2%mi} \* 1024 \* 1024 / 512`
237			;;
238		*gi)
239			NANO_HEADS=16
240			NANO_SECTS=63
241			NANO_MEDIASIZE=`expr -e ${a2%gi} \* 1024 \* 1024 \* 1024 / 512`
242			;;
243		*)
244			echo "Unsupported generic size $a2"
245			exit 2
246			;;
247		esac
248		;;
249	*)
250		echo "Unknown Flash manufacturer"
251		exit 2
252		;;
253	esac
254}
255