--- bcm2035-tool/bcm2035-tool.c	2007/05/07 12:48:06	2000
+++ bcm2035-tool/bcm2035-tool.c	2007/05/07 12:55:47	2001
@@ -1,6 +1,8 @@
-/* bcm2035-tool - bcm2035 tool for Motorola EZX phones
+/* bcm2035-tool
  *
  * (C) 2007 by Daniel Ribeiro <drwyrm@gmail.com>
+ * 
+ *  MAC address as argument extension by: Jan Herman <2hp@seznam.cz>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 
@@ -17,10 +19,10 @@
  *
  */
 
+/* Default MAC address */
+#define BDADDR "\x06\x05\x04\x03\x02\x01"
 
 //#define PATCH_FIRMWARE
-#define BDADDR "\xab\x89\x67\x45\x23\x01"
-
 
 #include <stdio.h>
 #include <string.h>
@@ -33,6 +35,7 @@
 #include <sys/ioctl.h>
 #include <termios.h>
 #include "bcm2035-tool.h"
+//#include "bluetooth.h"
 
 #ifdef PATCH_FIRMWARE
 #include "motorola_patches.h"
@@ -180,18 +183,51 @@
 
 }
 
+void mac2hex(const char *mac, u_char *dst)
+{
+	
+     int i;
+     long l;
+     char *pp;
+ 
+     while (isspace(*mac))
+         mac++;
+ 
+     /* expect 6 hex octets separated by ':' or space/NUL if last octet */
+     for (i = 0; i < 6; i++) {
+         l = strtol(mac, &pp, 16);
+         if (pp == mac || l > 0xFF || l < 0)
+             return;
+         if (!(*pp == ':' || (i == 5 && (isspace(*pp) || *pp == '\0'))))
+             return;
+		 /* 5-i swaps hex chars */
+		 dst[5-i] = (u_char) l;
+         mac = pp + 1;
+     }
+ }
+
+char bdaddr[6];
+ 
 int main(int argc, char **argv)
 {
 	int fd, i;
 	struct termios term;
 	char buf[1024];
-	char bdaddr[6];
-
-	if (argc < 2) {
-		printf("use: %s <device>\n", argv[0]);
+	
+	if (argc < 3) {
+		printf("BCM2035 Tool:\n");
+		printf("Usage: %s <device> <bdaddr>\n", argv[0]);
 		exit(1);
 	}
 
+	if (strlen(argv[2]) < 17) {
+		printf("invalid argument %s!\n", argv[2]);
+		exit(1);
+	}
+	
+	/* Converts MAC address to swapped HEX */
+	mac2hex(argv[2], bdaddr);
+	
 	fd = open (argv[1], O_RDWR | O_NOCTTY );
 
 	if(fd < 0) exit(-1);
@@ -212,7 +248,7 @@
 #endif
 	set_baud(fd, 460800);
 	
-	send_cmd(fd, CMD_SET_BDADDR, BDADDR, 6);
+	send_cmd(fd, CMD_SET_BDADDR, bdaddr, 6);
 
         i = N_HCI;
         if (ioctl(fd, TIOCSETD, &i) < 0) {
@@ -228,5 +264,3 @@
         while (1) sleep(999999999);
         return 0;
 }
-
-