This repository has been archived on 2023-01-14. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
05_wickler/bootloader_zevero_sd_m644p_make/uart/uart.c
2019-02-12 07:43:25 +04:00

108 lines
2.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
** This is a simple set of UART routines for debug purposes
** It's Tx only and the baud rate is fixed (see UART_init)
*/
#include "uart.h"
#define UCSRA UCSR0A
#define UCSRB UCSR0B
#define UCSRC UCSR0C
#define UBRRH UBRR0H
#define UBRRL UBRR0L
#define UDRE UDRE0
#define UDR UDR0
#define RXC RXC0
#if BOOT_ADR > 0xFFFF
#define PGM_READ_BYTE(x) pgm_read_byte_far(x)
#else
#define PGM_READ_BYTE(x) pgm_read_byte(x)
#endif
// Just enable the UART Tx and set baud rate for 38400 on 3.6864MHz (STK500)
void UART_init(void) {
UCSRB = (1 << TXEN0);
UBRRL = USE_UART; // SEE HERE: http://wormfood.net/avrbaudcalc.php
}
// The classic Tx one character routine
void UART_put(uint8_t c) {
while (!(UCSRA & (1 << UDRE)));
UDR = c;
}
// classic Tx a C-string routine
// As there is no .data (in the bootloader) it only makes sense for theis to use PSTR()
void UART_puts(const char * str) {
char c;
do {
c = PGM_READ_BYTE(str++);
if (c) {
UART_put(c);
}
} while (c != 0);
}
// Just outputs "\r\n"
void UART_newline(void){
UART_put('\r');
UART_put('\n');
}
// used in printing a 2 digit hex number, outputs one of the two nibbles
// the parameter is expected to be 0..F
void UART_putnibble(uint8_t c) {
if (c < 10) {
UART_put('0' + c);
}
else {
UART_put('A' + c - 10);
}
}
// print both nibbles of an 8 bit hex number
void UART_puthex(uint8_t c) {
UART_putnibble(c >> 4);
UART_putnibble(c & 0x0F);
}
// print both bytes of a 16 bit hex number
void UART_puthex16(uint16_t n) {
UART_puthex(n >> 8);
UART_puthex(n & 0xFF);
}
// print both bytes of a 32 bit hex number
void UART_puthex32(uint32_t n) {
UART_puthex(n >> 24);
UART_puthex(n >> 16 & 0xFF);
UART_puthex(n >> 8 & 0xFF);
UART_puthex(n & 0xFF);
}
// this expect the first parameter to be a string in dlash (that is PSTR())
// and then the second to be a value to print out in hex. typically used in
// the form UART_putsP(PSTR("SecPerClus = "), SecPerClus)
void UART_putsP(const char * str, uint16_t n) {
UART_puts(str);
UART_puthex16(n);
UART_newline();
}
// dump the 512 bytes at the given address in the form:
// CD BF 10 E0 A0 E6 B0 E0 E4 E5 F0 E0 02 C0 05 90 Ϳ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20>
void UART_dumpsector(uint8_t * Buff) {
for (uint16_t i=0; i<512; i++) {
if ((i % 16) == 0) {
UART_put(' ');
for(uint16_t j=(i -16); j<=i; j++) {
UART_put(((Buff[j]>=(uint8_t)32) && (Buff[j]<(uint8_t)127)) ? Buff[j] : '.');
}
UART_newline();
}
UART_puthex(Buff[i]);
UART_put(' ');
}
UART_newline();
}