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;
}