Recharging and reusing Acer laptop batteries on DIY projects with arduino

Selezione_078

It’s not unusual to end up with dead laptops whose battery is still useable for some other projects, the most usual practice, is to dismantle them to recover 18650 cells, but then you will have some prolems with integrating them on your project, the first one is avoiding stuff to catch fire or blow up and the second one is that you have no way to reliably tell how much % of charge is left on these batteries, and their real capacity ( capacity decreases with time and usage ).

These batteries in most cases are connected to an I2C/SMBus of the laptop and they use the Smart Battery protocol, which is a standard of most advanced battery powered systems, especially laptops.

The hardest part normally is to find the pinout of these batteries, but since Acer easily leaks complete motherboard schematics, it has not been hard to find these pinouts.

For now i’ve worked with a AL10B31 battery and a AS07B41 battery, they have different pinout, but both can be found on the respective schematics of the Quanta ZE6 and Quanta ZO3. One important thing to be careful about is that once you are using the connector from the motherboard outside the laptop, it’s easy to insert it reversed by accident and cause serious damage both to the arduino and to the battery itself.

Charging the battery and using it

The AL10B31 and AS07B41 batteries are both 11.1V , that means that there are 3 cells in series, so to charge them you have to use a CC-CV power supply with 12.6V ( 4.2*3 ) and at most 1.5-2 amperes.
The battery of the Acer Aspire One ( Quanta ZE6 ) has an additional safety measure that will prevent you from charging it by just applying 12.6V on it’s + and – terminals.
There’s the pin 3 that has to be connected to ground with a 1KOhm resistor to enable the battery.
Quanta ZE6 battery connector
Even if in the above schematic it says “short”, i’ve used 1KOhm resistor because that’s the resistance i’ve measured on the netbook’s motherboard between this pin and ground.
The AS07B41 that has same pinout of the AS07A(31/32/41) used by Quanta ZO3 but reversed and it does not have any safety measure that remove power from it’s + and – pins if not connected to the laptop, so if you just want to charge it you are ready to go with 12.6V CC-CV and at most 2 amperes
Quanta ZO3 battery connector

Connecting to and monitoring the battery with an arduino

SMbus and I2C are physically compatible with each other, so like in the laptops i2c devices and battery share same bus, you can use the battery almost like and i2c device.
The only problem is that arduino Wire library does not give you much control over speed and start/stop, so, you will have to use a software i2c library.
The one i’ve used is http://playground.arduino.cc/Main/SoftwareI2CLibrary , this library allows both setting speed and having control on i2c start and stop.
Before including the .h of the library ( if you are too lazy to put the library in a folder, like me , you can just paste the contents on you sketch ), you have to define which pins to use for software I2C.

#define SDA_PIN 3 
#define SDA_PORT PORTD 
#define SCL_PIN 2
#define SCL_PORT PORTD
#define I2C_SLOWMODE 1
On the arduino mega 2560 these are pins 19 for SCL ( MBCLK ) and pin 18 for SDA ( MBDATA ) .
If you are using another type of arduino or you want to use different pins use https://spreadsheets.google.com/pub?key=rtHw_R6eVL140KS9_G8GPkA&gid=0 to find out what AVR port and pin number to use on the #define
You have also to define I2C_SLOWMODE in the case you have problems with communicating to the battery.
I’m using that sketch to read values from the battery:
LiquidCrystal lcd(12,11,50,51,52,53);
byte deviceAddress = 11;
#define VOLTAGE 0x09
#define TEMPERATURE 0x08
#define CURRENT 0x0a
#define CAPACITY 0x10
#define TIME_TO_FULL 0x13
#define CHARGE 0x0d
void setup()
{
  lcd.begin(16,2);
  //pinMode(22,INPUT_PULLUP);
  //pinMode(23,INPUT_PULLUP);
  
  Serial.begin(115200);  // start serial for output
  Serial.println(i2c_init());
  //pinMode(22,INPUT_PULLUP);
  //pinMode(23,INPUT_PULLUP);
  
  scan();
}
 int fetchWord(byte func)
{
  i2c_start(deviceAddress<<1 | I2C_WRITE);
  i2c_write(func);
  i2c_rep_start(deviceAddress<<1 | I2C_READ);
  
  byte b1 = i2c_read(false);
  byte b2 = i2c_read(true);
  i2c_stop();
  return (int)b1|((( int)b2)<<8);
}
void scan()
{
  byte i = 0;
  for ( i= 0; i < 127; i++  )
  {
     Serial.print(“Address “);Serial.print(i);
    bool ack = i2c_start(i<<1 | I2C_WRITE);  
    if ( ack )
      Serial.println(“OK”);
    else
      Serial.println(“NO”);
    i2c_stop();
  }
}
void loop()
{
  int v = fetchWord(VOLTAGE);
  Serial.print(“Voltage: “);
  Serial.println(v);
  lcd.clear();
  lcd.print((float)v/1000.0);lcd.print(“V “);
  Serial.print(“Temp: “);
  unsigned int tempk = fetchWord(TEMPERATURE);
  float tempc = ((float)tempk)/10.0-273.15;
  lcd.print(tempc);
  lcd.print(“C”);
  lcd.setCursor(0,1);
  Serial.println(tempc);
  Serial.print(“Current (mA):” );
  int ma = fetchWord(CURRENT);
  lcd.print(ma);lcd.print(“mA “);
  Serial.println(ma);
  Serial.print(“Capacity (mAh):” );
  int mah = fetchWord(CAPACITY);
  Serial.println(mah);
  int ch = fetchWord(CHARGE);
  Serial.print(“Charge PCT: “);Serial.print(ch);
  lcd.print(ch);lcd.print(“% “);lcd.print(float(mah)/1000.0);lcd.print(“Ah”);
  Serial.print(” Minutes remaining for full charge: “);
  Serial.println(fetchWord(TIME_TO_FULL));
  delay(5000);
}
I’ve omitted the beginning because it’s just the software i2c library and some includes like LiquidCrystal.h .
Quanta ZE6 battery

Charging AS07B41

Charging AS07A(31,32,41) , Quanta ZO3

Charging AS07B31 ( Same pinout as AS07B41 )

On the hardware side instead, you have to connect the arduino ground to the battery ground ( BE VERY SURE IT IS THE BATTERY GROUND ) and SCL, SDA pins respectively to MBCLK and MBDATA pins.

You have also, as the master of the i2c bus provide the pullup, so you have to use 2 10K resistors connected between +5V and the SDA,SCL lines.
Once you enable the battery ( if required ) , you should be able to communicate with it using that code.
If you are interested on monitoring other parameters, like remaining time to 0%, design voltage , manufacture date , etc, you can see what is the ID to use here http://sbs-forum.org/specs/sbdat110.pdf
Finally, i remind to who is going to use these batteries, that they have high energy density, so they can start a fire or explode if mishandled.

