Initial revision
diff --git a/tools/bddb/README b/tools/bddb/README
new file mode 100644
index 0000000..778e41c
--- /dev/null
+++ b/tools/bddb/README
@@ -0,0 +1,116 @@
+Hymod Board Database
+
+(C) Copyright 2001
+Murray Jensen <Murray.Jensen@cmst.csiro.au>
+CSIRO Manufacturing Science and Technology, Preston Lab
+
+25-Jun-01
+
+This stuff is a set of PHP/MySQL scripts to implement a custom board
+database. It will need *extensive* hacking to modify it to keep the
+information about your custom boards that you want, however it is a good
+starting point.
+
+How it is used:
+
+	1. a board has gone through all the hardware testing etc and is
+	   ready to have the flash programmed for the first time - first you
+	   go to a web page and fill in information about the board in a form
+	   to register it in a database
+
+	2. the web stuff allocates a (unique) serial number and (optionally)
+	   a (locally administered) ethernet address and stores the information
+	   in a database using the serial number as the key (can do whole
+	   batches of boards in one go and/or use a previously registered board
+	   as defaults for the new board(s))
+
+	3. it then creates a file in the tftp area of a server somewhere
+	   containing the board information in a simple text format (one
+	   per serial number)
+
+	4. all hymod boards have an i2c eeprom, and when U-Boot sees that
+	   the eeprom is unitialised, it prompts for a serial number and
+	   ethernet address (if not set), then transfers the file created
+	   in step 3 from the server and initialises the eeprom from its
+	   contents
+
+What this means is you can't boot the board until you have allocated a serial
+number, but you don't have to type it all twice - you do it once on the web
+and the board then finds the info it needs to initialise its eeprom. The
+other side of the coin is the reading of the eeprom and how it gets passed
+to Linux (or another O/S).
+
+To see how this is all done for the hymod boards look at the code in the
+"board/hymod" directory and in the file "include/asm/hymod.h". Hymod boards
+can have a mezzanine card which also have an eeprom that needs allocating,
+the same process is used for these as well - just a different i2c address.
+
+Other forms provide the following functions:
+
+	- browsing the board database
+	- editing board information (one at a time)
+	- maintaining/browsing a (simple) per board event log
+
+You will need: MySQL (I use version 3.23.7-alpha), PHP4 (with MySQL
+support enabled) and a web server (I use Apache 1.3.x).
+
+I originally started by using phpMyBuilder (http://kyber.dk/phpMyBuilder)
+but it soon got far more complicated than that could handle (but I left
+the copyright messages in there anyway). Most of the code resides in the
+common defs.php file, which shouldn't need much alteration - all the work
+will be in shaping the front-end php files to your liking.
+
+Here's a quick summary of what needs doing to use it for your boards:
+
+1. get phpMyAdmin (http://phpwizard.net/projects/phpMyAdmin/) - it's an
+   invaluable tool for this sort of stuff (this step is optional of course)
+
+2. edit "bddb.css" to your taste, if you could be bothered - I have no
+   idea what is in there or what it does - I copied it from somewhere else
+   ("user.css" from the phpMyEdit (http://phpmyedit.sourcerforge.net) package,
+   I think) - I figure one day I'll see what sort of things I can change
+   in there.
+
+3. create a mysql database - call it whatever you like
+
+4. edit "create_tables.sql" and modify the "boards" table schema to
+   reflect the information you want to keep about your boards. It may or
+   may not be easier to do this and the next step in phpMyAdmin. Check out
+   the MySQL documentation at http://www.mysql.com/doc/ in particular the
+   column types at http://www.mysql.com/doc/C/o/Column_types.html - Note
+   there is only support for a few data types:
+
+	int		- presented as an html text input
+	char/text	- presented as an html text input
+	date		- presented as an html text input
+	enum		- presented as an html radio input
+
+   I also have what I call "enum_multi" which is a set of enums with the
+   same name, but suffixed with a number e.g. fred0, fred1, fred2. These
+   are presented as a number of html select's with a single label "fred"
+   this is useful for board characteristics that have multiple items of
+   the same type e.g. multiple banks of sdram.
+
+5. use the "create_tables.sql" file to create the "boards" table in the
+   database e.g. mysql dbname < create_tables.sql
+
+6. create a user and password for the web server to log into the MySQL
+   database with; give this user select, insert and update privileges
+   to the database created in 3 (and delete, if you want the "delete"
+   functions in the edit forms to work- I have this turned off). phpMyAdmin
+   helps in this step.
+
+7. edit "config.php" and set the variables: $mysql_user, $mysql_pw, $mysql_db,
+   $bddb_cfgdir and $bddb_label - keep the contents of this file secret - it
+   contains the web servers username and password (the three $mysql_* vars
+   are set from the previous step)
+
+8. edit "defs.php" and a. adjust the various enum value arrays and b. edit
+   the function "pg_foot()" to remove my email address :-)
+
+9. do major hacking on the following files: browse.php, doedit.php, donew.php,
+   edit.php and new.php to reflect your database schema - fortunately the
+   hacking is fairly straight-forward, but it is boring and time-consuming.
+
+These notes were written rather hastily - if you find any obvious problems
+please let me know.
diff --git a/tools/bddb/brlog.php b/tools/bddb/brlog.php
new file mode 100644
index 0000000..6e98c9c
--- /dev/null
+++ b/tools/bddb/brlog.php
@@ -0,0 +1,106 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// list page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - Browse Board Log");
+
+	if (!isset($serno) || $serno == 0)
+		die("serial number not specified!");
+
+	function print_cell($str) {
+		if ($str == '')
+			$str = '&nbsp;';
+		echo "\t<td>$str</td>\n";
+	}
+?>
+<table align=center border=1 cellpadding=10>
+<tr>
+<th>serno / edit</th>
+<th>ethaddr</th>
+<th>date</th>
+<th>batch</th>
+<th>type</th>
+<th>rev</th>
+<th>location</th>
+</tr>
+<?php
+	$r=mysql_query("select * from boards where serno=$serno");
+
+	while($row=mysql_fetch_array($r)){
+		foreach ($columns as $key) {
+			if (!key_in_array($key, $row))
+				$row[$key] = '';
+		}
+
+		echo "<tr>\n";
+		print_cell("<a href=\"edit.php?serno=$row[serno]\">$row[serno]</a>");
+		print_cell($row['ethaddr']);
+		print_cell($row['date']);
+		print_cell($row['batch']);
+		print_cell($row['type']);
+		print_cell($row['rev']);
+		print_cell($row['location']);
+		echo "</tr>\n";
+	}
+
+	mysql_free_result($r);
+?>
+</table>
+<hr></hr>
+<p></p>
+<?php
+	$limit=abs(isset($limit)?$limit:20);
+	$offset=abs(isset($offset)?$offset:0);
+	$lr=mysql_query("select count(*) as n from log where serno=$serno");
+	$lrow=mysql_fetch_array($lr);
+	if($lrow['n']>$limit){
+		$preoffset=max(0,$offset-$limit);
+		$postoffset=$offset+$limit;
+		echo "<table width=\"100%\">\n<tr align=center>\n";
+		printf("<td><%sa href=\"%s?serno=$serno&offset=%d\"><img border=0 alt=\"&lt;\" src=\"/icons/left.gif\"></a></td>\n", $offset>0?"":"no", $PHP_SELF, $preoffset);
+		printf("<td><%sa href=\"%s?serno=$serno&offset=%d\"><img border=0 alt=\"&gt;\" src=\"/icons/right.gif\"></a></td>\n", $postoffset<$lrow['n']?"":"no", $PHP_SELF, $postoffset);
+		echo "</tr>\n</table>\n";
+	}
+	mysql_free_result($lr);
+?>
+<table width="100%" border=1 cellpadding=10>
+<tr valign=top>
+<th>logno / edit</th>
+<th>date</th>
+<th width="70%">details</th>
+</tr>
+<?php
+	$r=mysql_query("select * from log where serno=$serno order by logno limit $offset,$limit");
+
+	while($row=mysql_fetch_array($r)){
+		echo "<tr>\n";
+		print_cell("<a href=\"edlog.php?serno=$row[serno]&logno=$row[logno]\">$row[logno]</a>");
+		print_cell($row['date']);
+		print_cell("<pre>" . urldecode($row['details']) . "</pre>");
+		echo "</tr>\n";
+	}
+
+	mysql_free_result($r);
+?>
+</table>
+<hr></hr>
+<p></p>
+<table width="100%">
+<tr>
+  <td align=center>
+    <a href="newlog.php?serno=<?php echo "$serno"; ?>">Add to Log</a>
+  </td>
+  <td align=center>
+    <a href="index.php">Back to Start</a>
+  </td>
+</tr>
+</table>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/browse.php b/tools/bddb/browse.php
new file mode 100644
index 0000000..b7cd508
--- /dev/null
+++ b/tools/bddb/browse.php
@@ -0,0 +1,130 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// list page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	if (!isset($verbose))
+		$verbose = 0;
+
+	if (!isset($serno))
+		$serno = 0;
+
+	pg_head("$bddb_label - Browse database" . ($verbose?" (verbose)":""));
+?>
+<p></p>
+<?php
+	if ($serno == 0) {
+		$limit=abs(isset($limit)?$limit:20);
+		$offset=abs(isset($offset)?$offset:0);
+		$lr=mysql_query("select count(*) as n from boards");
+		$lrow=mysql_fetch_array($lr);
+		if($lrow['n']>$limit){
+			$preoffset=max(0,$offset-$limit);
+			$postoffset=$offset+$limit;
+			echo "<table width=\"100%\">\n<tr align=center>\n";
+			printf("<td><%sa href=\"%s?offset=%d\"><img border=0 alt=\"&lt;\" src=\"/icons/left.gif\"></a></td>\n", $offset>0?"":"no", $PHP_SELF, $preoffset);
+			printf("<td><%sa href=\"%s?offset=%d\"><img border=0 alt=\"&gt;\" src=\"/icons/right.gif\"></a></td>\n", $postoffset<$lrow['n']?"":"no", $PHP_SELF, $postoffset);
+			echo "</tr>\n</table>\n";
+		}
+		mysql_free_result($lr);
+	}
+?>
+<table align=center border=1 cellpadding=10>
+<tr>
+<th></th>
+<th>serno / edit</th>
+<th>ethaddr</th>
+<th>date</th>
+<th>batch</th>
+<th>type</th>
+<th>rev</th>
+<th>location</th>
+<?php
+	if ($verbose) {
+		echo "<th>comments</th>\n";
+		echo "<th>sdram</th>\n";
+		echo "<th>flash</th>\n";
+		echo "<th>zbt</th>\n";
+		echo "<th>xlxtyp</th>\n";
+		echo "<th>xlxspd</th>\n";
+		echo "<th>xlxtmp</th>\n";
+		echo "<th>xlxgrd</th>\n";
+		echo "<th>cputyp</th>\n";
+		echo "<th>cpuspd</th>\n";
+		echo "<th>cpmspd</th>\n";
+		echo "<th>busspd</th>\n";
+		echo "<th>hstype</th>\n";
+		echo "<th>hschin</th>\n";
+		echo "<th>hschout</th>\n";
+	}
+?>
+</tr>
+<?php
+	if ($serno == 0)
+		$r=mysql_query("select * from boards order by serno limit $offset,$limit");
+	else
+		$r=mysql_query("select * from boards where serno=$serno");
+
+	function print_cell($str) {
+		if ($str == '')
+			$str = '&nbsp;';
+		echo "\t<td>$str</td>\n";
+	}
+
+	while($row=mysql_fetch_array($r)){
+		foreach ($columns as $key) {
+			if (!key_in_array($key, $row))
+				$row[$key] = '';
+		}
+
+		echo "<tr>\n";
+		print_cell("<a href=\"brlog.php?serno=$row[serno]\">Log</a>");
+		print_cell("<a href=\"edit.php?serno=$row[serno]\">$row[serno]</a>");
+		print_cell($row['ethaddr']);
+		print_cell($row['date']);
+		print_cell($row['batch']);
+		print_cell($row['type']);
+		print_cell($row['rev']);
+		print_cell($row['location']);
+		if ($verbose) {
+			print_cell("<pre>\n" . urldecode($row['comments']) .
+				"\n\t</pre>");
+			print_cell(gather_enum_multi_print("sdram", 4, $row));
+			print_cell(gather_enum_multi_print("flash", 4, $row));
+			print_cell(gather_enum_multi_print("zbt", 16, $row));
+			print_cell(gather_enum_multi_print("xlxtyp", 4, $row));
+			print_cell(gather_enum_multi_print("xlxspd", 4, $row));
+			print_cell(gather_enum_multi_print("xlxtmp", 4, $row));
+			print_cell(gather_enum_multi_print("xlxgrd", 4, $row));
+			print_cell($row['cputyp']);
+			print_cell($row['cpuspd']);
+			print_cell($row['cpmspd']);
+			print_cell($row['busspd']);
+			print_cell($row['hstype']);
+			print_cell($row['hschin']);
+			print_cell($row['hschout']);
+		}
+		echo "</tr>\n";
+	}
+?>
+</table>
+<p></p>
+<table width="100%">
+<tr>
+  <td align=center><?php
+	if ($verbose)
+		echo "<a href=\"browse.php?verbose=0\">Terse Listing</a>";
+	else
+		echo "<a href=\"browse.php?verbose=1\">Verbose Listing</a>";
+  ?></td>
+  <td align=center><a href="index.php">Back to Start</a></td>
+</tr>
+</table>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/config.php b/tools/bddb/config.php
new file mode 100644
index 0000000..8d54993
--- /dev/null
+++ b/tools/bddb/config.php
@@ -0,0 +1,16 @@
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// mysql database access info
+	$mysql_user="fred";
+	$mysql_pw="apassword";
+	$mysql_db="mydbname";
+
+	// where to put the eeprom config files
+	$bddb_cfgdir = '/tftpboot/bddb';
+
+	// what this database is called
+	$bddb_label = 'Hymod Board Database';
+?>
diff --git a/tools/bddb/create_tables.sql b/tools/bddb/create_tables.sql
new file mode 100644
index 0000000..aa007c1
--- /dev/null
+++ b/tools/bddb/create_tables.sql
@@ -0,0 +1,90 @@
+# phpMyAdmin MySQL-Dump
+# http://phpwizard.net/phpMyAdmin/
+#
+# Host: localhost Database : hymod_bddb
+
+# (C) Copyright 2001
+# Murray Jensen <Murray.Jensen@cmst.csiro.au>
+# CSIRO Manufacturing Science and Technology, Preston Lab
+
+# --------------------------------------------------------
+#
+# Table structure for table 'boards'
+#
+
+DROP TABLE IF EXISTS boards;
+CREATE TABLE boards (
+   serno int(10) unsigned zerofill NOT NULL auto_increment,
+   ethaddr char(17),
+   date date NOT NULL,
+   batch char(32),
+   type enum('IO','CLP','DSP','INPUT','ALT-INPUT','DISPLAY') NOT NULL,
+   rev tinyint(3) unsigned zerofill NOT NULL,
+   location char(64),
+   comments text,
+   sdram0 enum('32M','64M','128M','256M'),
+   sdram1 enum('32M','64M','128M','256M'),
+   sdram2 enum('32M','64M','128M','256M'),
+   sdram3 enum('32M','64M','128M','256M'),
+   flash0 enum('4M','8M','16M','32M','64M'),
+   flash1 enum('4M','8M','16M','32M','64M'),
+   flash2 enum('4M','8M','16M','32M','64M'),
+   flash3 enum('4M','8M','16M','32M','64M'),
+   zbt0 enum('512K','1M','2M','4M'),
+   zbt1 enum('512K','1M','2M','4M'),
+   zbt2 enum('512K','1M','2M','4M'),
+   zbt3 enum('512K','1M','2M','4M'),
+   zbt4 enum('512K','1M','2M','4M'),
+   zbt5 enum('512K','1M','2M','4M'),
+   zbt6 enum('512K','1M','2M','4M'),
+   zbt7 enum('512K','1M','2M','4M'),
+   zbt8 enum('512K','1M','2M','4M'),
+   zbt9 enum('512K','1M','2M','4M'),
+   zbta enum('512K','1M','2M','4M'),
+   zbtb enum('512K','1M','2M','4M'),
+   zbtc enum('512K','1M','2M','4M'),
+   zbtd enum('512K','1M','2M','4M'),
+   zbte enum('512K','1M','2M','4M'),
+   zbtf enum('512K','1M','2M','4M'),
+   xlxtyp0 enum('XCV300E','XCV400E','XCV600E'),
+   xlxtyp1 enum('XCV300E','XCV400E','XCV600E'),
+   xlxtyp2 enum('XCV300E','XCV400E','XCV600E'),
+   xlxtyp3 enum('XCV300E','XCV400E','XCV600E'),
+   xlxspd0 enum('6','7','8'),
+   xlxspd1 enum('6','7','8'),
+   xlxspd2 enum('6','7','8'),
+   xlxspd3 enum('6','7','8'),
+   xlxtmp0 enum('COM','IND'),
+   xlxtmp1 enum('COM','IND'),
+   xlxtmp2 enum('COM','IND'),
+   xlxtmp3 enum('COM','IND'),
+   xlxgrd0 enum('NORMAL','ENGSAMP'),
+   xlxgrd1 enum('NORMAL','ENGSAMP'),
+   xlxgrd2 enum('NORMAL','ENGSAMP'),
+   xlxgrd3 enum('NORMAL','ENGSAMP'),
+   cputyp enum('MPC8260'),
+   cpuspd enum('33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ'),
+   cpmspd enum('33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ'),
+   busspd enum('33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ'),
+   hstype enum('AMCC-S2064A'),
+   hschin enum('0','1','2','3','4'),
+   hschout enum('0','1','2','3','4'),
+   PRIMARY KEY (serno),
+   KEY serno (serno),
+   UNIQUE serno_2 (serno)
+);
+
+#
+# Table structure for table 'log'
+#
+
+DROP TABLE IF EXISTS log;
+CREATE TABLE log (
+   logno int(10) unsigned zerofill NOT NULL auto_increment,
+   serno int(10) unsigned zerofill NOT NULL,
+   date date NOT NULL,
+   details text NOT NULL,
+   PRIMARY KEY (logno),
+   KEY logno (logno, serno, date),
+   UNIQUE logno_2 (logno)
+);
diff --git a/tools/bddb/defs.php b/tools/bddb/defs.php
new file mode 100644
index 0000000..0393dbd
--- /dev/null
+++ b/tools/bddb/defs.php
@@ -0,0 +1,663 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// contains mysql user id and password - keep secret
+	require("config.php");
+
+	if (isset($logout)) {
+		Header("status: 401 Unauthorized");
+		Header("HTTP/1.0 401 Unauthorized");
+		Header("WWW-authenticate: basic realm=\"$bddb_label\"");
+
+		echo "<html><head><title>" .
+			"Access to '$bddb_label' Denied" .
+			"</title></head>\n";
+		echo "<body bgcolor=#ffffff><br></br><br></br><center><h1>" .
+			"You must be an Authorised User " .
+			"to access the '$bddb_label'" .
+			"</h1>\n</center></body></html>\n";
+		exit;
+	}
+
+	// contents of the various enumerated types - if first item is
+	// empty ('') then the enum is allowed to be null (ie "not null"
+	// is not set on the column)
+
+	// all column names in the database table
+	$columns = array(
+		'serno','ethaddr','date','batch',
+		'type','rev','location','comments',
+		'sdram0','sdram1','sdram2','sdram3',
+		'flash0','flash1','flash2','flash3',
+		'zbt0','zbt1','zbt2','zbt3','zbt4','zbt5','zbt6','zbt7',
+		'zbt8','zbt9','zbta','zbtb','zbtc','zbtd','zbte','zbtf',
+		'xlxtyp0','xlxtyp1','xlxtyp2','xlxtyp3',
+		'xlxspd0','xlxspd1','xlxspd2','xlxspd3',
+		'xlxtmp0','xlxtmp1','xlxtmp2','xlxtmp3',
+		'xlxgrd0','xlxgrd1','xlxgrd2','xlxgrd3',
+		'cputyp','cpuspd','cpmspd','busspd',
+		'hstype','hschin','hschout'
+	);
+
+	// board type
+	$type_vals = array('IO','CLP','DSP','INPUT','ALT-INPUT','DISPLAY');
+
+	// sdram sizes (nbits array is for write into eeprom config file)
+	$sdram_vals = array('','32M','64M','128M','256M');
+	$sdram_nbits = array(0,25,26,27,28);
+
+	// flash sizes (nbits array is for write into eeprom config file)
+	$flash_vals = array('','4M','8M','16M','32M','64M');
+	$flash_nbits = array(0,22,23,24,25,26);
+
+	// zbt ram sizes (nbits array is for write into eeprom config file)
+	$zbt_vals = array('','512K','1M','2M','4M');
+	$zbt_nbits = array(0,19,20,21,22);
+
+	// Xilinx attributes
+	$xlxtyp_vals = array('','XCV300E','XCV400E','XCV600E');
+	$xlxspd_vals = array('','6','7','8');
+	$xlxtmp_vals = array('','COM','IND');
+	$xlxgrd_vals = array('','NORMAL','ENGSAMP');
+
+	// processor attributes
+	$cputyp_vals = array('','MPC8260');
+	$clk_vals = array('','33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ');
+
+	// high-speed serial attributes
+	$hstype_vals = array('','AMCC-S2064A');
+	$hschin_vals = array('0','1','2','3','4');
+	$hschout_vals = array('0','1','2','3','4');
+
+	// value filters - used when outputting html
+	function rev_filter($num) {
+		if ($num == 0)
+			return "001";
+		else
+			return sprintf("%03d", $num);
+	}
+
+	function text_filter($str) {
+		return urldecode($str);
+	}
+
+	mt_srand(time() | getmypid());
+
+	// set up MySQL connection
+	mysql_connect("", $mysql_user, $mysql_pw) || die("cannot connect");
+	mysql_select_db($mysql_db) || die("cannot select db");
+
+	// page header
+	function pg_head($title)
+	{
+		echo "<html>\n<head>\n";
+		echo "<link rel=stylesheet href=\"bddb.css\" type=\"text/css\" title=\"style sheet\"></link>\n";
+		echo "<title>$title</title>\n";
+		echo "</head>\n";
+		echo "<body>\n";
+		echo "<center><h1>$title</h1></center>\n";
+		echo "<hr></hr>\n";
+	}
+
+	// page footer
+	function pg_foot()
+	{
+		echo "<hr></hr>\n";
+		echo "<table width=\"100%\"><tr><td align=left>\n<address>" .
+			"If you have any problems, email " .
+			"<a href=\"mailto:Murray.Jensen@cmst.csiro.au\">" .
+			"Murray Jensen" .
+			"</a></address>\n" .
+			"</td><td align=right>\n" .
+			"<a href=\"index.php?logout=true\">logout</a>\n" .
+			"</td></tr></table>\n";
+		echo "<p><small><i>Made with " .
+		    "<a href=\"http://kyber.dk/phpMyBuilder/\">" .
+		    "Kyber phpMyBuilder</a></i></small></p>\n";
+		echo "</body>\n";
+		echo "</html>\n";
+	}
+
+	// some support functions
+
+	if (!function_exists('array_search')) {
+
+		function array_search($needle, $haystack, $strict = false) {
+
+			if (is_array($haystack) && count($haystack)) {
+
+				$ntype = gettype($needle);
+
+				foreach ($haystack as $key => $value) {
+
+					if ($value == $needle && (!$strict ||
+					    gettype($value) == $ntype))
+						return $key;
+				}
+			}
+
+			return false;
+		}
+	}
+
+	if (!function_exists('in_array')) {
+
+		function in_array($needle, $haystack, $strict = false) {
+
+			if (is_array($haystack) && count($haystack)) {
+
+				$ntype = gettype($needle);
+
+				foreach ($haystack as $key => $value) {
+
+					if ($value == $needle && (!$strict ||
+					    gettype($value) == $ntype))
+						return true;
+				}
+			}
+
+			return false;
+		}
+	}
+
+	function key_in_array($key, $array) {
+		return in_array($key, array_keys($array), true);
+	}
+
+	function enum_to_index($name, $vals) {
+		$index = array_search($GLOBALS[$name], $vals);
+		if ($vals[0] != '')
+		        $index++;
+		return $index;
+	}
+
+	// fetch a value from an array - return empty string is not present
+	function get_key_value($key, $array) {
+		if (key_in_array($key, $array))
+			return $array[$key];
+		else
+			return '';
+	}
+
+	function fprintf() {
+		$n = func_num_args();
+		if ($n < 2)
+			return FALSE;
+		$a = func_get_args();
+		$fp = array_shift($a);
+		$x = "\$s = sprintf";
+		$sep = '(';
+		foreach ($a as $z) {
+			$x .= "$sep'$z'";
+			$sep = ',';
+		}
+		$x .= ');';
+		eval($x);
+		$l = strlen($s);
+		$r = fwrite($fp, $s, $l);
+		if ($r != $l)
+			return FALSE;
+		else
+			return TRUE;
+	}
+
+	// functions to display (print) a database table and its columns
+
+	function begin_table($ncols) {
+		global $table_ncols;
+		$table_ncols = $ncols;
+		echo "<table align=center width=\"100%\""
+			. " border=1 cellpadding=4 cols=$table_ncols>\n";
+	}
+
+	function begin_field($name, $span = 0) {
+		global $table_ncols;
+		echo "<tr valign=top>\n";
+		echo "\t<th align=center>$name</th>\n";
+		if ($span <= 0)
+			$span = $table_ncols - 1;
+		if ($span > 1)
+			echo "\t<td colspan=$span>\n";
+		else
+			echo "\t<td>\n";
+	}
+
+	function cont_field($span = 1) {
+		echo "\t</td>\n";
+		if ($span > 1)
+			echo "\t<td colspan=$span>\n";
+		else
+			echo "\t<td>\n";
+	}
+
+	function end_field() {
+		echo "\t</td>\n";
+		echo "</tr>\n";
+	}
+
+	function end_table() {
+		echo "</table>\n";
+	}
+
+	function print_field($name, $array, $size = 0, $filt='') {
+
+		begin_field($name);
+
+		if (key_in_array($name, $array))
+			$value = $array[$name];
+		else
+			$value = '';
+
+		if ($filt != '')
+			$value = $filt($value);
+
+		echo "\t\t<input name=$name value=\"$value\"";
+		if ($size > 0)
+			echo " size=$size maxlength=$size";
+		echo "></input>\n";
+
+		end_field();
+	}
+
+	function print_field_multiline($name, $array, $cols, $rows, $filt='') {
+
+		begin_field($name);
+
+		if (key_in_array($name, $array))
+			$value = $array[$name];
+		else
+			$value = '';
+
+		if ($filt != '')
+			$value = $filt($value);
+
+		echo "\t\t<textarea name=$name " .
+			"cols=$cols rows=$rows wrap=off>\n";
+		echo "$value";
+		echo "</textarea>\n";
+
+		end_field();
+	}
+
+	// print a mysql ENUM as an html RADIO INPUT
+	function print_enum($name, $array, $vals, $def = -1) {
+
+		begin_field($name);
+
+		if (key_in_array($name, $array))
+			$chk = array_search($array[$name], $vals, FALSE);
+		else
+			$chk = $def;
+
+		$nval = count($vals);
+
+		for ($i = 0; $i < $nval; $i++) {
+
+			$val = $vals[$i];
+			if ($val == '')
+				$pval = "none";
+			else
+				$pval = "$val";
+
+			printf("\t\t<input type=radio name=$name"
+				. " value=\"$val\"%s>$pval</input>\n",
+				$i == $chk ? " checked" : "");
+		}
+
+		end_field();
+	}
+
+	// print a group of mysql ENUMs (e.g. name0,name1,...) as an html SELECT
+	function print_enum_multi($base, $array, $vals, $cnt, $defs, $grp = 0) {
+
+		global $table_ncols;
+
+		if ($grp <= 0)
+			$grp = $cnt;
+		$ncell = $cnt / $grp;
+		$span = ($table_ncols - 1) / $ncell;
+
+		begin_field($base, $span);
+
+		$nval = count($vals);
+
+		for ($i = 0; $i < $cnt; $i++) {
+
+			if ($i > 0 && ($i % $grp) == 0)
+				cont_field($span);
+
+			$name = sprintf("%s%x", $base, $i);
+
+			echo "\t\t<select name=$name>\n";
+
+			if (key_in_array($name, $array))
+				$ai = array_search($array[$name], $vals, FALSE);
+			else {
+				if (key_in_array($i, $defs))
+					$ai = $defs[$i];
+				else
+					$ai = 0;
+			}
+
+			for ($j = 0; $j < $nval; $j++) {
+
+				$val = $vals[$j];
+				if ($val == '')
+					$pval = "&nbsp;";
+				else
+					$pval = "$val";
+
+				printf("\t\t\t<option " .
+					"value=\"%s\"%s>%s</option>\n",
+					$val,
+					$j == $ai ? " selected" : "",
+					$pval);
+			}
+
+			echo "\t\t</select>\n";
+		}
+
+		end_field();
+	}
+
+	// functions to handle the form input
+
+	// fetch all the parts of an "enum_multi" into a string suitable
+	// for a MySQL query
+	function gather_enum_multi_query($base, $cnt) {
+
+		$retval = '';
+
+		for ($i = 0; $i < $cnt; $i++) {
+
+			$name = sprintf("%s%x", $base, $i);
+
+			if (isset($GLOBALS[$name])) {
+				$retval .= sprintf(", %s='%s'",
+					$name, $GLOBALS[$name]);
+			}
+		}
+
+		return $retval;
+	}
+
+	// fetch all the parts of an "enum_multi" into a string suitable
+	// for a display e.g. in an html table cell
+	function gather_enum_multi_print($base, $cnt, $array) {
+
+		$retval = '';
+
+		for ($i = 0; $i < $cnt; $i++) {
+
+			$name = sprintf("%s%x", $base, $i);
+
+			if ($array[$name] != '') {
+				if ($retval != '')
+					$retval .= ',';
+				$retval .= $array[$name];
+			}
+		}
+
+		return $retval;
+	}
+
+	// fetch all the parts of an "enum_multi" into a string suitable
+	// for writing to the eeprom data file
+	function gather_enum_multi_write($base, $cnt, $vals, $xfrm = array()) {
+
+		$retval = '';
+
+		for ($i = 0; $i < $cnt; $i++) {
+
+			$name = sprintf("%s%x", $base, $i);
+
+			if ($GLOBALS[$name] != '') {
+				if ($retval != '')
+					$retval .= ',';
+				$index = enum_to_index($name, $vals);
+				if ($xfrm != array())
+					$retval .= $xfrm[$index];
+				else
+					$retval .= $index;
+			}
+		}
+
+		return $retval;
+	}
+
+	// count how many parts of an "enum_multi" are actually set
+	function count_enum_multi($base, $cnt) {
+
+		$retval = 0;
+
+		for ($i = 0; $i < $cnt; $i++) {
+
+			$name = sprintf("%s%x", $base, $i);
+
+			if (isset($GLOBALS[$name]))
+				$retval++;
+		}
+
+		return $retval;
+	}
+
+	// ethernet address functions
+
+	// generate a (possibly not unique) random vendor ethernet address
+	// (setting bit 6 in the ethernet address - motorola wise i.e. bit 0
+	// is the most significant bit - means it is not an assigned ethernet
+	// address). Also, make sure it is NOT a multicast ethernet address.
+	function gen_eth_addr($serno) {
+
+		$ethaddr_high = (mt_rand(0, 65535) & 0xfeff) | 0x0200;
+		$ethaddr_low = mt_rand(0, 4294967295);
+
+		return sprintf("%02lx:%02lx:%02lx:%02lx:%02lx:%02lx",
+			$ethaddr_high >> 8, $ethaddr_high & 0xff,
+			$ethaddr_low >> 24, ($ethaddr_low >> 16) & 0xff,
+			($ethaddr_low >> 8) & 0xff, $ethaddr_low & 0xff);
+	}
+
+	// check that an ethernet address is valid
+	function eth_addr_is_valid($ethaddr) {
+
+		$ethbytes = split(':', $ethaddr);
+
+		if (count($ethbytes) != 6)
+			return FALSE;
+
+		for ($i = 0; $i < 6; $i++) {
+			$ethbyte = $ethbytes[$i];
+			if (!ereg('^[0-9a-f][0-9a-f]$', $ethbyte))
+				return FALSE;
+		}
+
+		return TRUE;
+	}
+
+	// write a simple eeprom configuration file
+	function write_eeprom_cfg_file() {
+
+		global $sernos, $nsernos, $bddb_cfgdir, $numerrs, $cfgerrs;
+		global $date, $batch, $type_vals, $rev;
+		global $sdram_vals, $sdram_nbits;
+		global $flash_vals, $flash_nbits;
+		global $zbt_vals, $zbt_nbits;
+		global $xlxtyp_vals, $xlxspd_vals, $xlxtmp_vals, $xlxgrd_vals;
+		global $cputyp, $cputyp_vals, $clk_vals;
+		global $hstype, $hstype_vals, $hschin, $hschout;
+
+		$numerrs = 0;
+		$cfgerrs = array();
+
+		for ($i = 0; $i < $nsernos; $i++) {
+
+			$serno = sprintf("%010d", $sernos[$i]);
+
+			$wfp = @fopen($bddb_cfgdir . "/$serno.cfg", "w");
+			if (!$wfp) {
+				$cfgerrs[$i] = 'file create fail';
+				$numerrs++;
+				continue;
+			}
+			set_file_buffer($wfp, 0);
+
+			if (!fprintf($wfp, "serno=%d\n", $sernos[$i])) {
+				$cfgerrs[$i] = 'cfg wr fail (serno)';
+				fclose($wfp);
+				$numerrs++;
+				continue;
+			}
+
+			if (!fprintf($wfp, "date=%s\n", $date)) {
+				$cfgerrs[$i] = 'cfg wr fail (date)';
+				fclose($wfp);
+				$numerrs++;
+				continue;
+			}
+
+			if ($batch != '') {
+				if (!fprintf($wfp, "batch=%s\n", $batch)) {
+					$cfgerrs[$i] = 'cfg wr fail (batch)';
+					fclose($wfp);
+					$numerrs++;
+					continue;
+				}
+			}
+
+			$typei = enum_to_index("type", $type_vals);
+			if (!fprintf($wfp, "type=%d\n", $typei)) {
+				$cfgerrs[$i] = 'cfg wr fail (type)';
+				fclose($wfp);
+				$numerrs++;
+				continue;
+			}
+
+			if (!fprintf($wfp, "rev=%d\n", $rev)) {
+				$cfgerrs[$i] = 'cfg wr fail (rev)';
+				fclose($wfp);
+				$numerrs++;
+				continue;
+			}
+
+			$s = gather_enum_multi_write("sdram", 4,
+				$sdram_vals, $sdram_nbits);
+			if ($s != '') {
+				$b = fprintf($wfp, "sdram=%s\n", $s);
+				if (!$b) {
+					$cfgerrs[$i] = 'cfg wr fail (sdram)';
+					fclose($wfp);
+					$numerrs++;
+					continue;
+				}
+			}
+
+			$s = gather_enum_multi_write("flash", 4,
+				$flash_vals, $flash_nbits);
+			if ($s != '') {
+				$b = fprintf($wfp, "flash=%s\n", $s);
+				if (!$b) {
+					$cfgerrs[$i] = 'cfg wr fail (flash)';
+					fclose($wfp);
+					$numerrs++;
+					continue;
+				}
+			}
+
+			$s = gather_enum_multi_write("zbt", 16,
+				$zbt_vals, $zbt_nbits);
+			if ($s != '') {
+				$b = fprintf($wfp, "zbt=%s\n", $s);
+				if (!$b) {
+					$cfgerrs[$i] = 'cfg wr fail (zbt)';
+					fclose($wfp);
+					$numerrs++;
+					continue;
+				}
+			}
+
+			$s = gather_enum_multi_write("xlxtyp", 4, $xlxtyp_vals);
+			if ($s != '') {
+				$b = fprintf($wfp, "xlxtyp=%s\n", $s);
+				if (!$b) {
+					$cfgerrs[$i] = 'cfg wr fail (xlxtyp)';
+					fclose($wfp);
+					$numerrs++;
+					continue;
+				}
+			}
+
+			$s = gather_enum_multi_write("xlxspd", 4, $xlxspd_vals);
+			if ($s != '') {
+				$b = fprintf($wfp, "xlxspd=%s\n", $s);
+				if (!$b) {
+					$cfgerrs[$i] = 'cfg wr fail (xlxspd)';
+					fclose($wfp);
+					$numerrs++;
+					continue;
+				}
+			}
+
+			$s = gather_enum_multi_write("xlxtmp", 4, $xlxtmp_vals);
+			if ($s != '') {
+				$b = fprintf($wfp, "xlxtmp=%s\n", $s);
+				if (!$b) {
+					$cfgerrs[$i] = 'cfg wr fail (xlxtmp)';
+					fclose($wfp);
+					$numerrs++;
+					continue;
+				}
+			}
+
+			$s = gather_enum_multi_write("xlxgrd", 4, $xlxgrd_vals);
+			if ($s != '') {
+				$b = fprintf($wfp, "xlxgrd=%s\n", $s);
+				if (!$b) {
+					$cfgerrs[$i] = 'cfg wr fail (xlxgrd)';
+					fclose($wfp);
+					$numerrs++;
+					continue;
+				}
+			}
+
+			if ($cputyp != '') {
+				$cputypi = enum_to_index("cputyp",$cputyp_vals);
+				$cpuspdi = enum_to_index("cpuspd", $clk_vals);
+				$busspdi = enum_to_index("busspd", $clk_vals);
+				$cpmspdi = enum_to_index("cpmspd", $clk_vals);
+				$b = fprintf($wfp, "cputyp=%d\ncpuspd=%d\n" .
+					"busspd=%d\ncpmspd=%d\n",
+					$cputypi, $cpuspdi, $busspdi, $cpmspdi);
+				if (!$b) {
+					$cfgerrs[$i] = 'cfg wr fail (cputyp)';
+					fclose($wfp);
+					$numerrs++;
+					continue;
+				}
+			}
+
+			if ($hstype != '') {
+				$hstypei = enum_to_index("hstype",$hstype_vals);
+				$b = fprintf($wfp, "hstype=%d\n" .
+					"hschin=%s\nhschout=%s\n",
+					$hstypei, $hschin, $hschout);
+				if (!$b) {
+					$cfgerrs[$i] = 'cfg wr fail (hstype)';
+					fclose($wfp);
+					$numerrs++;
+					continue;
+				}
+			}
+
+			if (!fclose($wfp)) {
+				$cfgerrs[$i] = 'file cls fail';
+				$numerrs++;
+			}
+		}
+
+		return $numerrs;
+	}
+?>
diff --git a/tools/bddb/dodelete.php b/tools/bddb/dodelete.php
new file mode 100644
index 0000000..839ad8c
--- /dev/null
+++ b/tools/bddb/dodelete.php
@@ -0,0 +1,64 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// dodelete page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - Delete Board Results");
+
+	if (!($serno=intval($serno)))
+		die("the board serial number was not specified");
+
+	mysql_query("delete from boards where serno=$serno");
+
+	if(mysql_errno()) {
+		$errstr = mysql_error();
+		echo "\t<font size=+4>\n";
+		echo "\t\t<p>\n";
+		echo "\t\t\tThe following error was encountered:\n";
+		echo "\t\t</p>\n";
+		echo "\t\t<center>\n";
+		printf("\t\t\t<b>%s</b>\n", $errstr);
+		echo "\t\t</center>\n";
+		echo "\t</font>\n";
+	}
+	else {
+		echo "\t<font size=+2>\n";
+		echo "\t\t<p>\n";
+		echo "\t\t\tThe board with serial number <b>$serno</b> was"
+			. " successfully deleted\n";
+		mysql_query("delete from log where serno=$serno");
+		if (mysql_errno()) {
+			$errstr = mysql_error();
+			echo "\t\t\t<font size=+4>\n";
+			echo "\t\t\t\t<p>\n";
+			echo "\t\t\t\t\tBut the following error occurred " .
+				"when deleting the log entries:\n";
+			echo "\t\t\t\t</p>\n";
+			echo "\t\t\t\t<center>\n";
+			printf("\t\t\t\t\t<b>%s</b>\n", $errstr);
+			echo "\t\t\t\t</center>\n";
+			echo "\t\t\t</font>\n";
+		}
+		echo "\t\t</p>\n";
+		echo "\t</font>\n";
+	}
+?>
+<p>
+<table width="100%">
+<tr>
+  <td align=center>
+    <a href="browse.php">Back to Browse</a>
+  </td>
+  <td align=center>
+    <a href="index.php">Back to Start</a>
+  </td>
+</tr>
+</table>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/dodellog.php b/tools/bddb/dodellog.php
new file mode 100644
index 0000000..d5822c5
--- /dev/null
+++ b/tools/bddb/dodellog.php
@@ -0,0 +1,55 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// dodelete page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - Delete Log Entry Results");
+
+	if (!($serno=intval($serno)))
+		die("the board serial number was not specified");
+
+	if (!isset($logno) || $logno == 0)
+		die("the log entry number not specified!");
+
+	mysql_query("delete from log where serno=$serno and logno=$logno");
+
+	if(mysql_errno()) {
+		$errstr = mysql_error();
+		echo "\t<font size=+4>\n";
+		echo "\t\t<p>\n";
+		echo "\t\t\tThe following error was encountered:\n";
+		echo "\t\t</p>\n";
+		echo "\t\t<center>\n";
+		printf("\t\t\t<b>%s</b>\n", $errstr);
+		echo "\t\t</center>\n";
+		echo "\t</font>\n";
+	}
+	else {
+		echo "\t<font size=+2>\n";
+		echo "\t\t<p>\n";
+		echo "\t\t\tThe log entry with log number <b>$logno</b>\n";
+		echo "\t\t\tand serial number <b>$serno</b> ";
+		echo "was successfully deleted\n";
+		echo "\t\t</p>\n";
+		echo "\t</font>\n";
+	}
+?>
+<p>
+<table width="100%">
+<tr>
+  <td align=center>
+    <a href="brlog.php?serno=<?php echo "$serno"; ?>">Back to Log</a>
+  </td>
+  <td align=center>
+    <a href="index.php">Back to Start</a>
+  </td>
+</tr>
+</table>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/doedit.php b/tools/bddb/doedit.php
new file mode 100644
index 0000000..110ecf3
--- /dev/null
+++ b/tools/bddb/doedit.php
@@ -0,0 +1,170 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// doedit page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - Edit Board Results");
+
+	if ($serno == 0)
+		die("the board serial number was not specified");
+
+	$query="update boards set";
+
+	if (isset($ethaddr)) {
+		if (!eth_addr_is_valid($ethaddr))
+			die("ethaddr is invalid ('$ethaddr')");
+		$query.=" ethaddr='$ethaddr',";
+	}
+
+	if (isset($date)) {
+		list($y, $m, $d) = split("-", $date);
+		if (!checkdate($m, $d, $y) || $y < 1999)
+			die("date is invalid (input '$date', " .
+				"yyyy-mm-dd '$y-$m-$d')");
+		$query.=" date='$date'";
+	}
+
+	if (isset($batch)) {
+		if (strlen($batch) > 32)
+			die("batch field too long (>32)");
+		$query.=", batch='$batch'";
+	}
+
+	if (isset($type)) {
+		if (!in_array($type, $type_vals))
+			die("Invalid type ($type) specified");
+		$query.=", type='$type'";
+	}
+
+	if (isset($rev)) {
+		if (($rev = intval($rev)) <= 0 || $rev > 255)
+			die("Revision number is invalid ($rev)");
+		$query.=sprintf(", rev=%d", $rev);
+	}
+
+	if (isset($location)) {
+		if (strlen($location) > 64)
+			die("location field too long (>64)");
+		$query.=", location='$location'";
+	}
+
+	if (isset($comments))
+		$query.=", comments='" . rawurlencode($comments) . "'";
+
+	$query.=gather_enum_multi_query("sdram", 4);
+
+	$query.=gather_enum_multi_query("flash", 4);
+
+	$query.=gather_enum_multi_query("zbt", 16);
+
+	$query.=gather_enum_multi_query("xlxtyp", 4);
+	$nxlx = count_enum_multi("xlxtyp", 4);
+
+	$query.=gather_enum_multi_query("xlxspd", 4);
+	if (count_enum_multi("xlxspd", 4) != $nxlx)
+		die("number of xilinx speeds not same as number of types");
+
+	$query.=gather_enum_multi_query("xlxtmp", 4);
+	if (count_enum_multi("xlxtmp", 4) != $nxlx)
+		die("number of xilinx temps. not same as number of types");
+
+	$query.=gather_enum_multi_query("xlxgrd", 4);
+	if (count_enum_multi("xlxgrd", 4) != $nxlx)
+		die("number of xilinx grades not same as number of types");
+
+	if (isset($cputyp)) {
+		$query.=", cputyp='$cputyp'";
+		if ($cpuspd == '')
+			die("must specify cpu speed if cpu type is defined");
+		$query.=", cpuspd='$cpuspd'";
+		if ($cpmspd == '')
+			die("must specify cpm speed if cpu type is defined");
+		$query.=", cpmspd='$cpmspd'";
+		if ($busspd == '')
+			die("must specify bus speed if cpu type is defined");
+		$query.=", busspd='$busspd'";
+	}
+	else {
+		if (isset($cpuspd))
+			die("can't specify cpu speed if there is no cpu");
+		if (isset($cpmspd))
+			die("can't specify cpm speed if there is no cpu");
+		if (isset($busspd))
+			die("can't specify bus speed if there is no cpu");
+	}
+
+	if (isset($hschin)) {
+		if (($hschin = intval($hschin)) < 0 || $hschin > 4)
+			die("Invalid number of hs input chans ($hschin)");
+	}
+	else
+		$hschin = 0;
+	if (isset($hschout)) {
+		if (($hschout = intval($hschout)) < 0 || $hschout > 4)
+			die("Invalid number of hs output chans ($hschout)");
+	}
+	else
+		$hschout = 0;
+	if (isset($hstype))
+		$query.=", hstype='$hstype'";
+	else {
+		if ($hschin != 0)
+			die("number of high-speed input channels must be zero"
+				. " if high-speed chip is not present");
+		if ($hschout != 0)
+			die("number of high-speed output channels must be zero"
+				. " if high-speed chip is not present");
+	}
+	$query.=", hschin='$hschin'";
+	$query.=", hschout='$hschout'";
+
+	$query.=" where serno=$serno";
+
+	mysql_query($query);
+	if(mysql_errno()) {
+		$errstr = mysql_error();
+		echo "\t<font size=+4>\n";
+		echo "\t\t<p>\n";
+		echo "\t\t\tThe following error was encountered:\n";
+		echo "\t\t</p>\n";
+		echo "\t\t<center>\n";
+		printf("\t\t\t<b>%s</b>\n", $errstr);
+		echo "\t\t</center>\n";
+		echo "\t</font>\n";
+	}
+	else {
+		$sernos = array($serno);
+		$nsernos = 1;
+
+		write_eeprom_cfg_file();
+
+		echo "\t<font size=+2>\n";
+		echo "\t\t<p>\n";
+		echo "\t\t\tThe board with serial number <b>$serno</b> was"
+			. " successfully updated";
+		if ($numerrs > 0) {
+			$errstr = $cfgerrs[0];
+			echo "<br>\n\t\t\t";
+			echo "(but the cfg file update failed: $errstr)";
+		}
+		echo "\n";
+		echo "\t\t</p>\n";
+		echo "\t</font>\n";
+	}
+
+?>
+<p>
+<table align=center width="100%">
+<tr>
+  <td align=center><a href="browse.php">Back to Browse</a></td>
+  <td align=center><a href="index.php">Back to Start</a></td>
+</tr>
+</table>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/doedlog.php b/tools/bddb/doedlog.php
new file mode 100644
index 0000000..db27c37
--- /dev/null
+++ b/tools/bddb/doedlog.php
@@ -0,0 +1,66 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// doedit page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - Edit Log Entry Results");
+
+	if ($serno == 0)
+		die("the board serial number was not specified");
+
+	if (!isset($logno) || $logno == 0)
+		die("log number not specified!");
+
+	$query="update log set";
+
+	if (isset($date)) {
+		list($y, $m, $d) = split("-", $date);
+		if (!checkdate($m, $d, $y) || $y < 1999)
+			die("date is invalid (input '$date', " .
+				"yyyy-mm-dd '$y-$m-$d')");
+		$query.=" date='$date'";
+	}
+
+	if (isset($details))
+		$query.=", details='" . rawurlencode($details) . "'";
+
+	$query.=" where serno=$serno and logno=$logno";
+
+	mysql_query($query);
+	if(mysql_errno()) {
+		$errstr = mysql_error();
+		echo "\t<font size=+4>\n";
+		echo "\t\t<p>\n";
+		echo "\t\t\tThe following error was encountered:\n";
+		echo "\t\t</p>\n";
+		echo "\t\t<center>\n";
+		printf("\t\t\t<b>%s</b>\n", $errstr);
+		echo "\t\t</center>\n";
+		echo "\t</font>\n";
+	}
+	else {
+		echo "\t<font size=+2>\n";
+		echo "\t\t<p>\n";
+		echo "\t\t\tThe log entry with log number <b>$logno</b> and\n";
+		echo "\t\t\tserial number <b>$serno</b> ";
+		echo "was successfully updated\n";
+		echo "\t\t</p>\n";
+		echo "\t</font>\n";
+	}
+
+?>
+<p>
+<table align=center width="100%">
+<tr>
+  <td align=center><a href="brlog.php?serno=<?php echo "$serno"; ?>">Back to Log</a></td>
+  <td align=center><a href="index.php">Back to Start</a></td>
+</tr>
+</table>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/donew.php b/tools/bddb/donew.php
new file mode 100644
index 0000000..0f6e0d7
--- /dev/null
+++ b/tools/bddb/donew.php
@@ -0,0 +1,228 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// doedit page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - Board Registration Results");
+
+	if (($serno=intval($serno)) != 0)
+		die("serial number must not be set ($serno) when Creating!");
+
+	$query="update boards set";
+
+	list($y, $m, $d) = split("-", $date);
+	if (!checkdate($m, $d, $y) || $y < 1999)
+		die("date is invalid (input '$date', yyyy-mm-dd '$y-$m-$d')");
+	$query.=" date='$date'";
+
+	if ($batch != '') {
+		if (strlen($batch) > 32)
+			die("batch field too long (>32)");
+		$query.=", batch='$batch'";
+	}
+
+	if (!in_array($type, $type_vals))
+		die("Invalid type ($type) specified");
+	$query.=", type='$type'";
+
+	if (($rev = intval($rev)) <= 0 || $rev > 255)
+		die("Revision number is invalid ($rev)");
+	$query.=sprintf(", rev=%d", $rev);
+
+	$query.=gather_enum_multi_query("sdram", 4);
+
+	$query.=gather_enum_multi_query("flash", 4);
+
+	$query.=gather_enum_multi_query("zbt", 16);
+
+	$query.=gather_enum_multi_query("xlxtyp", 4);
+	$nxlx = count_enum_multi("xlxtyp", 4);
+
+	$query.=gather_enum_multi_query("xlxspd", 4);
+	if (count_enum_multi("xlxspd", 4) != $nxlx)
+		die("number of xilinx speeds not same as number of types");
+
+	$query.=gather_enum_multi_query("xlxtmp", 4);
+	if (count_enum_multi("xlxtmp", 4) != $nxlx)
+		die("number of xilinx temps. not same as number of types");
+
+	$query.=gather_enum_multi_query("xlxgrd", 4);
+	if (count_enum_multi("xlxgrd", 4) != $nxlx)
+		die("number of xilinx grades not same as number of types");
+
+	if ($cputyp == '') {
+		if ($cpuspd != '')
+			die("can't specify cpu speed if there is no cpu");
+		if ($cpmspd != '')
+			die("can't specify cpm speed if there is no cpu");
+		if ($busspd != '')
+			die("can't specify bus speed if there is no cpu");
+	}
+	else {
+		$query.=", cputyp='$cputyp'";
+		if ($cpuspd == '')
+			die("must specify cpu speed if cpu type is defined");
+		$query.=", cpuspd='$cpuspd'";
+		if ($cpmspd == '')
+			die("must specify cpm speed if cpu type is defined");
+		$query.=", cpmspd='$cpmspd'";
+		if ($busspd == '')
+			die("must specify bus speed if cpu type is defined");
+		$query.=", busspd='$busspd'";
+	}
+
+	if (($hschin = intval($hschin)) < 0 || $hschin > 4)
+		die("Invalid number of hs input chans ($hschin)");
+	if (($hschout = intval($hschout)) < 0 || $hschout > 4)
+		die("Invalid number of hs output chans ($hschout)");
+	if ($hstype == '') {
+		if ($hschin != 0)
+			die("number of high-speed input channels must be zero"
+				. " if high-speed chip is not present");
+		if ($hschout != 0)
+			die("number of high-speed output channels must be zero"
+				. " if high-speed chip is not present");
+	}
+	else
+		$query.=", hstype='$hstype'";
+	$query.=", hschin='$hschin'";
+	$query.=", hschout='$hschout'";
+
+	// echo "final query = '$query'<br>\n";
+
+	$quant = intval($quant);
+	if ($quant <= 0) $quant = 1;
+
+	$sernos = array();
+	if ($geneths)
+		$ethaddrs = array();
+
+	$sqlerr = '';
+
+	while ($quant-- > 0) {
+
+		mysql_query("insert into boards (serno) values (null)");
+		if (mysql_errno()) {
+			$sqlerr = mysql_error();
+			break;
+		}
+
+		$serno = mysql_insert_id();
+		if (!$serno) {
+			$sqlerr = "couldn't allocate new serial number";
+			break;
+		}
+
+		mysql_query($query . " where serno=$serno");
+		if (mysql_errno()) {
+			$sqlerr = mysql_error();
+			break;
+		}
+
+		array_push($sernos, $serno);
+
+		if ($geneths) {
+
+			$ethaddr = gen_eth_addr($serno);
+
+			mysql_query("update boards set ethaddr='$ethaddr'" .
+			    " where serno=$serno");
+			if (mysql_errno()) {
+				$sqlerr = mysql_error();
+
+				array_push($ethaddrs,
+					"<font color=#ff0000><b>" .
+					"db save fail" .
+					"</b></font>");
+				break;
+			}
+
+			array_push($ethaddrs, $ethaddr);
+		}
+	}
+
+	$nsernos = count($sernos);
+
+	if ($nsernos > 0) {
+
+		write_eeprom_cfg_file();
+
+		echo "<font size=+2>\n";
+		echo "\t<p>\n";
+		echo "\t\tThe following board serial numbers were"
+			. " successfully allocated";
+		if ($numerrs > 0)
+			echo " (but with $numerrs cfg file error" .
+				($numerrs > 1 ? "s" : "") . ")";
+		echo ":\n";
+		echo "\t</p>\n";
+
+		echo "</font>\n";
+
+		echo "<table align=center width=\"100%\">\n";
+		echo "<tr>\n";
+		echo "\t<th>Serial Number</th>\n";
+		if ($numerrs > 0)
+			echo "\t<th>Cfg File Errs</th>\n";
+		if ($geneths)
+			echo "\t<th>Ethernet Address</th>\n";
+		echo "</tr>\n";
+
+		for ($i = 0; $i < $nsernos; $i++) {
+
+			$serno = sprintf("%010d", $sernos[$i]);
+
+			echo "<tr>\n";
+
+			echo "\t<td align=center><font size=+2>" .
+				"<b>$serno</b></font></td>\n";
+
+			if ($numerrs > 0) {
+				if (($errstr = $cfgerrs[$i]) == '')
+					$errstr = '&nbsp;';
+				echo "\t<td align=center>" .
+					"<font size=+2 color=#ff0000><b>" .
+					$errstr .
+					"</b></font></td>\n";
+			}
+
+			if ($geneths) {
+				echo "\t<td align=center>" .
+					"<font size=+2 color=#00ff00><b>" .
+					$ethaddrs[$i] .
+					"</b></font></td>\n";
+			}
+
+			echo "</tr>\n";
+		}
+
+		echo "</table>\n";
+	}
+
+	if ($sqlerr != '') {
+		echo "\t<font size=+4>\n";
+		echo "\t\t<p>\n";
+		echo "\t\t\tThe following SQL error was encountered:\n";
+		echo "\t\t</p>\n";
+		echo "\t\t<center>\n";
+		printf("\t\t\t<b>%s</b>\n", $sqlerr);
+		echo "\t\t</center>\n";
+		echo "\t</font>\n";
+	}
+
+?>
+<p>
+<table align=center width="100%">
+<tr>
+  <td align=center><a href="browse.php">Go to Browse</a></td>
+  <td align=center><a href="index.php">Back to Start</a></td>
+</tr>
+</table>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/donewlog.php b/tools/bddb/donewlog.php
new file mode 100644
index 0000000..b00de95
--- /dev/null
+++ b/tools/bddb/donewlog.php
@@ -0,0 +1,76 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// doedit page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - Add Log Entry Results");
+
+	if ($serno == 0)
+		die("serial number not specified!");
+
+	if (isset($logno))
+		die("log number must not be set ($logno) when Creating!");
+
+	$query="update log set serno=$serno";
+
+	list($y, $m, $d) = split("-", $date);
+	if (!checkdate($m, $d, $y) || $y < 1999)
+		die("date is invalid (input '$date', yyyy-mm-dd '$y-$m-$d')");
+	$query.=", date='$date'";
+
+	if (isset($details))
+		$query.=", details='" . rawurlencode($details) . "'";
+
+	// echo "final query = '$query'<br>\n";
+
+	$sqlerr = '';
+
+	mysql_query("insert into log (logno) values (null)");
+	if (mysql_errno())
+		$sqlerr = mysql_error();
+	else {
+		$logno = mysql_insert_id();
+		if (!$logno)
+			$sqlerr = "couldn't allocate new serial number";
+		else {
+			mysql_query($query . " where logno=$logno");
+			if (mysql_errno())
+				$sqlerr = mysql_error();
+		}
+	}
+
+	if ($sqlerr == '') {
+		echo "<font size=+2>\n";
+		echo "\t<p>\n";
+		echo "\t\tA log entry with log number '$logno' was " .
+			"added to the board with serial number '$serno'\n";
+		echo "\t</p>\n";
+		echo "</font>\n";
+	}
+	else {
+		echo "\t<font size=+4>\n";
+		echo "\t\t<p>\n";
+		echo "\t\t\tThe following SQL error was encountered:\n";
+		echo "\t\t</p>\n";
+		echo "\t\t<center>\n";
+		printf("\t\t\t<b>%s</b>\n", $sqlerr);
+		echo "\t\t</center>\n";
+		echo "\t</font>\n";
+	}
+
+?>
+<p></p>
+<table width="100%">
+<tr>
+  <td align=center><a href="brlog.php?serno=<?php echo "$serno"; ?>">Go to Browse</a></td>
+  <td align=center><a href="index.php">Back to Start</a></td>
+</tr>
+</table>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/edit.php b/tools/bddb/edit.php
new file mode 100644
index 0000000..f7d4830
--- /dev/null
+++ b/tools/bddb/edit.php
@@ -0,0 +1,131 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// edit page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - Edit Board Registration");
+
+	if ($serno == 0)
+		die("serial number not specified!");
+
+	$pserno = sprintf("%010d", $serno);
+
+	echo "<center><b><font size=+2>";
+	echo "Board Serial Number: $pserno";
+	echo "</font></b></center>\n";
+
+?>
+<p>
+<form action=doedit.php method=POST>
+<?php
+	echo "<input type=hidden name=serno value=$serno>\n";
+
+	$r=mysql_query("select * from boards where serno=$serno");
+	$row=mysql_fetch_array($r);
+	if(!$row) die("no record of serial number '$serno' in database");
+
+	begin_table(5);
+
+	// ethaddr char(17)
+	print_field("ethaddr", $row, 17);
+
+	// date date
+	print_field("date", $row);
+
+	// batch char(32)
+	print_field("batch", $row, 32);
+
+	// type enum('IO','CLP','DSP','INPUT','ALT-INPUT','DISPLAY')
+	print_enum("type", $row, $type_vals);
+
+	// rev tinyint(3) unsigned zerofill
+	print_field("rev", $row, 3, 'rev_filter');
+
+	// location char(64)
+	print_field("location", $row, 64);
+
+	// comments text
+	print_field_multiline("comments", $row, 60, 10, 'text_filter');
+
+	// sdram[0-3] enum('32M','64M','128M','256M')
+	print_enum_multi("sdram", $row, $sdram_vals, 4, array());
+
+	// flash[0-3] enum('4M','8M','16M','32M','64M')
+	print_enum_multi("flash", $row, $flash_vals, 4, array());
+
+	// zbt[0-f] enum('512K','1M','2M','4M')
+	print_enum_multi("zbt", $row, $zbt_vals, 16, array());
+
+	// xlxtyp[0-3] enum('XCV300E','XCV400E','XCV600E')
+	print_enum_multi("xlxtyp", $row, $xlxtyp_vals, 4, array(), 1);
+
+	// xlxspd[0-3] enum('6','7','8')
+	print_enum_multi("xlxspd", $row, $xlxspd_vals, 4, array(), 1);
+
+	// xlxtmp[0-3] enum('COM','IND')
+	print_enum_multi("xlxtmp", $row, $xlxtmp_vals, 4, array(), 1);
+
+	// xlxgrd[0-3] enum('NORMAL','ENGSAMP')
+	print_enum_multi("xlxgrd", $row, $xlxgrd_vals, 4, array(), 1);
+
+	// cputyp enum('MPC8260')
+	print_enum("cputyp", $row, $cputyp_vals);
+
+	// cpuspd enum('33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ')
+	print_enum("cpuspd", $row, $clk_vals);
+
+	// cpmspd enum('33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ')
+	print_enum("cpmspd", $row, $clk_vals);
+
+	// busspd enum('33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ')
+	print_enum("busspd", $row, $clk_vals);
+
+	// hstype enum('AMCC-S2064A')
+	print_enum("hstype", $row, $hstype_vals);
+
+	// hschin enum('0','1','2','3','4')
+	print_enum("hschin", $row, $hschin_vals);
+
+	// hschout enum('0','1','2','3','4')
+	print_enum("hschout", $row, $hschout_vals);
+
+	end_table();
+
+	echo "<p>\n";
+	echo "<center><b>";
+	echo "<font color=#ff0000>WARNING: NO UNDO ON DELETE!</font>";
+	echo "<br></br>\n";
+	echo "<tt>[ <a href=\"dodelete.php?serno=$serno\">delete</a> ]</tt>";
+	echo "</b></center>\n";
+	echo "</p>\n";
+?>
+<p>
+<table align=center width="100%">
+<tr>
+  <td align=center>
+    <input type=submit value=Edit>
+  </td>
+  <td>
+    &nbsp;
+  </td>
+  <td align=center>
+    <input type=reset value=Reset>
+  </td>
+  <td>
+    &nbsp;
+  </td>
+  <td align=center>
+    <a href="index.php">Back to Start</a>
+  </td>
+</tr>
+</table>
+</p>
+</form>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/edlog.php b/tools/bddb/edlog.php
new file mode 100644
index 0000000..f819b46
--- /dev/null
+++ b/tools/bddb/edlog.php
@@ -0,0 +1,81 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// edit page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - Edit Board Log Entry");
+
+	if ($serno == 0)
+		die("serial number not specified!");
+
+	if (!isset($logno) || $logno == 0)
+		die("log number not specified!");
+
+	$pserno = sprintf("%010d", $serno);
+	$plogno = sprintf("%010d", $logno);
+
+	echo "<center><b><font size=+2>";
+	echo "Board Serial Number: $pserno, Log Number: $plogno";
+	echo "</font></b></center>\n";
+
+?>
+<p>
+<form action=doedlog.php method=POST>
+<?php
+	echo "<input type=hidden name=serno value=$serno>\n";
+	echo "<input type=hidden name=logno value=$logno>\n";
+
+	$r=mysql_query("select * from log where serno=$serno and logno=$logno");
+	$row=mysql_fetch_array($r);
+	if(!$row)
+		die("no record of log entry with serial number '$serno' " .
+			"and log number '$logno' in database");
+
+	begin_table(3);
+
+	// date date
+	print_field("date", $row);
+
+	// details text
+	print_field_multiline("details", $row, 60, 10, 'text_filter');
+
+	end_table();
+
+	echo "<p>\n";
+	echo "<center><b>";
+	echo "<font color=#ff0000>WARNING: NO UNDO ON DELETE!</font>";
+	echo "<br></br>\n";
+	echo "<tt>[ <a href=\"dodellog.php?serno=$serno&logno=$logno\">delete</a> ]</tt>";
+	echo "</b></center>\n";
+	echo "</p>\n";
+?>
+<p>
+<table align=center width="100%">
+<tr>
+  <td align=center>
+    <input type=submit value=Edit>
+  </td>
+  <td>
+    &nbsp;
+  </td>
+  <td align=center>
+    <input type=reset value=Reset>
+  </td>
+  <td>
+    &nbsp;
+  </td>
+  <td align=center>
+    <a href="index.php">Back to Start</a>
+  </td>
+</tr>
+</table>
+</p>
+</form>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/execute.php b/tools/bddb/execute.php
new file mode 100644
index 0000000..7adcfec
--- /dev/null
+++ b/tools/bddb/execute.php
@@ -0,0 +1,37 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	if (!isset($serno))
+		$serno = 0;
+	else
+		$serno = intval($serno);
+
+	if (!isset($submit))
+		$submit = "[NOT SET]";
+
+	switch ($submit) {
+
+	case "New":
+		require("new.php");
+		break;
+
+	case "Edit":
+		require("edit.php");
+		break;
+
+	case "Browse":
+		require("browse.php");
+		break;
+
+	case "Log":
+		require("brlog.php");
+		break;
+
+	default:
+		require("badsubmit.php");
+		break;
+	}
+?>
diff --git a/tools/bddb/index.php b/tools/bddb/index.php
new file mode 100644
index 0000000..9d6c7f5
--- /dev/null
+++ b/tools/bddb/index.php
@@ -0,0 +1,38 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	require("defs.php");
+	pg_head("$bddb_label");
+?>
+<font size="+4">
+  <form action=execute.php method=POST>
+    <table width="100%" cellspacing=10 cellpadding=10>
+      <tr>
+	<td align=center>
+	  <input type=submit name=submit value="New"></input>
+	</td>
+	<td align=center>
+	  <input type=submit name=submit value="Edit"></input>
+	</td>
+	<td align=center>
+	  <input type=submit name=submit value="Browse"></input>
+	</td>
+	<td align=center>
+	  <input type=submit name=submit value="Log"></input>
+	</td>
+      </tr>
+      <tr>
+	<td align=center colspan=4>
+	  <b>Serial Number:</b>
+	  <input type=text name=serno size=10 maxsize=10 value=""></input>
+	</td>
+      </tr>
+    </table>
+  </form>
+</font>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/new.php b/tools/bddb/new.php
new file mode 100644
index 0000000..889c6ae
--- /dev/null
+++ b/tools/bddb/new.php
@@ -0,0 +1,121 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// edit page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - New Board Registration");
+?>
+<form action=donew.php method=POST>
+<p></p>
+<?php
+	// if a serial number was supplied, fetch the record
+	// and use its contents as defaults
+	if ($serno != 0) {
+		$r=mysql_query("select * from boards where serno=$serno");
+		$row=mysql_fetch_array($r);
+		if(!$row)die("no record of serial number '$serno' in database");
+	}
+	else
+		$row = array();
+
+	echo "<input type=hidden name=serno value=0>\n";
+
+	begin_table(5);
+
+	// date date
+	print_field("date", array('date' => date("Y-m-d")));
+
+	// batch char(32)
+	print_field("batch", $row, 32);
+
+	// type enum('IO','CLP','DSP','INPUT','ALT-INPUT','DISPLAY')
+	print_enum("type", $row, $type_vals, 0);
+
+	// rev tinyint(3) unsigned zerofill
+	print_field("rev", $row, 3, 'rev_filter');
+
+	// sdram[0-3] enum('32M','64M','128M','256M')
+	print_enum_multi("sdram", $row, $sdram_vals, 4, array(2));
+
+	// flash[0-3] enum('4M','8M','16M','32M','64M')
+	print_enum_multi("flash", $row, $flash_vals, 4, array(2));
+
+	// zbt[0-f] enum('512K','1M','2M','4M')
+	print_enum_multi("zbt", $row, $zbt_vals, 16, array(2, 2));
+
+	// xlxtyp[0-3] enum('XCV300E','XCV400E','XCV600E')
+	print_enum_multi("xlxtyp", $row, $xlxtyp_vals, 4, array(1), 1);
+
+	// xlxspd[0-3] enum('6','7','8')
+	print_enum_multi("xlxspd", $row, $xlxspd_vals, 4, array(1), 1);
+
+	// xlxtmp[0-3] enum('COM','IND')
+	print_enum_multi("xlxtmp", $row, $xlxtmp_vals, 4, array(1), 1);
+
+	// xlxgrd[0-3] enum('NORMAL','ENGSAMP')
+	print_enum_multi("xlxgrd", $row, $xlxgrd_vals, 4, array(1), 1);
+
+	// cputyp enum('MPC8260')
+	print_enum("cputyp", $row, $cputyp_vals, 1);
+
+	// cpuspd enum('33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ')
+	print_enum("cpuspd", $row, $clk_vals, 4);
+
+	// cpmspd enum('33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ')
+	print_enum("cpmspd", $row, $clk_vals, 4);
+
+	// busspd enum('33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ')
+	print_enum("busspd", $row, $clk_vals, 2);
+
+	// hstype enum('AMCC-S2064A')
+	print_enum("hstype", $row, $hstype_vals, 1);
+
+	// hschin enum('0','1','2','3','4')
+	print_enum("hschin", $row, $hschin_vals, 4);
+
+	// hschout enum('0','1','2','3','4')
+	print_enum("hschout", $row, $hschout_vals, 4);
+
+	end_table();
+?>
+<p></p>
+<table width="100%">
+<tr>
+  <td align=center colspan=3>
+    Allocate
+    <input type=text name=quant size=2 maxlength=2 value=" 1">
+    board serial number(s)
+  </td>
+</tr>
+<tr>
+  <td align=center colspan=3>
+    <input type=checkbox name=geneths checked>
+    Generate Ethernet Address(es)
+  </td>
+</tr>
+<tr>
+  <td colspan=3>
+    &nbsp;
+  </td>
+</tr>
+<tr>
+  <td align=center>
+    <input type=submit value="Register Board">
+  </td>
+  <td>
+    &nbsp;
+  </td>
+  <td align=center>
+    <input type=reset value="Reset Form Contents">
+  </td>
+</tr>
+</table>
+</form>
+<?php
+	pg_foot();
+?>
diff --git a/tools/bddb/newlog.php b/tools/bddb/newlog.php
new file mode 100644
index 0000000..5ec42ac
--- /dev/null
+++ b/tools/bddb/newlog.php
@@ -0,0 +1,48 @@
+<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
+<?php
+	// (C) Copyright 2001
+	// Murray Jensen <Murray.Jensen@cmst.csiro.au>
+	// CSIRO Manufacturing Science and Technology, Preston Lab
+
+	// edit page (hymod_bddb / boards)
+
+	require("defs.php");
+
+	pg_head("$bddb_label - New Log Entry");
+
+	if ($serno == 0)
+		die("serial number not specified!");
+
+	if (isset($logno))
+		die("log number must not be specified when adding!");
+?>
+<form action=donewlog.php method=POST>
+<p></p>
+<?php
+	echo "<input type=hidden name=serno value=$serno>\n";
+
+	begin_table(3);
+
+	// date date
+	print_field("date", array('date' => date("Y-m-d")));
+
+	// details text
+	print_field_multiline("details", array(), 60, 10, 'text_filter');
+
+	end_table();
+?>
+<p></p>
+<table width="100%">
+<tr>
+  <td align=center>
+    <input type=submit value="Add Log Entry">
+  </td>
+  <td align=center>
+    <input type=reset value="Reset Form Contents">
+  </td>
+</tr>
+</table>
+</form>
+<?php
+	pg_foot();
+?>