Skrolli 2018.2: Tee-se-itse USB-salasanatikku LINKIT: - Projektitiedostot: https://skrolli.fi/content/uploads/2018/05/Projektitiedostot_Tee-se-itse_USB-salasanatikku_Skrolli20182.zip - AVR-kehityksen perusteet: https://www.ladyada.net/learn/avr/index.html - LUFA (Lightweight USB Framework for AVRs): http://www.fourwalledcubicle.com/LUFA.php - http://codeandlife.com/2012/03/03/diy-usb-password-generator/ - Video laitteen toiminnasta: https://youtu.be/kpNSycoUCZM - LUFA-esimerkki hiirelle: http://codeandlife.com/2016/01/30/usb-mouse-with-atmega32u4-pro-micro-clone-and-lufa/ LISTAUKSET: C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\av r8-gnu-toolchain\bin avr-gcc -O2 -mmcu=atmega32u4 -c blink.c -o blink.o avr-gcc -O2 -mmcu=atmega32u4 blink.o -o blink.elf avr-objcopy -j .text -j .data -O ihex blink.elf blink.hex avrdude -p atmega32u4 -c avr109 -P COM5 -U flash:w:blink.hex MCU = atmega32u4 ARCH = AVR8 BOARD = LEONARDO F_CPU = 16000000 AVRDUDE = avrdude AVRDUDE_PROGRAMMER = avr109 AVRDUDE_PORT = COM5 Listaus 1: #define BUTTON PD2 // PD2 on Pro Micron RX-pinni #define BUTTONPIN PIND #define BUTTONPORT PORTD int main() { /* Poista watchdog käytöstä, jos bootloader tai piirin asetukset ovat käynnistäneet sen. */ MCUSR &= ~(1 << WDRF); wdt_disable(); clock_prescale_set(clock_div_1); // Poista kellotaajuuden jako USB_Init(); // Raudan alustus BUTTONPORT |= _BV(BUTTON); // Nappi heikolla pullup-vastuksella DDRB |= _BV(PB0); // Pro Mini TX LEDi DDRB |= _BV(PB4); // D8 pinni GlobalInterruptEnable(); for(;;) { HID_Device_USBTask(&Keyboard_HID_Interface); USB_USBTask(); } } Listaus 2: // Salasanadata ja osoitin viestiin volatile char msg[64] = “CorrectHorseBatteryStable\n”; // Salasana volatile int msgLen=26, msgNext=0; /* Kutsuttava funktio joka lähettää näppäinpainallukset ja -vapautukset. * Ks. alkuperäinen Keyboard.c jos haluat parametrien selitykset. */ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const reportID, const uint8_t reportType, void* reportData, uint16_t* const reportSize) { USB_KeyboardReport_Data_t* rep = (USB_KeyboardReport_Data_t*)reportData; static int idle = 0, initialDelay = 500; // Alkuviive, jotta tietokone ei hukkaa ensimmäisiä painalluksia static bool keyDown = false; PINB |= _BV(PB4); // Vaihda pin 8:n tilaa, jolloin voidaan tutkia kutsumistiheyttä if(initialDelay) initialDelay--; // Lähtölaskenta! // Poistu yhdeksän kertaa kymmenestä, jotta kirjainten syöttönopeus laskee 100x/s if(initialDelay || idle++ % 10 || keyDown) { rep->Modifier = rep->KeyCode[0] = 0; keyDown = false; } else if(msgNext < msgLen) { ascii2keyreport(msg[msgNext++], rep); keyDown = true; } *reportSize = sizeof(USB_KeyboardReport_Data_t); return false; }