Edit: I’ve discovered that sometimes reading are wrong, lowering I2C frequency solves that issue , to do that modify

#if I2C_SLOWMODE
#define I2C_DELAY_COUNTER (((I2C_CPUFREQ/25000L)/2-19)/3)
#else

to

#if I2C_SLOWMODE
#define I2C_DELAY_COUNTER (((I2C_CPUFREQ/15000L)/2-19)/3)
#else

Ricaricare una batteria di Acer Aspire One e monitorarne i parametri con arduino

Selezione_0781

Capita spesso di ritrovarsi delle batterie di portatili defunti, di cui non si sa cosa farne, la cosa più semplice è spaccarla e recuperarci le celle 18650, ma se poi ci si vuole realizzare qualche progetto, sorge subito il problema di come sapere quanta % di carica ha, il tempo di ricarica, e soprattutto avere un circuito di protezione che eviti esplosioni o eventi del genere.

La prima cosa fondamentale da sapere è che la quasi totalità di queste batterie utilizza SMBus ( Simile a I2C ) ed il protocollo Smart Battery, il quale è uno standard per monitorare i parametri delle batterie nei sistemi elettronici.

Nel nostro caso lavoreremo su una batteria AL10B31.
Fortunatamente del portatile di provenienza è stato possibile reperire lo schema elettrico e quindi avere il pinout della batteria

Ricarica e utilizzo della batteria

La prima cosa interessante è il pin 3, in questo schema è collegato direttamente a massa, ma sulla scheda madre associata alla batteria in mio possesso , invece ho visto che era presente 1kOhm fra questo pin e la massa, quindi ho provveduto a collegare tale resistenza fra il pin 3 e l’8.
È necessario prestare attenzione al fatto che una volta collegato questo pin a massa tramite la resistenza da 1K , è presente la tensione della batteria sui terminali , quindi bisogna evitare di creare cortocircuiti di qualsiasi genere , in quanto , si , probabilmente sono protette anche da corto queste batterie, ma se i cavi dovessero essere sottili invece di andare in protezione, possono ustionarvi le mani.

Per iniziare la ricarica, si possono applicare 12.6 volt fra il pin 8(-) e il pin 1(+) da un alimentatore con limitazione di corrente minore di 1.5-2 ampere.

Il fatto della limitazione di corrente e del voltaggio sono cose ESSENZIALI, pena nel peggior dei casi, incendi o esplosioni.

Collegamento con arduino

Per il collegamento con arduino le cose sono leggermente più complesse invece, ma completamente fattibili.
Per poter dialogare con SMBus, è necessario usare una libreria software per I2C reperibile qui http://playground.arduino.cc/Main/SoftwareI2CLibrary .
Una volta creato lo sketch arduino , prima di includere la libreria, è necessario impostare alcuni parametri
SDA_PIN , SDA_PORT , SCL_PIN , SCL_PORT
Nel mio caso utilizzando un arduino mega 2560, ho utilizzato

#define SDA_PIN 3 
#define SDA_PORT PORTD 
#define SCL_PIN 2
#define SCL_PORT PORTD
#define I2C_SLOWMODE 1
Questi parametri corrispondono all’utilizzare il pin 19 per SCL ed il pin 18 per SDA , nel caso si utilizzi un arduino diverso qui https://spreadsheets.google.com/pub?key=rtHw_R6eVL140KS9_G8GPkA&gid=0 è possibile consultare la mappatura delle porte AVR con i pin arduino.
Lo sketch che utilizzo per monitorare i parametri è il seguente
byte deviceAddress = 11;
#define VOLTAGE 0x09
#define TEMPERATURE 0x08
#define CURRENT 0x0a
#define CAPACITY 0x10
#define TIME_TO_FULL 0x13
#define CHARGE 0x0d
void setup()
{
  
  pinMode(22,INPUT_PULLUP);
  pinMode(23,INPUT_PULLUP);
  
  Serial.begin(115200);  // start serial for output
  Serial.println(i2c_init());
  pinMode(22,INPUT_PULLUP);
  pinMode(23,INPUT_PULLUP);
  
  scan();
}
unsigned int fetchWord(byte func)
{
  i2c_start(deviceAddress<<1 | I2C_WRITE);
  i2c_write(func);
  i2c_rep_start(deviceAddress<<1 | I2C_READ);
  
  byte b1 = i2c_read(false);
  byte b2 = i2c_read(true);
  i2c_stop();
  return (unsigned int)b1|(((unsigned int)b2)<<8);
}
void scan()
{
  byte i = 0;
  for ( i= 0; i < 127; i++  )
  {
     Serial.print(“Indirizzo “);Serial.print(i);
    bool ack = i2c_start(i<<1 | I2C_WRITE);  
    if ( ack )
      Serial.println(“OK”);
    else
      Serial.println(“NO”);
    i2c_stop();
  }
}
void loop()
{
  
  Serial.print(“Voltaggio: “);
  Serial.println(fetchWord(VOLTAGE));
  Serial.print(“Temperatura: “);
  unsigned int tempk = fetchWord(TEMPERATURE);
  float tempc = ((float)tempk)/10.0-273.15;
  Serial.println(tempc);
  Serial.print(“Corrente (mA):” );
  Serial.println(fetchWord(CURRENT));
  Serial.print(“Capacità (mAh):” );
  Serial.println(fetchWord(CAPACITY));
  Serial.print(“Carica: “);Serial.print(fetchWord(CHARGE));
  Serial.print(” Minuti rimanenti alla carica completa: “);
  Serial.println(fetchWord(TIME_TO_FULL));
  delay(5000);
}
Questo sketch all’avvio fa una scansione del bus per trovare le periferiche e poi di default si collega alla batteria che si trova all’indirizzo 0x11.

A livello hardware, per eseguire il collegamento, è necessario collegare 2 resistenze di pullup da 10K  verso +5v sui pin SCL e SDA e collegare MBDATA e MBCLK rispettivamente con SDA ed SCL su arduino.

Per poter monitorare altri parametri, è possibile consultare la documentazione di smart battery all’indirizzo http://sbs-forum.org/specs/sbdat110.pdf

Ricordo di evitare di caricare batterie al litio in modo sperimentale senza essere presenti durante la carica.

Routing da, alla rete di provenienza con Linux

