Frederick Ros wrote:
matthieu castet wrote :
| 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.
Ca fait qq temps que je voulais jouer avec, mais bon le manque de temps
allie a ma paresse... ;)
Par contre je ne me rappelle plus si c'est bien porte sur les 2.4 (j'en
ai plus a la maison..), et a partir de quelle version ...
http://kerneltrap.org/node/view/813 semble indique que c'est a partir du
2.4.23 pour le backport.
Matthieu
PS : je joint une version plus propre de la modif au niveau du driver
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 10 Oct 2004 11:15:46 -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,15 @@
{
int ret= 0;
uint8_t value;
+#ifdef EXTERN_FW
+ const struct firmware *fw_entry;
+ int size;
+ uint8_t *pfw;
+ char *fw_name;
+#else
uint32_t i = 0;
eu_hex_record_t *pfirm;
+#endif
eu_enters (DBG_UTILS);
@@ -91,6 +105,47 @@
goto byebye;
}
+#ifdef EXTERN_FW
+if ( IS_EAGLE_I (pid) )
+ {
+ fw_name = "eagleI.fw";
+ }
+ else if ( !IS_EAGLE_III (pid) )
+ {
+ fw_name = "eagleII.fw";
+ }
+ else
+ {
+ fw_name = "eagleIII.fw";
+ }
+
+ ret = request_firmware(&fw_entry, fw_name, &ins->usbdev->dev);
+ if(ret)
+ {
+ eu_err ("%s : Firmware not available\n", fw_name);
+ 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 +174,7 @@
}
pfirm ++;
}
+#endif
/*
* De-assert reset