summaryrefslogtreecommitdiff
path: root/packages/orinoco
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@rpsys.net>2005-09-17 15:34:43 +0000
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>2005-09-17 15:34:43 +0000
commitb9dd015d80081be34c439ebbc1610e13607ea098 (patch)
tree0d78d955677f33818ce7a91e9bdf828f9005d022 /packages/orinoco
parentc9ed87ab7acd3ca88fc79a5326233aea1f7c6cb9 (diff)
Add firmware generation package for spectrum wireless LAN cards.
Diffstat (limited to 'packages/orinoco')
-rw-r--r--packages/orinoco/spectrum-fw.bb20
-rw-r--r--packages/orinoco/spectrum-fw/.mtn2git_empty0
-rw-r--r--packages/orinoco/spectrum-fw/get_symbol_fw43
-rw-r--r--packages/orinoco/spectrum-fw/parse_symbol_fw129
4 files changed, 192 insertions, 0 deletions
diff --git a/packages/orinoco/spectrum-fw.bb b/packages/orinoco/spectrum-fw.bb
new file mode 100644
index 0000000000..749b6e71f7
--- /dev/null
+++ b/packages/orinoco/spectrum-fw.bb
@@ -0,0 +1,20 @@
+DESCRIPTION = "Firmware for Spectrum Wireless LAN cards"
+LICENSE = "unknown"
+PR = "r0"
+
+SRC_URI = "file://get_symbol_fw \
+ file://parse_symbol_fw"
+
+S = "${WORKDIR}"
+
+do_compile() {
+ get_symbol_fw
+}
+
+FILES_${PN} += "${base_libdir}/firmware/symbol*"
+
+do_install() {
+ install -d ${D}${base_libdir}/firmware/
+ install -m 0755 ${WORKDIR}/symbol_sp24t_prim_fw ${D}${base_libdir}/firmware/symbol_sp24t_prim_fw
+ install -m 0755 ${WORKDIR}/symbol_sp24t_sec_fw ${D}${base_libdir}/firmware/symbol_sp24t_sec_fw
+}
diff --git a/packages/orinoco/spectrum-fw/.mtn2git_empty b/packages/orinoco/spectrum-fw/.mtn2git_empty
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/packages/orinoco/spectrum-fw/.mtn2git_empty
diff --git a/packages/orinoco/spectrum-fw/get_symbol_fw b/packages/orinoco/spectrum-fw/get_symbol_fw
new file mode 100644
index 0000000000..e7b0bf2d44
--- /dev/null
+++ b/packages/orinoco/spectrum-fw/get_symbol_fw
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+# Get firmware for Symbol Spectrum24 Trilogy.
+# Both the header file and the binary firmware files are produced.
+
+# Copyright (C) 2004 Pavel Roskin <proski@gnu.org>
+
+# This script is Free Software, and it can be copied, distributed and
+# modified as defined in the GNU General Public License. A copy of
+# its license can be downloaded from http://www.gnu.org/copyleft/gpl.html
+
+# Usage: get_symbol_fw
+# Output: spectrum_fw.h symbol_sp24t_prim_fw symbol_sp24t_sec_fw
+# Needed tools: curl (or wget), unzip, perl.
+
+set -e
+
+URL_BASE='ftp://symstore.longisland.com/Symstore/services_download/wirless_prod/'
+DL_FILE='MC&DriverOnlyInstallers.zip'
+DL_INT1='S24DRVR392B67-01.exe'
+DL_INT2='Driver Only Installer/NetWLan5.sys'
+DRIVER1=symbol1.drv
+DRIVER2=symbol2.drv
+
+get_file() {
+ curl --remote-name "$1" || \
+ wget --passive-ftp "$1" || \
+ wget "$1" || \
+ ftp "$1" </dev/null || \
+ exit 1
+}
+
+if ! test -f $DL_FILE; then
+ get_file $URL_BASE/$DL_FILE
+fi
+
+unzip -p $DL_FILE "$DL_INT1" >$DRIVER1
+unzip -p $DRIVER1 "$DL_INT2" >$DRIVER2
+
+perl parse_symbol_fw $DRIVER2 spectrum_fw.h symbol_sp24t_prim_fw \
+ symbol_sp24t_sec_fw
+
+rm -f $DRIVER1 $DRIVER2 \ No newline at end of file
diff --git a/packages/orinoco/spectrum-fw/parse_symbol_fw b/packages/orinoco/spectrum-fw/parse_symbol_fw
new file mode 100644
index 0000000000..7fe0ea57c4
--- /dev/null
+++ b/packages/orinoco/spectrum-fw/parse_symbol_fw
@@ -0,0 +1,129 @@
+#!/usr/bin/perl -w
+
+# Extract Symbol firmware and convert is to a header file and two binary
+# files.
+
+# Copyright (C) 2004 Pavel Roskin <proski@gnu.org>
+
+# This script is Free Software, and it can be copied, distributed and
+# modified as defined in the GNU General Public License. A copy of
+# its license can be downloaded from http://www.gnu.org/copyleft/gpl.html
+
+# Usage:
+# parse_symbol_fw infile header binfile1 binfile2
+
+use strict;
+
+# Print message and exit (like "die", but without raising an exception).
+# Newline is added at the end.
+sub error
+{
+ printf STDERR "ERROR: ";
+ printf STDERR @_;
+ printf STDERR "\n";
+ exit 1;
+}
+
+sub readnum_ba ()
+{
+ my $byte_a;
+ read INFILE,$byte_a,1;
+ my $byte_b;
+ read INFILE,$byte_b,1;
+ return (ord($byte_b) << 8) + ord($byte_a);
+}
+
+
+if ($#ARGV != 3) {
+ error ("Usage: parse_symbol_fw infile header binfile1 binfile2");
+}
+
+unless (open (INFILE, "< $ARGV[0]")) {
+ error ("couldn't open $ARGV[0] for reading: $!");
+}
+
+unless (open (OUTFILE, "> $ARGV[1]")) {
+ error ("couldn't open $ARGV[1] for writing: $!");
+}
+
+# Process one array, either for primary or for secondary firmware
+sub process_one_array($$) {
+ my $arrname = shift(@_);
+ my $binfile = shift(@_);
+ my $offset = -1;
+ my $str_offset = 0;
+
+ # Skip to the beginning of firmware
+ $/ = "\x00";
+ while (<INFILE>) {
+ if (m{FILE: }g) {
+ $offset = $str_offset + pos() - 6;
+ last;
+ }
+ $str_offset = tell(INFILE);
+ }
+
+ if ($offset == -1) {
+ error("Cannot find FILE: marker");
+ }
+
+ my @fwdata = split;
+ print $fwdata[1] . "\n";
+ seek(INFILE, $offset, 0);
+
+ my $blknum = $fwdata[3];
+ my $pdrlen = $fwdata[4];
+ my $crclen = $fwdata[5];
+ my $compatlen = $fwdata[6];
+
+ while (!eof(INFILE)) {
+ my $byte;
+ read INFILE, $byte, 1;
+ last if (ord($byte) == 0x1a);
+ }
+
+ # Walk all blocks
+ my $block = $blknum;
+ while ($block-- > 0) {
+ seek(INFILE, 4, 1);
+ my $len = readnum_ba();
+ seek(INFILE, $len, 1);
+ }
+
+ my $img_len = tell(INFILE) - $offset + $pdrlen + $crclen + $compatlen + 2;
+ seek(INFILE, $offset, 0);
+
+ # Write binary file for the section
+ unless (open (BINFILE, "> $binfile")) {
+ error ("couldn't open $binfile for writing: $!");
+ }
+
+ # Output the array
+ printf OUTFILE "/* %s %s */\n", $fwdata[1], $fwdata[2];
+ printf OUTFILE "static u8 %s[] = {\n", $arrname;
+
+ my $count = 0;
+ while ($count++ < $img_len) {
+ my $byte;
+ read INFILE, $byte, 1;
+ $byte = ord($byte);
+ printf OUTFILE "0x%02x,", $byte;
+ printf BINFILE "%c", $byte;
+ if ($count % 16 == 0) {
+ printf OUTFILE "\n";
+ }
+ }
+
+ if ($img_len % 16) {
+ printf OUTFILE "\n";
+ }
+
+ print OUTFILE "};\n";
+ close(BINFILE);
+}
+
+process_one_array("primsym", $ARGV[2]);
+process_one_array("secsym", $ARGV[3]);
+
+close(INFILE);
+close(OUTFILE);