Salut,
le module devenant de plus en plus gros a cause du nouveau firmware de l'eagle III et comme j'avais envi de faire mumuse avec l'interface noyeau de chargement de firmware, j'ai codé un petit truc pour sortir le firmware du module.
La taille du module est passe de 120 Ko a 80 Ko.
Ca devrait marche aussi bien sur les archi big et little indian.

Mon code (notament mk_fw) n'est pas tres propre (pas de gestion de toutes les erreurs), mais si les mainteneurs du module sont interresser, je pourrais le nettoyer.

Il pourrait peut etre aussi interressant d'utiliser la meme interface pour le dsp, quoique il y aura toujours les options a passer au modem et je sais pas si on peut differencier pots de idsn via les id du modem...

mk_kw.c est a placer dans driver/firmware et sert a generer les fichiers eagle{I,II,III}.fw qui contiennent les image des firmwares. Il peuvent soit etre charger a la main dans /sys/class/firmware/xxx/data, soit via l'intermediaire de hotplug (cf linux/Documentation/firmware_class/README ou la doc hotplug)


Matthieu
Index: driver/eu_utils.c
===================================================================
RCS file: /cvs/eagleusb/eagleusb/driver/eu_utils.c,v
retrieving revision 1.6
diff -u -r1.6 eu_utils.c
--- driver/eu_utils.c   9 Oct 2004 11:59:56 -0000       1.6
+++ driver/eu_utils.c   9 Oct 2004 22:53:43 -0000
@@ -29,8 +29,15 @@
 #include "eu_utils.h"
 #include "macros.h"
 #include "debug.h"
-#include "eu_firmware.h"
 
+//need CONFIG_FW_LOADER
+#define EXTERN_FW
+
+#ifdef EXTERN_FW
+#include "linux/firmware.h"
+#else
+#include "eu_firmware.h"
+#endif
 
 /* ----------------------- Private Macros/Variables ------------------------ */
 
@@ -73,8 +80,14 @@
 {
     int ret= 0;
     uint8_t value;
+#ifdef EXTERN_FW
+    const struct firmware *fw_entry;
+    int size;
+    uint8_t *pfw;
+#else
     uint32_t i = 0;
     eu_hex_record_t *pfirm;
+#endif
     
     eu_enters (DBG_UTILS);
 
@@ -91,6 +104,52 @@
         goto byebye;
     }
 
+#ifdef EXTERN_FW
+if ( IS_EAGLE_I (pid) ) 
+    {
+       if(request_firmware(&fw_entry, "eagleI.fw", &ins->usbdev->dev)!=0)
+       {
+               eu_err ("EAGLE_I.fw Firmware not available\n");
+               goto byebye;
+       }
+    }
+    else  if ( !IS_EAGLE_III (pid) )
+    {
+       if(request_firmware(&fw_entry, "eagleII.fw", &ins->usbdev->dev)!=0)
+       {
+               eu_err ("EAGLE_II.fw Firmware not available\n");
+               goto byebye;
+       }
+    }
+    else 
+    {
+       if(request_firmware(&fw_entry, "eagleIII.fw", &ins->usbdev->dev)!=0)
+       {
+               eu_err ("EAGLE_III.fw Firmware not available\n");
+               goto byebye;
+       }
+    }
+    pfw = fw_entry->data;
+    
+    size = fw_entry->size;
+    while (size>0) 
+    {
+       uint8_t len = *pfw;
+       uint16_t add = le16_to_cpu(*(uint16_t*)(pfw+1));
+        ret = eu_send_modem_cmd (ins,
+                                 add,
+                                 len,
+                                 pfw+3);
+        if ( ret < 0 ) 
+        {
+            eu_err ("eu_send_modem_cmd of download data failed (%d)\n",ret);
+            goto byebye;
+        }
+        pfw += len + 3;
+       size -= len + 3;
+    }
+    release_firmware(fw_entry);
+#else
     if ( IS_EAGLE_I (pid) ) 
     {
         pfirm = &eu_eagle_I_firmware[0];
@@ -119,6 +178,7 @@
         }
         pfirm ++;
     }
+#endif
 
     /*
      * De-assert reset
/*
 *  generator of eagle firmware image
 *
 *  Copyright (c) 2004 by Castet Matthieu <[EMAIL PROTECTED]>
 *
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 */

#include <inttypes.h>
#include "../eu_firmware.h"

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <asm/byteorder.h>
#include <stdio.h>
#include <unistd.h>

static void mk_fir(char * name, eu_hex_record_t *pfirm)
{
	int fd;
	fd = creat(name, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
	if (fd == -1) {
		perror("");
		return ;
	}
	while(pfirm->type == 0) {
		uint16_t add = __cpu_to_le16(pfirm->address);
		write(fd, &pfirm->length, sizeof(pfirm->length)/*1*/);
		write(fd, &add, sizeof(pfirm->address)/*2*/);
		write(fd, pfirm->data, pfirm->length);
		pfirm++;
	}
	close(fd);
}

int main() {
	mk_fir("eagleI.fw", eu_eagle_I_firmware);
	mk_fir("eagleII.fw", eu_eagle_I_firmware);
	mk_fir("eagleIII.fw", eu_eagle_I_firmware);
	return 0;
}

Reply via email to