Molto spesso può capitare di voler fare il forwarding dalla LAN alla LAN, ovvero avere un router che accetta i pacchetti in ingresso, e li reimmette sulla stessa rete magari eseguendoci sopra il load balancing o traffic shaping, ad esempio potrei avere una lan composta da un router alice, un router fastweb ed un server su cui ho a disposizione una sola interfaccia ethernet, ad occhio un sistemista non smanettone vi direbbe subito che dovete mettere altre 2 interfacce di rete sul server o non si può fare, FALSO.

Ora tralasciando la parte di traffic shaping e network balancing che è adeguatamente documentata altrove, vediamo come è possibile la cosa a livello teorico

Prendiamo in esempio la rete 192.168.0.0/24
Mettiamo che il server dove volete fare routing sia configurato per avere gateway predefinito 192.168.0.1 (Il router alice ) e che il server abbia indirizzo 192.168.0.2, teoricamente se io da una macchina con configurato gatweay 192.168.0.2, invio un pacchetto che ha come indirizzo di destinazione ad esempio 8.8.4.4 e come mac address di destinazione quello del server 192.168.0.2, il server lo riceverà, gli cambia di nuovo mac address di destinazione con quello del suo gateway e lo rispedisce in LAN di nuovo.
Se proviamo a farlo praticamente ci accorgiamo di una cosa però…

[email protected] ~ $ ping 8.8.4.4
PING 8.8.4.4 (8.8.4.4) 56(84) bytes of data.
64 bytes from 8.8.4.4: icmp_seq=1 ttl=46 time=99.5 ms
From 192.168.0.2: icmp_seq=2 Redirect Host(New nexthop: 192.168.0.1)
From 192.168.0.2 icmp_seq=2 Redirect Host64 bytes from 8.8.4.4: icmp_seq=2 ttl=46 time=71.9 ms
64 bytes from 8.8.4.4: icmp_seq=3 ttl=46 time=115 ms

Quello che sta succedendo in pratica è che il server sta dicendo al client che deve contattare direttamente 192.168.0.1 invece di lui, e questa cosa non va assolutamente bene perché se andiamo a fare un traceroute ci accorgiamo che il nostro server che dovrebbe fare traffic shaping oppure load balancing è stato bypassato, il traceroute partirà direttamente dal router di alice.

Questo problema si risolve disabilitando l’invio di pacchetti ICMP Redirect Host, utilizzando
sysctl -w net.ipv4.conf.all.send_redirects=0
E per ogni interfaccia
sysctl -w net.ipv4.conf.INTERFACCIA.send_redirects=0

http://www.cisco.com/en/US/tech/tk365/technologies_tech_note09186a0080094702.shtml Qui è documentato l’utilizzo del pacchetto ICMP Redirect in modo dettagliato

Una volta risolto questo problema al quale non sempre è scontata la soluzione dato che sono pochi ad avere setup funzionanti del genere, il resto della configurazione è praticamente uguale ad un normale routing, ovviamente quando si lavora sulle regole iptables , essendo l’interfaccia di ingresso ed uscita la stessa , si deve lavorare sugli indirizzi per distinguere i pacchetti

Hacking dei router che utilizzano ROMPager completamente da remoto

Gran parte dei router TP-Link,ZyXel,Huawei ed alcuni linksys sono soggetti ad una vulnerabilità che permette di ottenere la password di amministratore DA REMOTO , lo script allegato permette, passandogli l’ip del router come parametro di tirare fuori la password instantaneamente

Le nazioni che principalmente hanno questi router vulnerabili sono Romania, Algeria, Egitto, Colombia, Brasile, Albania.
Per favore comunque evitate di farci danni con questo script, è un exploit vecchio di circa 1 anno e mezzo che trovai in seguito ad un attacco DDoS subito su un server privato di world of warcraft , e che nonostante abbia segnalato agli ISP è stato del tutto ignorato.
Lo posto solo ora perché ho visto che ci ha già pensato un altro a scoperchiare il vaso di pandora , solo che ha fatto il furbo , ed ha nascosto tutta la parte per decodificare il file rom-0 che io includo invece qui

La sicurezza dell’ISP WiMax che utilizzo

Scrivo questo post, perché oggi è successo un evento che ha del ridicolo diciamo.
Ero connesso ad Azzurra.org ( Network IRC , se non sapete cosa sia è inutile andare avanti nella lettura ) e stavo giocando a No more room in hell , con la linea Alice ADSL, e vedo che inizio ad avere ping che superano i 200 ms abbondantemente.
Così ho pensato di switchare questo pc da dove stavo giocando verso il router che punta sul WiMax, e fin qui tutto bene a livello di gioco i ping sono calati, ma ho notato un simpatico messaggio su IRC

* *** Notice — This server runs an open proxy monitor to prevent abuse.
* *** Notice — If you see various connections from proxy-check.azzurra.org or 85.94.194.111
* *** Notice — please disregard them, as they are the detector in action.
* *** Notice — For more information please visit http://www.azzurra.org/kline.php?mod=socks-proxy
* *** Notice — Your connection is restricted! For more information please visit http://www.azzurra.org/restrict.html

In pratica mi dice che sono stato buttato fuori perché ho un proxy socks aperto !!!

Allora visto ciò ho fatto un nmap dalla linea alice , verso l’indirizzo pubblico della linea wimax ( AriaDSL )…
Quello che ne esce fuori ha dell’incredibile

21/tcp   open     ftp            GNU Inetutils FTPd 1.4.1
22/tcp   open     ssh            Dropbear sshd 0.52 (protocol 2.0)
| ssh-hostkey: 1024 74:7b:6e:f4:b0:fd:3f:83:fe:60:62:d4:2c:38:e6:9a (DSA)
|_1040 3d:f3:00:97:78:b4:b0:2b:ee:e7:69:87:39:44:00:b3 (RSA)
80/tcp   open     http?
|_http-title: Wimax CPE Configuration
81/tcp   filtered hosts2-ns
443/tcp  open     ssl/https?
|_sslv2: server still supports SSLv2
|_http-title: Wimax CPE Configuration
| ssl-cert: Subject: commonName=MatrixSSL Sample Server Cert/organizationName=PeerSec Networks/stateOrProvinceName=WA/countryName=US
| Not valid before: 2006-03-13 08:13:34
|_Not valid after:  2007-03-13 08:13:34
2500/tcp filtered rtsserv
2601/tcp open     zebra          Quagga routing software
6789/tcp open     ibm-db2-admin?
9999/tcp open     abyss?

A parte la porta 81 che l’ho aperta io per dare accesso ad una cartella dropbox ad un’altra persona senza ricorrere a dropbox , le altre al di fuori della 80 e della 443 neppure sapevo fossero aperte.

