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