samedi 7 août 2010

Clef USB password : sauvegarde en flash

 

Maintenant, je veux pouvoir sauvegarder les codes, ces PIC ne possèdes pas d'EEPROM donc sauvegarde en mémoire programme. 
Je pourrai utiliser la déclaration "rom unsigned char chaine1[]="bonjour";". 
Mais le problème c'est que pour réécrire une chaîne il faut effacer la zone avec le programme qui y est contenu. 
J'ai donc fait des fonctions d'écriture en flash. 
 Je suis parti des procédures en assembleur du datasheet pic18f87J50 section "6-flash program memory" Soit les fonctions :
  void flash_mem_clear( int adresse){ TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; //efface un secteur de 1024 byte (0x400) EECON1bits.WREN=1; EECON1bits.FREE=1; INTCONbits.GIE=0; EECON2=0x55; EECON2=0x0AA; EECON1bits.WR=1; INTCONbits.GIE=1; } void flash_mem_text_to_rom(unsigned char *ramptr, int adresse){//unsigned char *ramptr do{ TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; TABLAT=*ramptr++; _asm TBLWT _endasm EECON1bits.WPROG=1; EECON1bits.WREN=1; INTCONbits.GIE=0; EECON2=0x55; EECON2=0x0AA; EECON1bits.WR=1; INTCONbits.GIE=1; EECON1bits.WPROG=0; EECON1bits.WREN=0; adresse++; }while(*ramptr); TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; TABLAT=*ramptr++; _asm TBLWT _endasm EECON1bits.WPROG=1; EECON1bits.WREN=1; INTCONbits.GIE=0; EECON2=0x55; EECON2=0x0AA; EECON1bits.WR=1; INTCONbits.GIE=1; EECON1bits.WPROG=0; EECON1bits.WREN=0; } void flash_mem_flash_to_text(unsigned char *ramptr, int adresse){ TBLPTRU=(adresse>>16) & 0xFF; TBLPTRH=(adresse>>8) & 0xFF; TBLPTRL=adresse & 0xFF; while(*ramptr){ _asm TBLRDPOSTINC _endasm *ramptr++=TABLAT; } _asm TBLRDPOSTINC _endasm *ramptr++=TABLAT; } 
Programme de test : 
#include #include "string.h" #include "stdio.h" #include "sauvegarde_flash_mem.h" unsigned char txt_ram[100] = "abcdefghijklmnopqrstuvwxyzxxxxxxxxxxxxxxxxxxxxxxxx"; unsigned char txt_ram2[100] = "texte en ram222222222222222222222222222222222222222222222222222"; void main (void) { fprintf(_H_USER,"\nstart\n"); printf("\nstart\n"); printf("txt_ram=%s\n",txt_ram); printf("txt_ram2=%s\n",txt_ram2); flash_mem_clear( 0x002000); flash_mem_text_to_rom(&txt_ram,0x002000 ); flash_mem_text_to_rom(&txt_ram2,0x0023F0 ); flash_mem_flash_to_text(&txt_ram, 0x0023F0); printf("\n"); printf("txt_ram=%s\n",txt_ram); printf("txt_ram2=%s\n",txt_ram2); while (1) ; }

Sauvegarde txt_ram à l'adresse 0x002000, txt_ram2 a l'adresse 0x0023F0, txt_ram est chargé par la valeur à l'adresse 0x0023F0 soit la valeur de txt_ram2.

mercredi 4 août 2010

Clef USB password: code fonctionnel

 

J'ai changé à l'arrache le début de la fonction : 

void Keyboard(void) { static unsigned char key = 4;//4 static unsigned char position = 0; static unsigned char texte[100]; texte[0]=4; texte[1]=5; texte[2]=6; texte[3]=7; texte[4]=8; texte[5]=43;//tab texte[6]=9; texte[7]=10; texte[8]=11; texte[9]=88;//enter texte[10]=0;//fin //Check if the IN endpoint is not busy, and if it isn't check if we want to send //keystroke data to the host. if(!HIDTxHandleBusy(lastINTransmission)) { if(sw2==0)//sw2//Switch3IsPressed() { //Load the HID buffer hid_report_in[0] = 0; hid_report_in[1] = 0; hid_report_in[2] = texte[position];//key++ hid_report_in[3] = 0;//0 hid_report_in[4] = 0; hid_report_in[5] = 0; hid_report_in[6] = 0; hid_report_in[7] = 0; if(texte[position]==0) { // while(sw2==0);; key = 40; hid_report_in[2] = 0;//key++ }else{ position++; } //Send the 8 byte packet over USB to the host. lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x08); } else { //Load the HID buffer hid_report_in[0] = 0; hid_report_in[1] = 0; hid_report_in[2] = 0; //Indicate no character pressed hid_report_in[3] = 0; hid_report_in[4] = 0; hid_report_in[5] = 0; hid_report_in[6] = 0; hid_report_in[7] = 0; //Send the 8 byte packet over USB to the host. lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x08); position = 0; key = 4; } } 

Ce qui a pour effet de tapé : abcde[tabulation]fgh[enter] 
Il y a plus qu'à traduire des touches pour que ça marche.

lundi 2 août 2010

THT expérience #013 : Fil néon

Fait avec une chute de câble twisté isolé au téflon et kapton, le fil s'échauffe très vite
Sur un melon.
Et la video.

dimanche 1 août 2010

Clef USB password: clavier en qwerty

En mettant Windows en clavier EN (alt + maj) j'obtiens la série dans l'ordre :

 abcdefghijklmnopqrstuvwxyz1234567890 -=[]\\;'`,./ 

Au lieu de : 

qbcdefghijkl,noparstuvzxyw&é"'(-è_çà )=^$**mù²;:! 

Alors que j'ai changé le descripteur 0x0409(US) par 0x040C(FR). 

Windows attribut les touches suivant leurs emplacements physiques théorique le code envoyé au pc correspond à l'appui et relâchement de chaque touche alors que sur cet autre projet un code d'appui et un code de relâchement est généré : adaptateur manettes Playstation vers mini DIN de PC-AT.
Le PC envoi un état vers le pic, en rajoutant ce code, j'ai une recopie d’état des num lock et cap lock du clavier du PC sur les LED de la platine : 
if(hid_report_out[0] & 0x01) {mLED_1_On();}else{mLED_1_Off();} 
if(hid_report_out[0] & 0x02) {mLED_2_On();}else{mLED_2_Off();}

samedi 31 juillet 2010

Clef USB password : mise en route

 

Bon, je suis allé chercher les cordons. 
Pour le programmateur c'est un adaptateur de ma fabrication, l'ICD a une sortie en RJ45.

 
 Lancement du programme ->périphérique non reconnu c'est dû à ce que j'ai changé le quartz de 12 Mhz par un oscillateur de 48 Mhz->rajout des directives : 

 #if defined(oscillateur48mhz) 
#pragma config PLLDIV = 12 //Divide by 12 (48 MHz oscillator input)//config pour oscillateur 48 mhz #pragma config FOSC = HS //config pour oscillateur 48 mhz 
#endif #if defined(quartz12mhz) 
#pragma config PLLDIV = 3 // (12 MHz crystal used on this board)//config pour quartz 12 mhz 
#pragma config FOSC = HSPLL // Firmware must also set OSCTUNE to start PLL!//config pour quartz 12 mhz 
#endif 

 Périphérique reconnu, j'appuie sur le BP de la platine, un caractère par coup. 
J’obtiens la série "qbcdefghijkl,noparstuvzxyw&é"'(-è_çà"

vendredi 30 juillet 2010

Clef USB password : démarrage

 

Je veux faire une clef USB qui me permettrait de saisir mes loging/password, en gros je veux faire un bouton sur USB qui me tape pour moi mes logging et passwords. Pour le développement je vais utiliser un module PIM pic18F87J50, une fois le programme fait je le porterait vers un pic26J50 qui est plus facile à souder et intégrer dans une clef-USB Le module PIM pic18F87J50 a l'avantage d'avoir un port USB et pas besoin d'alimentation puisque qu'il est auto alimentée par l'USB, je n'ai que du soft à écrire.
 Pour la programmation j'utilise un ICD2 plus MPLAB IDE avec l'option MCC18 (langage C): http://radiospares-fr.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=4670754 
 J'ai installé le "MCHP microchip application libraries" cela installe toutes les librairies de fonctions spéciales avec les programmes d'exemples :
Je vais partir de l'exemple "USB Device - HID - Keyboard" qui semble être un clavier d'une touche par module pic/USB, reconnu par le système d'exploitation donc pas de drivers à installer. Le montage pourrait aller sur n'importe quel PC.  
Après avoir redéfini les chemins des outils de compilation l'exemple compile mais je n'ai pas pensé à prendre les cordons pour la programmation et l'USB donc je vous dirai plus tard le fonctionnement.