In pratica su questo accrocco che mi hanno dato c’è sulla WAN
Un server FTP ( A che cazzo serve??? )
Un server SSH attivo ( Vedere sopra )
L’interfaccia web ( meglio non commentare )
Un’altra interfaccia web che non so a che cavolo serva
Zebra ( Che minchia ci sta a fare su una CPE? , e soprattutto sulla WAN? )
La 6789 e la 9999 poi boh , non so neanche cosa siano , ho provato a connettermi con telnet ma non danno nessun output
Ora la cosa bella viene sull’interfaccia web, ebbene si perché questi “poco svegli” per non andare su offese pesanti, cosa hanno fatto…
Hanno dato alla gente questi CPE con nome utente e password di default admin/admin CON L’INTERFACCIA WEB APERTA SULLA WAN , Geniale vero?
E non solo quella , quella combinazione admin-admin funziona anche sull’SSH, ed inoltre anche la rete wireless di questo accrocco è di default senza password , e nessun analfabeta informatico nella media italiana si sognerebbe di cambiare password ovviamente.
Avete capito bene quindi, nome utente e password di default admin/admin CON L’INTERFACCIA WEB APERTA SULLA WAN

Il loro spazio di indirizzi IPV4 è 159.20.176.0/21 , fategli quello che vi pare o dateli a chi vi pare, così forse capiscono che hanno dei leggerissimi problemi di sicurezza, io glie l’ho detto diverse volte che non voglio quell’interfaccia web del cazzo aperta sulla WAN e che è vulnerabile, gli ho fatto vedere in diretta ad un loro installatore mentre entravo da remoto sul suo CPE,  ma non mi ascoltano.

Io ho cambiato password , se poi riesce qualcuno ad entrarmi lo stesso sticavoli, tanto fra la mia rete e quello schifo ci ho messo un altro router che non ha falle del genere.

Aggiunta delle  22:47 , dimenticavo
AriaDSL inoltre fornisce apparati in completa violazione della licenza GPL in quanto sul loro sito , ne tantomeno su quella della Huawei sembra possibile scaricare i sorgenti dei software opensource utilizzati nei loro CPE , tra cui di sicuro Linux , quagga , e GNU Inetutils

Hotspot senza cifratura e smartphone? Brutta accoppiata per la privacy

Torno di nuovo a scrivere per i problemi riguardanti la privacy con gli smartphone, perché si aggiunge, oltre al noto problema della scansione attiva e quindi dell’invio di probe diretti ad access point, anche un altro problema più grave originante da Whatsapp e Facebook, in pratica con tecniche di livello veramente base è possibile conoscere il numero di cellulare di chi è connesso all’hotspot, e dal numero di cellulare conoscere in una buona parte di casi, il profilo facebook.
Tutto ciò funziona in quanto Whatsapp, ogni volta che si riconnette invia un pacchetto contente la stringa “WAUTH-2”, il quale contiene il numero di telefono completamente in chiaro, avete letto bene, COMPLETAMENTE IN CHIARO.
È sufficiente quindi mettere una banale interfaccia wireless in modalità monitor sul canale dell’access point ed aspettare che qualcuno apra l’applicazione whatsapp sul proprio cellulare.
Non appena lo farà, è possibile estrapolare dal pacchetto il numero di telefono, in modo banale, e con questo, utilizzando la pagina https://www.facebook.com/search.php?q=numero , nel 50% dei casi o anche più si riesce a risalire a nome e cognome e profilo facebook.
Quindi lo stato attuale delle cose è che, semplicemente con un attacco di tipo passivo ( niente man in the middle o simili ), è possibile ottenere

Numero di cellulare
Modello di cellulare
Nome e cognome
Profilo facebook
Posti più frequentati
Indirizzo di casa approssimato( successivamente raffinabile una volta nel raggio dell’access point )
Associazione mac address – persona , che quindi porta al tracciamento del resto del traffico

Forum: http://linuxehacking.info/viewtopic.php?f=7&t=2 (Sorgenti dello sniffer inclusi )

Recuperare un’interfaccia Ralink a 5 Ghz con EEPROM danneggiata senza riprogrammare il chip

Molti mesi fa , mi si danneggiò la EEPROM della mia ALFA dual-band, la situazione inizialmente sembrava tragica, la periferica non veniva neanche più riconosciuta ( i descrittori usb contenuti nella eeprom erano danneggiati ).
La eeprom di questa periferica difatti , nonostante tramite USB sia possibile leggerne i primi 0x110 byte , in realtà è da 0x400 byte ed all’indirizzo 0x200 inizia la parte dei descrittori USB la quale è utilizzata dal chipset.
Una volta dissaldata la eeprom si può notare che l’interfaccia wireless funziona di nuovo, però le funzionalità dual-band non ci sono più, ed anche il mac address è danneggiato.
Dato che i tentativi che ho fatto di sostituire la eeprom , un po’ per sfortuna , un po’ per la mia poca esperienza a lavorare in SMD sono andati male , ho tentato di modificare il driver, in modo che nel caso il chip id della eeprom sia 0xffff ( ovvero quando il chip non è presente ) , vada a caricare un file in /lib/firmware in modo da riconoscere correttamente l’id del chip RF ed altri parametri ( tipo le antenne da utilizzare )

Ho modificato il file rt2800usb.c del driver rt2x00 , modificando la funzione rt2800usb_read_eeprom nel seguente modo

static int rt2800usb_read_eeprom(struct rt2x00_dev *rt2x00dev)
{
int retval;
    mm_segment_t fs;
    struct file *f;
if (rt2800_efuse_detect(rt2x00dev))
retval = rt2800_read_eeprom_efuse(rt2x00dev);
else
{
  
retval = rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom,
      EEPROM_SIZE);
        if ( rt2x00dev->eeprom[0] == 0xffff ) //No eeprom chip
        {
            printk(“rt2800usb: connected device has broken/missing eeprom chipn”);
            f = filp_open(“/lib/firmware/rt2800usb_eeprom.bin”, O_RDONLY, 0);
            if ( IS_ERR(f) )
            {
                printk(“rt2800usb: Cannot load eeprom from /lib/firmware/rt2800usb_eeprom.binn”);
                return -1;
            }
            fs = get_fs();
            set_fs(get_ds());
            f->f_op->read(f,(char*)rt2x00dev->eeprom,EEPROM_SIZE,&f->f_pos);
            set_fs(fs);
  
            filp_close(f,NULL);
            printk(“rt2800usb: Loaded eeprom overriden”);
        }
     }

return retval;
}

In questo modo il driver al collegamento di una periferica rt2800usb andrà a cercare un file in /lib/firmware/rt2800usb_eeprom.bin contenente la EEPROM da utilizzare.
Purtroppo ci sono delle limitazioni, ad esempio non si possono usare più ralink 2800usb con eeprom danneggiata nello stesso sistema.

Allego di seguito la eeprom della mia ALFA , dovete assolutamente modificare il mac address con il vostro , oppure metterne uno casuale ( è consigliabile lasciare inalterati i primi 3 byte )

0000:0000 | 70 27  04 01  00 C0  CA 32 | p’…ÀÊ2
0000:0008 | B7 FE  FF FF  FF FF  FF FF | ·Dÿÿÿÿÿÿ
0000:0010 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0018 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0020 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0028 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0030 | FF FF  FF FF  12 04  20 00 | ÿÿÿÿ.. .
0000:0038 | FF FF  15 01  FF FF  FF FF | ÿÿ..ÿÿÿÿ
0000:0040 | FF FF  FF FF  09 04  00 00 | ÿÿÿÿ….
0000:0048 | 00 04  00 00  00 03  FF FF | ……ÿÿ
0000:0050 | FF FF  02 02  02 02  02 03 | ÿÿ……
0000:0058 | 03 03  03 03  03 03  03 03 | ……..
0000:0060 | 00 00  00 00  00 00  00 00 | ……..
0000:0068 | 00 00  00 00  00 00  FF FF | ……ÿÿ
0000:0070 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0078 | 06 06  06 06  06 06  06 06 | ……..
0000:0080 | 06 06  06 06  05 05  05 05 | ……..
0000:0088 | 05 05  05 05  05 05  06 06 | ……..
0000:0090 | 06 06  06 06  06 06  06 06 | ……..
0000:0098 | 06 06  07 FF  FF FF  FF FF | …ÿÿÿÿÿ
0000:00A0 | FF FF  FF FF  FF FF  00 00 | ÿÿÿÿÿÿ..
0000:00A8 | 00 00  00 00  00 00  00 00 | ……..
0000:00B0 | 00 00  00 00  00 00  00 00 | ……..
0000:00B8 | 00 00  00 00  00 00  00 00 | ……..
0000:00C0 | 00 00  00 00  00 00  00 00 | ……..
0000:00C8 | 00 FF  FF FF  FF FF  FF FF | .ÿÿÿÿÿÿÿ
0000:00D0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:00D8 | FF FF  FF FF  FF FF  88 88 | ÿÿÿÿÿÿ..
0000:00E0 | 99 AA  88 66  AA AA  88 66 | .ª.fªª.f
0000:00E8 | AA AA  88 66  AA AA  88 66 | ªª.fªª.f
0000:00F0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:00F8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0100 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0108 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0110 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0118 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0120 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0128 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0130 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0138 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0140 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0148 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0150 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0158 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0160 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0168 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0170 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0178 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0180 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0188 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0190 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0198 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01A0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01A8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01B0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01B8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01C0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01C8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01D0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01D8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01E0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01E8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01F0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01F8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0200 | 12 01  00 02  00 00  00 40 | ……[email protected]
0000:0208 | 8F 14  70 27  01 01  01 02 | ..p’….
0000:0210 | 03 01  0A 06  00 02  00 00 | ……..
0000:0218 | 00 40  01 00  09 02  35 00 | [email protected]….5.
0000:0220 | 01 01  00 80  E1 09  04 00 | ….á…
0000:0228 | 00 07  FF FF  FF 05  07 05 | ..ÿÿÿ…
0000:0230 | 81 02  00 02  00 07  05 01 | ……..
0000:0238 | 02 00  02 00  07 05  02 02 | ……..
0000:0240 | 00 02  00 07  05 03  02 00 | ……..
0000:0248 | 02 00  07 05  04 02  00 02 | ……..
0000:0250 | 00 07  05 05  02 00  02 00 | ……..
0000:0258 | 07 05  06 02  00 02  00 B8 | …….¸
0000:0260 | 11 7D  08 0D  00 00  00 00 | .}……
0000:0268 | 54 69  7A 69  61 6E  6F 42 | TizianoB
0000:0270 | 61 63  6F 63  63 6F  48 41 | acoccoHA
0000:0278 | 43 4B  20 20  00 00  00 00 | CK  ….
0000:0280 | 12 01  00 02  00 00  00 40 | ……[email protected]
0000:0288 | 8F 14  70 28  01 00  06 07 | ..p(….
0000:0290 | 08 01  0A 06  00 02  00 00 | ……..
0000:0298 | 00 40  01 00  09 02  20 00 | [email protected]…. .
0000:02A0 | 01 01  00 80  E1 09  04 00 | ….á…
0000:02A8 | 00 02  08 06  50 0A  07 05 | ….P…
0000:02B0 | 81 02  00 02  00 07  05 01 | ……..
0000:02B8 | 02 00  02 00  00 00  00 00 | ……..
0000:02C0 | 00 00  00 00  00 00  00 00 | ……..
0000:02C8 | 00 00  00 00  00 00  00 00 | ……..
0000:02D0 | 00 00  00 00  00 00  00 00 | ……..
0000:02D8 | 00 00  00 00  00 00  00 00 | ……..
0000:02E0 | 00 00  3F 00  00 00  00 00 | ..?…..
0000:02E8 | 00 00  00 00  00 00  00 00 | ……..
0000:02F0 | 00 60  70 A2  FF A2  60 70 | .p¢ÿ¢p
0000:02F8 | A2 FF  A2 FF  FF FF  FF FF | ¢ÿ¢ÿÿÿÿÿ
0000:0300 | 04 03  09 04  00 00  00 00 | ……..
0000:0308 | 00 00  00 00  00 00  00 00 | ……..
0000:0310 | 00 00  00 00  00 00  00 00 | ……..
0000:0318 | 00 00  00 00  00 00  00 00 | ……..
0000:0320 | 00 00  00 00  00 00  00 00 | ……..
0000:0328 | 00 00  00 00  00 00  00 00 | ……..
0000:0330 | 00 00  00 00  00 00  00 00 | ……..
0000:0338 | 00 00  00 00  00 00  00 00 | ……..
0000:0340 | 00 00  00 00  00 00  00 00 | ……..
0000:0348 | 00 00  00 00  00 00  00 00 | ……..
0000:0350 | 00 00  00 00  00 00  00 00 | ……..
0000:0358 | 00 00  00 00  00 00  00 00 | ……..
0000:0360 | 0E 03  52 00  61 00  6C 00 | ..R.a.l.
0000:0368 | 69 00  6E 00  6B 00  00 00 | i.n.k…
0000:0370 | 1E 03  38 00  30 00  32 00 | ..8.0.2.
0000:0378 | 2E 00  31 00  31 00  20 00 | ..1.1. .
0000:0380 | 6E 00  20 00  57 00  4C 00 | n. .W.L.
0000:0388 | 41 00  4E 00  00 00  00 00 | A.N…..
0000:0390 | 04 03  09 04  00 00  00 00 | ……..
0000:0398 | 00 00  00 00  00 00  00 00 | ……..
0000:03A0 | 00 00  08 03  31 00  2E 00 | ….1…
0000:03A8 | 30 00  00 00  00 00  00 00 | 0…….
0000:03B0 | 00 00  00 00  00 00  00 00 | ……..
0000:03B8 | 00 00  00 00  00 00  00 00 | ……..
0000:03C0 | 00 00  00 00  00 00  00 00 | ……..
0000:03C8 | 00 00  00 00  00 00  00 00 | ……..
0000:03D0 | 00 00  00 00  00 00  00 00 | ……..
0000:03D8 | 00 00  00 00  00 00  00 00 | ……..
0000:03E0 | 00 00  00 00  00 00  00 00 | ……..
0000:03E8 | 00 00  00 00  00 00  00 00 | ……..
0000:03F0 | 00 00  00 00  00 00  00 00 | ……..

0000:03F8 | 00 00  00 00  00 00  00 00 | ……..

[FISICA] Produrre raggi X in casa senza ricorrere a componenti costosi

xra5

Introduzione

Quello che illustrerò di seguito è come produrre raggi X in casa utilizzando componenti facilmente reperibili, tuttavia i raggi X prodotti, non sono assolutamente sufficienti per fare una lastra, è utile questo esperimento solo per fini didattici.

Pericoli

I raggi X, in modo simile ai raggi ultravioletti nelle ore di punta, possono creare ustioni o nel peggior dei casi tumori, la differenza sostanziale è che i raggi X spesso vanno più in profondità , quindi le eventuali ustioni sono molto più gravi.
Utilizzando una valvola termoionica con accoppiamento capacitivo sul catodo, è difficile produrre dosi pericolose, tuttavia è altamente consigliabile non trovarsi nella stanza quando l’apparecchiatura è attiva.

Funzionamento

Per produrre i raggi X è necessario ottenere una collisione di elettroni sufficientemente accelerati su un bersaglio metallico.
Gli elettroni possono essere facilmente accelerati da una differenza di potenziale applicata ai 2 estremi di una valvola termoionica.
Viene usata una valvola termoionica, perché è il tubo con vuoto spinto più facilmente reperibile e più economico.
Nella figura in alto:
1: Valvola termoionica
2: Sonda Beta+Gamma del contatore geiger SV-500 schermata e collegata a terra
3:Webcam USB con ottica rimossa, anche essa schermata e collegata a terra
Il cavo rosa è il catodo, ed è collegato tramite un pezzo di carta stagnola sulla parte superiore della valvola, in questo modo gli elettroni provenienti dal catodo andranno a collidere sui vari elementi metallici della valvola collegati all’anodo e quindi produrranno raggi X
1: Trasformatore di riga TV 
2: Trasformatore avvolto su nucleo di un altro trasformatore di riga , serve ad alzare il voltaggio dell’inverter ZVS
3:Condensatore necessario a limitare la corrente per evitare di rompere il vetro del tubo termoionico
4:Driver ZVS di Mazzilli
5: Collegamento a terra
Lo scopo di questo circuito è di fornire una tensione di almeno 50-60000 volt per accelerare sufficientemente gli elettroni all’interno del tubo
È inutile riportare il numero di giri dei vari avvolgimenti in quanto andranno trovati in ogni caso sperimentalmente.
Questo è quanto basta per produrre raggi X, per verificare che vengano prodotti viene usato un contatore geiger con una sonda sensibile ai raggi beta la quale deve essere assolutamente schermata e collegata a terra.
Una volta realizzato questo esperimento si possono condurre vari esperimenti come ad esempio testare la penetrazione dei raggi X nei vari materiali, oppure sperimentare con altri tipi di rivelatori come ho fatto io, provando con il CCD di una webcam.
Nel mio canale youtube ( http://youtube.com/lo9765 ) ho caricato un video dove viene mostrato il tutto in funzione e a breve ne verrà caricato un altro dove viene mostrato l’uso del sensore CCD come rivelatore di radiazioni.
Anche nel video già presente alla terza volta che alimento il tutto è possibile notare in alto a destra un puntino bianco su un fotogramma il quale indica che un fotone di raggi X ha colpito il sensore CCD del cellulare.

How To: Emulatore DVD-ROM Hardware USB

Cosa è un emulatore DVD-ROM hardware

Un emulatore DVD-ROM hardware è un dispositivo che svolge un compito simile a quello di programmi come Daemon Tools o un device loop su linux, ma lo svolge presentandosi come un vero e proprio drive USB dvd-rom.
Le potenzialità di ciò sono che non può essere beccato dai DRM dei videogiochi e permette di fare il boot dal BIOS di qualsiasi ISO senza usare programmi come unetbootin.

Occorrente

  • BeagleBone Black
  • Una o più macchine con Linux possibilmente decenti ( se si intende ricompilare da se il driver )
  • Un minimo di praticità nell’uso di Linux, e nella compilazione di kernel/drivers

La beagleboneblack esce attualmente con Linux 3.8.13 , per utilizzarla in questo modo, onde evitare problemi con BIOS poco tolleranti, va eliminato il driver g_multi.ko

Una volta eliminato quel driver e riavviata la board è possibile scaricare il driver per il kernel precompilato della beaglebone qui g_mass_storage.ko .
Per utilizzare il driver è sufficiente eseguire il comando come root:
#insmod g_mass_storage.ko file=/percorsoimmagineiso cdrom=1 ro=1
Una volta eseguito il comando dopo pochi secondi dovrebbe comparire sul PC al quale è collegata la beaglebone un lettore DVD con dentro il “dischetto”

Kernel non standard e sorgenti delle modifiche

Per poter utilizzare immagini ISO > 2.4 GB ho dovuto applicare delle modifiche al driver del gadget mass storage che riporto di seguito:
commit f6037e02d14c57531efc14074aa59b0054227f8c
Author: Tiziano Bacocco <[email protected]>
Date:   Fri Jul 12 13:04:43 2013 +0200
    DVD-ROM Patch
diff –git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c
index 5d027b3..cb87b4a 100644
— a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -1192,6 +1192,7 @@ static int do_read_capacity(struct fsg_common *common, struct fsg_buffhd *bh)
  return -EINVAL;
  }
 
+ printk(“readcap: %ldn”,curlun->num_sectors-1);
  put_unaligned_be32(curlun->num_sectors – 1, &buf[0]);
  /* Max logical block */
  put_unaligned_be32(curlun->blksize, &buf[4]);/* Block length */
@@ -1220,6 +1221,63 @@ static int do_read_header(struct fsg_common *common, struct fsg_buffhd *bh)
  return 8;
 }
 
+static int do_read_disc_information(struct fsg_common* common, struct fsg_buffhd * bh)
+{
+ struct fsg_lun *curlun = common->curlun;
+ if (common->cmnd[1] & ~0x02) { /* Mask away MSF */
+ curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
+ return -EINVAL;
+ }
+ u8* outbuf = (u8*)bh->buf;
+ memset(outbuf,0,34);
+ outbuf[1] = 32;
+ outbuf[2] = 0xe; /* last session complete, disc finalized */
+ outbuf[3] = 1;   /* first track on disc */
+ outbuf[4] = 1;   /* # of sessions */
+ outbuf[5] = 1;   /* first track of last session */
+ outbuf[6] = 1;   /* last track of last session */
+ outbuf[7] = 0x20; /* unrestricted use */
+ outbuf[8] = 0x00; /* CD-ROM or DVD-ROM */
+ return 34;
+}
+
+static int do_get_configuration(struct fsg_common *common, struct fsg_buffhd *bh)
+{
+ struct fsg_lun *curlun = common->curlun;
+ if (common->cmnd[1] & ~0x02) { /* Mask away MSF */
+ curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
+ return -EINVAL;
+ }
+ u8* buf = (u8*)bh->buf;
+ int cur;
+ if ( curlun->num_sectors > CD_MAX_SECTORS )
+ {
+ printk(“Is dvdn”);
+ cur = MMC_PROFILE_DVD_ROM;
+ }
+ else
+ cur = MMC_PROFILE_CD_ROM;
+ memset(buf,0,40);
+ put_unaligned_be32(36,&buf[0]);
+ put_unaligned_be16(cur,&buf[6]);
+ buf[10] = 0x03;
+ buf[11] = 8;
+ put_unaligned_be16(MMC_PROFILE_DVD_ROM,&buf[12]);
+ buf[14] = ( cur == MMC_PROFILE_DVD_ROM );
+ put_unaligned_be16(MMC_PROFILE_CD_ROM,&buf[16]);
+ buf[18] = ( cur == MMC_PROFILE_CD_ROM );
+ put_unaligned_be16(1,&buf[20]);
+ buf[22] = 0x08 | 0x03;
+ buf[23] = 8;
+ put_unaligned_be32(1,&buf[24]);
+ buf[28] = 1;
+ put_unaligned_be16(3,&buf[32]);
+ buf[34] = 0x08 | 0x3;
+ buf[35] = 4;
+ buf[36] = 0x39;
+ return 40;
+}
+
 static int do_read_toc(struct fsg_common *common, struct fsg_buffhd *bh)
 {
  struct fsg_lun *curlun = common->curlun;
@@ -1245,6 +1303,7 @@ static int do_read_toc(struct fsg_common *common, struct fsg_buffhd *bh)
  buf[14] = 0xAA; /* Lead-out track number */
  store_cdrom_address(&buf[16], msf, curlun->num_sectors);
  return 20;
+
 }
 
 static int do_mode_sense(struct fsg_common *common, struct fsg_buffhd *bh)
@@ -1727,9 +1786,9 @@ static int check_command(struct fsg_common *common, int cmnd_size,
  if (common->data_dir != DATA_DIR_UNKNOWN)
  sprintf(hdlen, “, H%c=%u”, dirletter[(int) common->data_dir],
  common->data_size);
– VDBG(common, “SCSI command: %s;  Dc=%d, D%c=%u;  Hc=%d%sn”,
–      name, cmnd_size, dirletter[(int) data_dir],
–      common->data_size_from_cmnd, common->cmnd_size, hdlen);
+ //printk( “SCSI command: %s;  Dc=%d, D%c=%u;  Hc=%d%sn”,
+   //   name, cmnd_size, dirletter[(int) data_dir],
+  //    common->data_size_from_cmnd, common->cmnd_size, hdlen);
 
  /*
   * We can’t reply at all until we know the correct data direction
@@ -2087,7 +2146,21 @@ static int do_scsi_command(struct fsg_common *common)
  if (reply == 0)
  reply = do_write(common);
  break;
+ case 0x51://READ_DISC_INFORMATION
+ common->data_size_from_cmnd = 0;
+ if (!common->curlun || !common->curlun->cdrom)
+ goto unknown_cmnd;
+ printk(“READ_DISC_INFORMATIONn”);
+
+ reply = do_read_disc_information(common,bh);
+    break;
+ case 0x46://GET_CONFIGURATION
+ common->data_size_from_cmnd = 0;
+ if (!common->curlun || !common->curlun->cdrom)
+ goto unknown_cmnd;
+ printk(“GET_CONFIGURATIONn”);
+ reply = do_get_configuration(common,bh);
+ break;
  /*
   * Some mandatory commands that we recognize but don’t implement.
   * They don’t mean much in this setting.  It’s left as an exercise
diff –git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c
index 0e3ae43..f328ab6 100644
— a/drivers/usb/gadget/storage_common.c
+++ b/drivers/usb/gadget/storage_common.c
@@ -124,6 +124,42 @@ struct interrupt_data {
 #define SS_WRITE_ERROR 0x030c02
 #define SS_WRITE_PROTECTED 0x072700
 
+#define CD_MINS                       80 /* max. minutes per CD */
+#define CD_SECS                       60 /* seconds per minute */
+#define CD_FRAMES                     75 /* frames per second */
+#define CD_FRAMESIZE                2048 /* bytes per frame, “cooked” mode */
+#define CD_MAX_BYTES       (CD_MINS * CD_SECS * CD_FRAMES * CD_FRAMESIZE)
+#define CD_MAX_SECTORS     (CD_MAX_BYTES / 512)
+
+#define MMC_PROFILE_NONE                0x0000
+#define MMC_PROFILE_CD_ROM              0x0008
+#define MMC_PROFILE_CD_R                0x0009
+#define MMC_PROFILE_CD_RW               0x000A
+#define MMC_PROFILE_DVD_ROM             0x0010
+#define MMC_PROFILE_DVD_R_SR            0x0011
+#define MMC_PROFILE_DVD_RAM             0x0012
+#define MMC_PROFILE_DVD_RW_RO           0x0013
+#define MMC_PROFILE_DVD_RW_SR           0x0014
+#define MMC_PROFILE_DVD_R_DL_SR         0x0015
+#define MMC_PROFILE_DVD_R_DL_JR         0x0016
+#define MMC_PROFILE_DVD_RW_DL           0x0017
+#define MMC_PROFILE_DVD_DDR             0x0018
+#define MMC_PROFILE_DVD_PLUS_RW         0x001A
+#define MMC_PROFILE_DVD_PLUS_R          0x001B
+#define MMC_PROFILE_DVD_PLUS_RW_DL      0x002A
+#define MMC_PROFILE_DVD_PLUS_R_DL       0x002B
+#define MMC_PROFILE_BD_ROM              0x0040
+#define MMC_PROFILE_BD_R_SRM            0x0041
+#define MMC_PROFILE_BD_R_RRM            0x0042
+#define MMC_PROFILE_BD_RE               0x0043
+#define MMC_PROFILE_HDDVD_ROM           0x0050
+#define MMC_PROFILE_HDDVD_R             0x0051
+#define MMC_PROFILE_HDDVD_RAM           0x0052
+#define MMC_PROFILE_HDDVD_RW            0x0053
+#define MMC_PROFILE_HDDVD_R_DL          0x0058
+#define MMC_PROFILE_HDDVD_RW_DL         0x005A
+#define MMC_PROFILE_INVALID             0xFFFF
+
 #define SK(x) ((u8) ((x) >> 16)) /* Sense Key byte, etc. */
 #define ASC(x) ((u8) ((x) >> 8))
 #define ASCQ(x) ((u8) (x))
@@ -165,7 +201,6 @@ static inline struct fsg_lun *fsg_lun_from_dev(struct device *dev)
  return container_of(dev, struct fsg_lun, dev);
 }
 
 /* Big enough to hold our biggest descriptor */
 #define EP0_BUFSIZE 256
 #define DELAYED_STATUS (EP0_BUFSIZE + 999) /* An impossibly large value */
@@ -540,12 +575,12 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
  min_sectors = 1;
  if (curlun->cdrom) {
  min_sectors = 300; /* Smallest track is 300 frames */
– if (num_sectors >= 256*60*75) {
+ /*if (num_sectors >= 256*60*75) {
  num_sectors = 256*60*75 – 1;
  LINFO(curlun, “file too big: %sn”, filename);
  LINFO(curlun, “using only first %d blocksn”,
  (int) num_sectors);
– }
+ }*/
  }
  if (num_sectors < min_sectors) {
  LINFO(curlun, “file too small: %sn”, filename);
@@ -562,6 +597,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
  curlun->filp = filp;
  curlun->file_length = size;
  curlun->num_sectors = num_sectors;
+ printk(“lun_open: %zdn”,curlun->num_sectors-1);
  LDBG(curlun, “open backing file: %sn”, filename);
  return 0;
 
@@ -596,6 +632,8 @@ static void store_cdrom_address(u8 *dest, int msf, u32 addr)
  addr /= 75;
  dest[2] = addr % 60; /* Seconds */
  addr /= 60;
+ if ( addr > 255 )
+ printk(“store_cdrom_address: overflow n”);
  dest[1] = addr; /* Minutes */
  dest[0] = 0; /* Reserved */
  } else {
Questa patch applicata al kernel che si sta compilando permette di ottenere il driver modificato con il supporto alle immagini > 2.4 GB

Scrittura della eeprom nelle schede atheros 5k mini-pci

ath2

Qualche giorno fa su ebay ho ordinato un’interfaccia mini-pci atheros su cui è scritto che supporta anche l’802.11a ( 5 Ghz ), una volta ricevuta ho constatato che tale scheda mini-cpi pagata pochissimo ( 5 € ) , non è originale ed ha bisogno di drivers modificati che sono forniti solo per windows per funzionare in 802.11a, quindi è inutilizzabile su un qualsiasi router OpenWRT oppure su una board MikroTik.
Ovviamente da buon hacker ho scartato subito l’idea di comprarne una nuova e lasciare perdere quella, ed ho subito aperto lo schermo metallico che racchiude i componenti ad alta frequenza.
Possedendo una atheros a 5 Ghz autentica , aprendo anche quest’ultima, ho subito constato che l’hardware effettivamente è completamente identico, c’è un solo componente che potrebbe essere diverso ( nei contenuti ), la EEPROM.

Quindi ho iniziato a cercare su internet ed ho trovato che uno sviluppatore ha trovato modo di modificare il mac address nei casi in cui fosse presente FF:FF:FF:FF:FF:FF , questo richiede la scrittura della eeprom, proprio quello che serve in questo caso!

Una volta riordinato il codice( era in condizioni penose ), e aggiornato alle modifiche dei drivers nelle versioni recenti del kernel, ho aggiunto in cima ad eeprom.c nel tree del driver ath5k la seguente funzione:


Questa funzione non fa altro che scrivere la eeprom in blocci di 2 byte ( WORD ).

A questo punto l’idea più semplice è ottenere un dump della eeprom della scheda autentica, cambiarne il mac address e scriverla sulla eeprom della scheda cinese.

Per fare ciò senza creare un device a blocchi, date le dimensioni esigue della eeprom, è sufficiente implementare con printk un semplice dump che finirà sui log.

Ciò è possibile farlo inserendo in ath5k_eeprom_init il seguente blocco di codice:

Questo codice provvederà ad eseguire il dump della eeprom nel formato indirizzo:word.

Una volta eseguito il dump, è necessario trovare in esso il mac address della propria scheda , il quale sarà riportato in ordine inverso ( nel caso fosse 01:02:03:04:05:06 , ci sarà 0506 , 0304, 0102 ), e modificarne l’ultima cifra ( 05:06 ) prefribilmente.

Una volta creato il dump, con un semplice script python ( che verrà pubblicato a breve ) è possibile generare il sorgente C per chiamare la funzione ath5k_hw_eeprom_write per ogni word da scrivere sulla eeprom.

Per scrivere la eeprom è necessario, una volta rimosso il coperchio dello schermo RF va collegato a massa tramite una resistenza 150-300 ohm il pin Write Protect della eeprom in modo da abilitarne la scrittura, e va tenuto collegato durante tutta la procedura di scrittura.

Nonostante sia presente una resistenza di pullup da 10kOhm , la resistenza da collegare a massa è più che sufficiente a portare il pin allo 0 logico.

Una volta completata la scrittura, se la scheda da dove è stato preso il dump della eeprom a aveva un pezzo di materiale termoconduttore fra il coperchio dello schermo ed il chip wireless, è necessario applicarne uno anche sulla scheda cinese.

A questo punto è possibile utilzzare la scheda con i drivers non modificati come se fosse autentica.