Got a little demo going

This commit is contained in:
David Lenfesty 2019-11-04 17:31:54 -07:00
parent a81fa0cb82
commit 0e5306387e
11 changed files with 464 additions and 988 deletions

1
.gitignore vendored
View File

@ -7,3 +7,4 @@ cmake-build-debug/*
.idea/*
*/build/**
*/_build/**
*.o

View File

@ -0,0 +1,16 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "make",
"type": "shell",
"command": "make",
"group": {
"kind": "build",
"isDefault": true
}
}
]
}

View File

@ -15,7 +15,7 @@
#include "partition.h"
#include "sd_raw.h"
#include "sd_raw_config.h"
#include "uart.h"
#include "lcd.h"
#define DEBUG 1
@ -205,462 +205,55 @@
* - sd-reader_config.h
*/
static uint8_t read_line(char* buffer, uint8_t buffer_length);
static uint32_t strtolong(const char* str);
static uint8_t find_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name, struct fat_dir_entry_struct* dir_entry);
static struct fat_file_struct* open_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name);
static uint8_t print_disk_info(const struct fat_fs_struct* fs);
int main()
{
lcd_init(LCD_DISP_ON);
/* we will just use ordinary idle mode */
set_sleep_mode(SLEEP_MODE_IDLE);
/* setup uart */
uart_init();
/* open first partition */
struct partition_struct* partition = partition_open(sd_raw_read,
sd_raw_read_interval,
0,
0,
0
);
while(1)
if(!partition)
{
/* setup sd card slot */
if(!sd_raw_init())
{
#if DEBUG
uart_puts_p(PSTR("MMC/SD initialization failed\n"));
#endif
continue;
/* If the partition did not open, assume the storage device
* is a "superfloppy", i.e. has no MBR.
*/
partition = partition_open(sd_raw_read,
sd_raw_read_interval,
0,
0,
-1
);
}
/* open file system */
struct fat_fs_struct* fs = fat_open(partition);
/* open root directory */
struct fat_dir_entry_struct directory;
fat_get_dir_entry_of_path(fs, "/", &directory);
struct fat_dir_struct* dd = fat_open_dir(fs, &directory);
// Print out all files/directories in top level
while (1) {
struct fat_dir_entry_struct dir_entry;
while(fat_read_dir(dd, &dir_entry)) {
// print out directory entry name
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts(dir_entry.long_name);
}
/* open first partition */
struct partition_struct* partition = partition_open(sd_raw_read,
sd_raw_read_interval,
#if SD_RAW_WRITE_SUPPORT
sd_raw_write,
sd_raw_write_interval,
#else
0,
0,
#endif
0
);
if(!partition)
{
/* If the partition did not open, assume the storage device
* is a "superfloppy", i.e. has no MBR.
*/
partition = partition_open(sd_raw_read,
sd_raw_read_interval,
#if SD_RAW_WRITE_SUPPORT
sd_raw_write,
sd_raw_write_interval,
#else
0,
0,
#endif
-1
);
if(!partition)
{
#if DEBUG
uart_puts_p(PSTR("opening partition failed\n"));
#endif
continue;
}
}
/* open file system */
struct fat_fs_struct* fs = fat_open(partition);
if(!fs)
{
#if DEBUG
uart_puts_p(PSTR("opening filesystem failed\n"));
#endif
continue;
}
/* open root directory */
struct fat_dir_entry_struct directory;
fat_get_dir_entry_of_path(fs, "/", &directory);
struct fat_dir_struct* dd = fat_open_dir(fs, &directory);
if(!dd)
{
#if DEBUG
uart_puts_p(PSTR("opening root directory failed\n"));
#endif
continue;
}
/* print some card information as a boot message */
print_disk_info(fs);
/* provide a simple shell */
char buffer[24];
while(1)
{
/* print prompt */
uart_putc('>');
uart_putc(' ');
/* read command */
char* command = buffer;
if(read_line(command, sizeof(buffer)) < 1)
continue;
/* execute command */
if(strcmp_P(command, PSTR("init")) == 0)
{
break;
}
else if(strncmp_P(command, PSTR("cd "), 3) == 0)
{
command += 3;
if(command[0] == '\0')
continue;
/* change directory */
struct fat_dir_entry_struct subdir_entry;
if(find_file_in_dir(fs, dd, command, &subdir_entry))
{
struct fat_dir_struct* dd_new = fat_open_dir(fs, &subdir_entry);
if(dd_new)
{
fat_close_dir(dd);
dd = dd_new;
continue;
}
}
uart_puts_p(PSTR("directory not found: "));
uart_puts(command);
uart_putc('\n');
}
else if(strcmp_P(command, PSTR("ls")) == 0)
{
/* print directory listing */
struct fat_dir_entry_struct dir_entry;
while(fat_read_dir(dd, &dir_entry))
{
uint8_t spaces = sizeof(dir_entry.long_name) - strlen(dir_entry.long_name) + 4;
uart_puts(dir_entry.long_name);
uart_putc(dir_entry.attributes & FAT_ATTRIB_DIR ? '/' : ' ');
while(spaces--)
uart_putc(' ');
uart_putdw_dec(dir_entry.file_size);
uart_putc('\n');
}
}
else if(strncmp_P(command, PSTR("cat "), 4) == 0)
{
command += 4;
if(command[0] == '\0')
continue;
/* search file in current directory and open it */
struct fat_file_struct* fd = open_file_in_dir(fs, dd, command);
if(!fd)
{
uart_puts_p(PSTR("error opening "));
uart_puts(command);
uart_putc('\n');
continue;
}
/* print file contents */
uint8_t buffer[8];
uint32_t offset = 0;
intptr_t count;
while((count = fat_read_file(fd, buffer, sizeof(buffer))) > 0)
{
uart_putdw_hex(offset);
uart_putc(':');
for(intptr_t i = 0; i < count; ++i)
{
uart_putc(' ');
uart_putc_hex(buffer[i]);
}
uart_putc('\n');
offset += 8;
}
fat_close_file(fd);
}
else if(strcmp_P(command, PSTR("disk")) == 0)
{
if(!print_disk_info(fs))
uart_puts_p(PSTR("error reading disk info\n"));
}
#if FAT_WRITE_SUPPORT
else if(strncmp_P(command, PSTR("rm "), 3) == 0)
{
command += 3;
if(command[0] == '\0')
continue;
struct fat_dir_entry_struct file_entry;
if(find_file_in_dir(fs, dd, command, &file_entry))
{
if(fat_delete_file(fs, &file_entry))
continue;
}
uart_puts_p(PSTR("error deleting file: "));
uart_puts(command);
uart_putc('\n');
}
else if(strncmp_P(command, PSTR("touch "), 6) == 0)
{
command += 6;
if(command[0] == '\0')
continue;
struct fat_dir_entry_struct file_entry;
if(!fat_create_file(dd, command, &file_entry))
{
uart_puts_p(PSTR("error creating file: "));
uart_puts(command);
uart_putc('\n');
}
}
else if(strncmp_P(command, PSTR("mv "), 3) == 0)
{
command += 3;
if(command[0] == '\0')
continue;
char* target = command;
while(*target != ' ' && *target != '\0')
++target;
if(*target == ' ')
*target++ = '\0';
else
continue;
struct fat_dir_entry_struct file_entry;
if(find_file_in_dir(fs, dd, command, &file_entry))
{
if(fat_move_file(fs, &file_entry, dd, target))
continue;
}
uart_puts_p(PSTR("error moving file: "));
uart_puts(command);
uart_putc('\n');
}
else if(strncmp_P(command, PSTR("write "), 6) == 0)
{
command += 6;
if(command[0] == '\0')
continue;
char* offset_value = command;
while(*offset_value != ' ' && *offset_value != '\0')
++offset_value;
if(*offset_value == ' ')
*offset_value++ = '\0';
else
continue;
/* search file in current directory and open it */
struct fat_file_struct* fd = open_file_in_dir(fs, dd, command);
if(!fd)
{
uart_puts_p(PSTR("error opening "));
uart_puts(command);
uart_putc('\n');
continue;
}
int32_t offset = strtolong(offset_value);
if(!fat_seek_file(fd, &offset, FAT_SEEK_SET))
{
uart_puts_p(PSTR("error seeking on "));
uart_puts(command);
uart_putc('\n');
fat_close_file(fd);
continue;
}
/* read text from the shell and write it to the file */
uint8_t data_len;
while(1)
{
/* give a different prompt */
uart_putc('<');
uart_putc(' ');
/* read one line of text */
data_len = read_line(buffer, sizeof(buffer));
if(!data_len)
break;
/* write text to file */
if(fat_write_file(fd, (uint8_t*) buffer, data_len) != data_len)
{
uart_puts_p(PSTR("error writing to file\n"));
break;
}
}
fat_close_file(fd);
}
else if(strncmp_P(command, PSTR("mkdir "), 6) == 0)
{
command += 6;
if(command[0] == '\0')
continue;
struct fat_dir_entry_struct dir_entry;
if(!fat_create_dir(dd, command, &dir_entry))
{
uart_puts_p(PSTR("error creating directory: "));
uart_puts(command);
uart_putc('\n');
}
}
#endif
#if SD_RAW_WRITE_BUFFERING
else if(strcmp_P(command, PSTR("sync")) == 0)
{
if(!sd_raw_sync())
uart_puts_p(PSTR("error syncing disk\n"));
}
#endif
else
{
uart_puts_p(PSTR("unknown command: "));
uart_puts(command);
uart_putc('\n');
}
}
/* close directory */
fat_close_dir(dd);
/* close file system */
fat_close(fs);
/* close partition */
partition_close(partition);
}
return 0;
}
uint8_t read_line(char* buffer, uint8_t buffer_length)
{
memset(buffer, 0, buffer_length);
uint8_t read_length = 0;
while(read_length < buffer_length - 1)
{
uint8_t c = uart_getc();
if(c == 0x08 || c == 0x7f)
{
if(read_length < 1)
continue;
--read_length;
buffer[read_length] = '\0';
uart_putc(0x08);
uart_putc(' ');
uart_putc(0x08);
continue;
}
uart_putc(c);
if(c == '\n')
{
buffer[read_length] = '\0';
break;
}
else
{
buffer[read_length] = c;
++read_length;
}
}
return read_length;
}
uint32_t strtolong(const char* str)
{
uint32_t l = 0;
while(*str >= '0' && *str <= '9')
l = l * 10 + (*str++ - '0');
return l;
}
uint8_t find_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name, struct fat_dir_entry_struct* dir_entry)
{
while(fat_read_dir(dd, dir_entry))
{
if(strcmp(dir_entry->long_name, name) == 0)
{
fat_reset_dir(dd);
return 1;
}
}
return 0;
}
struct fat_file_struct* open_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name)
{
struct fat_dir_entry_struct file_entry;
if(!find_file_in_dir(fs, dd, name, &file_entry))
return 0;
return fat_open_file(fs, &file_entry);
}
uint8_t print_disk_info(const struct fat_fs_struct* fs)
{
if(!fs)
return 0;
struct sd_raw_info disk_info;
if(!sd_raw_get_info(&disk_info))
return 0;
uart_puts_p(PSTR("manuf: 0x")); uart_putc_hex(disk_info.manufacturer); uart_putc('\n');
uart_puts_p(PSTR("oem: ")); uart_puts((char*) disk_info.oem); uart_putc('\n');
uart_puts_p(PSTR("prod: ")); uart_puts((char*) disk_info.product); uart_putc('\n');
uart_puts_p(PSTR("rev: ")); uart_putc_hex(disk_info.revision); uart_putc('\n');
uart_puts_p(PSTR("serial: 0x")); uart_putdw_hex(disk_info.serial); uart_putc('\n');
uart_puts_p(PSTR("date: ")); uart_putw_dec(disk_info.manufacturing_month); uart_putc('/');
uart_putw_dec(disk_info.manufacturing_year); uart_putc('\n');
uart_puts_p(PSTR("size: ")); uart_putdw_dec(disk_info.capacity / 1024 / 1024); uart_puts_p(PSTR("MB\n"));
uart_puts_p(PSTR("copy: ")); uart_putw_dec(disk_info.flag_copy); uart_putc('\n');
uart_puts_p(PSTR("wr.pr.: ")); uart_putw_dec(disk_info.flag_write_protect_temp); uart_putc('/');
uart_putw_dec(disk_info.flag_write_protect); uart_putc('\n');
uart_puts_p(PSTR("format: ")); uart_putw_dec(disk_info.format); uart_putc('\n');
uart_puts_p(PSTR("free: ")); uart_putdw_dec(fat_get_fs_free(fs)); uart_putc('/');
uart_putdw_dec(fat_get_fs_size(fs)); uart_putc('\n');
return 1;
}
#if FAT_DATETIME_SUPPORT
void get_datetime(uint16_t* year, uint8_t* month, uint8_t* day, uint8_t* hour, uint8_t* min, uint8_t* sec)
{
*year = 2007;
*month = 1;
*day = 1;
*hour = 0;
*min = 0;
*sec = 0;
}
#endif
}

View File

@ -3,11 +3,9 @@ Archive member included to satisfy reference by file (symbol)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
fat.o (__mulsi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
uart.o (__udivmodhi4)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
fat.o (__divmodhi4)
fat.o (__udivmodhi4)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
uart.o (__udivmodsi4)
fat.o (__udivmodsi4)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o (exit)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
@ -16,28 +14,34 @@ Archive member included to satisfy reference by file (symbol)
fat.o (__do_copy_data)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
partition.o (__do_clear_bss)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
fat.o (__umulhisi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
uart.o (__muluhisi3)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp_P.o)
main.o (strcmp_P)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp_P.o)
main.o (strncmp_P)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memcpy.o)
sd_raw.o (memcpy)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memset.o)
fat.o (memset)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o) (__muluhisi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
fat.o (__muldi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o) (__muldi3_6)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
fat.o (__umulsidi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
sd_raw.o (__ashldi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
sd_raw.o (__lshrdi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
sd_raw.o (__adddi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
fat.o (__adddi3_s8)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
sd_raw.o (__subdi3)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
fat.o (__cmpdi2)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
fat.o (__cmpdi2_s8)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
/usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o) (__umulhisi3)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
fat.o (strchr)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp.o)
fat.o (strcmp)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
fat.o (strncmp)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncpy.o)
fat.o (strncpy)
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strrchr.o)
fat.o (strrchr)
Memory Configuration
@ -57,8 +61,8 @@ Address of section .data set to 0x800100
LOAD /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
LOAD partition.o
LOAD sd_raw.o
LOAD uart.o
LOAD byteordering.o
LOAD lcd.o
LOAD fat.o
LOAD main.o
START GROUP
@ -165,7 +169,7 @@ END GROUP
.rela.plt
*(.rela.plt)
.text 0x0000000000000000 0x3574
.text 0x0000000000000000 0x2502
*(.vectors)
.vectors 0x0000000000000000 0x68 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
0x0000000000000000 __vectors
@ -183,36 +187,35 @@ END GROUP
*libprintf_flt.a:*(.progmem.data)
*libc.a:*(.progmem.data)
*(.progmem*)
.progmem.data 0x0000000000000086 0x20c main.o
0x0000000000000292 . = ALIGN (0x2)
0x0000000000000086 . = ALIGN (0x2)
*(.jumptables)
*(.jumptables*)
*(.lowtext)
*(.lowtext*)
0x0000000000000292 __ctors_start = .
0x0000000000000086 __ctors_start = .
*(.ctors)
0x0000000000000292 __ctors_end = .
0x0000000000000292 __dtors_start = .
0x0000000000000086 __ctors_end = .
0x0000000000000086 __dtors_start = .
*(.dtors)
0x0000000000000292 __dtors_end = .
0x0000000000000086 __dtors_end = .
SORT(*)(.ctors)
SORT(*)(.dtors)
*(.init0)
.init0 0x0000000000000292 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
0x0000000000000292 __init
.init0 0x0000000000000086 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
0x0000000000000086 __init
*(.init0)
*(.init1)
*(.init1)
*(.init2)
.init2 0x0000000000000292 0xc /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.init2 0x0000000000000086 0xc /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
*(.init2)
*(.init3)
*(.init3)
*(.init4)
.init4 0x000000000000029e 0x16 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
0x000000000000029e __do_copy_data
.init4 0x00000000000002b4 0x10 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
0x00000000000002b4 __do_clear_bss
.init4 0x0000000000000092 0x16 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
0x0000000000000092 __do_copy_data
.init4 0x00000000000000a8 0x10 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
0x00000000000000a8 __do_clear_bss
*(.init4)
*(.init5)
*(.init5)
@ -223,279 +226,378 @@ END GROUP
*(.init8)
*(.init8)
*(.init9)
.init9 0x00000000000002c4 0x8 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.init9 0x00000000000000b8 0x8 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
*(.init9)
*(.text)
.text 0x00000000000002cc 0x4 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
0x00000000000002cc __vector_22
0x00000000000002cc __vector_1
0x00000000000002cc __vector_24
0x00000000000002cc __vector_12
0x00000000000002cc __bad_interrupt
0x00000000000002cc __vector_6
0x00000000000002cc __vector_3
0x00000000000002cc __vector_23
0x00000000000002cc __vector_25
0x00000000000002cc __vector_11
0x00000000000002cc __vector_13
0x00000000000002cc __vector_17
0x00000000000002cc __vector_19
0x00000000000002cc __vector_7
0x00000000000002cc __vector_5
0x00000000000002cc __vector_4
0x00000000000002cc __vector_9
0x00000000000002cc __vector_2
0x00000000000002cc __vector_21
0x00000000000002cc __vector_15
0x00000000000002cc __vector_8
0x00000000000002cc __vector_14
0x00000000000002cc __vector_10
0x00000000000002cc __vector_16
0x00000000000002cc __vector_20
.text 0x00000000000002d0 0x126 partition.o
0x00000000000002d0 partition_open
0x00000000000003e6 partition_close
.text 0x00000000000003f6 0x7de sd_raw.o
0x0000000000000484 sd_raw_available
0x0000000000000490 sd_raw_locked
0x000000000000049e sd_raw_sync
0x00000000000004d2 sd_raw_read
0x0000000000000602 sd_raw_init
0x0000000000000714 sd_raw_read_interval
0x00000000000007ba sd_raw_write
0x0000000000000930 sd_raw_write_interval
0x00000000000009d8 sd_raw_get_info
.text 0x0000000000000bd4 0x224 uart.o
0x0000000000000bd4 uart_init
0x0000000000000bec uart_putc
0x0000000000000c0a uart_putc_hex
0x0000000000000c34 uart_putw_hex
0x0000000000000c46 uart_putdw_hex
0x0000000000000c66 uart_putw_dec
0x0000000000000cde uart_putdw_dec
0x0000000000000d96 uart_puts
0x0000000000000dae uart_puts_p
0x0000000000000dcc uart_getc
0x0000000000000df6 __vector_18
.text 0x0000000000000df8 0x28 byteordering.o
0x0000000000000df8 read16
0x0000000000000e00 read32
0x0000000000000e0c write16
0x0000000000000e14 write32
.text 0x0000000000000e20 0x1dd4 fat.o
0x00000000000018da fat_open
0x0000000000001bec fat_close
0x0000000000001bf8 fat_open_file
0x0000000000001c58 fat_close_file
0x0000000000001c64 fat_read_file
0x0000000000001e6e fat_write_file
0x00000000000020f6 fat_resize_file
0x00000000000022de fat_seek_file
0x0000000000002380 fat_open_dir
0x00000000000023e8 fat_close_dir
0x00000000000023f4 fat_reset_dir
0x000000000000240e fat_read_dir
0x000000000000259c fat_get_dir_entry_of_path
0x00000000000026ae fat_create_file
0x000000000000275c fat_delete_file
0x0000000000002848 fat_move_file
0x0000000000002934 fat_create_dir
0x0000000000002aa2 fat_get_fs_size
0x0000000000002ad6 fat_get_fs_free
.text 0x0000000000002bf4 0x23a main.o
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp_P.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp_P.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memcpy.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memset.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncpy.o)
.text 0x0000000000002e2e 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strrchr.o)
0x0000000000002e2e . = ALIGN (0x2)
.text 0x00000000000000c0 0x4 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
0x00000000000000c0 __vector_22
0x00000000000000c0 __vector_1
0x00000000000000c0 __vector_24
0x00000000000000c0 __vector_12
0x00000000000000c0 __bad_interrupt
0x00000000000000c0 __vector_6
0x00000000000000c0 __vector_3
0x00000000000000c0 __vector_23
0x00000000000000c0 __vector_25
0x00000000000000c0 __vector_11
0x00000000000000c0 __vector_13
0x00000000000000c0 __vector_17
0x00000000000000c0 __vector_19
0x00000000000000c0 __vector_7
0x00000000000000c0 __vector_5
0x00000000000000c0 __vector_4
0x00000000000000c0 __vector_9
0x00000000000000c0 __vector_2
0x00000000000000c0 __vector_21
0x00000000000000c0 __vector_15
0x00000000000000c0 __vector_8
0x00000000000000c0 __vector_14
0x00000000000000c0 __vector_10
0x00000000000000c0 __vector_16
0x00000000000000c0 __vector_18
0x00000000000000c0 __vector_20
.text 0x00000000000000c4 0x144 partition.o
0x00000000000000c4 partition_open
0x00000000000001f8 partition_close
.text 0x0000000000000208 0x868 sd_raw.o
0x0000000000000296 sd_raw_available
0x00000000000002a2 sd_raw_init
0x0000000000000420 sd_raw_locked
0x000000000000042e sd_raw_read
0x00000000000005ae sd_raw_read_interval
0x000000000000080c sd_raw_get_info
.text 0x0000000000000a70 0x28 byteordering.o
0x0000000000000a70 read16
0x0000000000000a78 read32
0x0000000000000a84 write16
0x0000000000000a8c write32
.text 0x0000000000000a98 0x1f8 lcd.o
0x0000000000000b6a lcd_command
0x0000000000000b7c lcd_data
0x0000000000000b8e lcd_gotoxy
0x0000000000000b9c lcd_getxy
0x0000000000000ba4 lcd_clrscr
0x0000000000000baa lcd_home
0x0000000000000bb0 lcd_putc
0x0000000000000bd8 lcd_puts
0x0000000000000bf0 lcd_puts_p
0x0000000000000c0e lcd_init
.text 0x0000000000000c90 0x14fa fat.o
0x000000000000115a fat_open
0x0000000000001610 fat_close
0x000000000000161c fat_open_file
0x0000000000001698 fat_close_file
0x00000000000016a4 fat_read_file
0x0000000000001a76 fat_seek_file
0x0000000000001b06 fat_open_dir
0x0000000000001b76 fat_close_dir
0x0000000000001b82 fat_reset_dir
0x0000000000001ba4 fat_read_dir
0x0000000000001e6e fat_get_dir_entry_of_path
0x0000000000001f80 fat_get_fs_size
0x0000000000001fee fat_get_fs_free
.text 0x000000000000218a 0x0 main.o
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
.text 0x000000000000218a 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
0x000000000000218a . = ALIGN (0x2)
*(.text.*)
.text.startup 0x0000000000002e2e 0x588 main.o
0x0000000000002e2e main
.text.startup 0x000000000000218a 0x9a main.o
0x000000000000218a main
.text.libgcc.mul
0x00000000000033b6 0x20 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
0x00000000000033b6 __mulsi3
0x0000000000002224 0x20 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
0x0000000000002224 __mulsi3
.text.libgcc.div
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc 0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
0x0000000000002244 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc 0x0000000000002244 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc.prologue
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
0x0000000000002244 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc.builtins
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
0x0000000000002244 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc.fmul
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
0x0000000000002244 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc.fixed
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
0x0000000000002244 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.text.libgcc.mul
0x00000000000033d6 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
0x0000000000002244 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.div
0x00000000000033d6 0x28 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
0x00000000000033d6 __udivmodhi4
.text.libgcc 0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
0x0000000000002244 0x28 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
0x0000000000002244 __udivmodhi4
.text.libgcc 0x000000000000226c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.prologue
0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
0x000000000000226c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.builtins
0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
0x000000000000226c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.fmul
0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
0x000000000000226c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.fixed
0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
0x000000000000226c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.text.libgcc.mul
0x00000000000033fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
0x000000000000226c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.div
0x00000000000033fe 0x28 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
0x00000000000033fe __divmodhi4
0x00000000000033fe _div
.text.libgcc 0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
0x000000000000226c 0x44 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
0x000000000000226c __udivmodsi4
.text.libgcc 0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.prologue
0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.builtins
0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.fmul
0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.fixed
0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.text.libgcc.mul
0x0000000000003426 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.div
0x0000000000003426 0x44 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
0x0000000000003426 __udivmodsi4
.text.libgcc 0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc 0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.prologue
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.builtins
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.fmul
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.fixed
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc.mul
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc.div
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.text.libgcc 0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
0x00000000000022b0 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc 0x00000000000022b0 0xc /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
0x00000000000022b0 __tablejump2__
.text.libgcc.prologue
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc.builtins
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc.fmul
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc.fixed
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc.mul
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.div
0x000000000000346a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.text.libgcc 0x000000000000346a 0xc /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
0x000000000000346a __tablejump2__
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc 0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.prologue
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.builtins
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.fmul
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.fixed
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc.mul
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.div
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc 0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc 0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.prologue
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.builtins
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.fmul
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.fixed
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
0x00000000000022bc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc.mul
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
0x00000000000022bc 0x16 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
0x00000000000022bc __muluhisi3
.text.libgcc.div
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc 0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
0x00000000000022d2 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc 0x00000000000022d2 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc.prologue
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
0x00000000000022d2 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc.builtins
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
0x00000000000022d2 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc.fmul
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
0x00000000000022d2 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc.fixed
0x0000000000003476 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
0x00000000000022d2 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc.mul
0x0000000000003476 0x1e /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
0x0000000000003476 __umulhisi3
0x00000000000022d2 0xa0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
0x00000000000022d2 __muldi3
.text.libgcc.div
0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc 0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
0x0000000000002372 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
.text.libgcc 0x0000000000002372 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
.text.libgcc.prologue
0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
0x0000000000002372 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
.text.libgcc.builtins
0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
0x0000000000002372 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
.text.libgcc.fmul
0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
0x0000000000002372 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
.text.libgcc.fixed
0x0000000000003494 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
0x0000000000002372 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
.text.libgcc.mul
0x0000000000003494 0x16 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
0x0000000000003494 __muluhisi3
0x0000000000002372 0x12 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
0x0000000000002372 __muldi3_6
.text.libgcc.div
0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.text.libgcc 0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
0x0000000000002384 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
.text.libgcc 0x0000000000002384 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
.text.libgcc.prologue
0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
0x0000000000002384 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
.text.libgcc.builtins
0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
0x0000000000002384 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
.text.libgcc.fmul
0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
0x0000000000002384 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
.text.libgcc.fixed
0x00000000000034aa 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
0x0000000000002384 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
.text.libgcc.mul
0x0000000000002384 0x56 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
0x0000000000002384 __umulsidi3
0x0000000000002386 __umulsidi3_helper
.text.libgcc.div
0x00000000000023da 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
.text.libgcc 0x00000000000023da 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
.text.libgcc.prologue
0x00000000000023da 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
.text.libgcc.builtins
0x00000000000023da 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
.text.libgcc.fmul
0x00000000000023da 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
.text.libgcc.fixed
0x00000000000023da 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
.text.libgcc.mul
0x00000000000023da 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
.text.libgcc.div
0x00000000000023da 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
.text.libgcc 0x00000000000023da 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
.text.libgcc.prologue
0x00000000000023da 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
.text.libgcc.builtins
0x00000000000023da 0x32 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
0x00000000000023da __ashldi3
.text.libgcc.fmul
0x000000000000240c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
.text.libgcc.fixed
0x000000000000240c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
.text.libgcc.mul
0x000000000000240c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
.text.libgcc.div
0x000000000000240c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
.text.libgcc 0x000000000000240c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
.text.libgcc.prologue
0x000000000000240c 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
.text.libgcc.builtins
0x000000000000240c 0x3c /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
0x000000000000240c __ashrdi3
0x0000000000002410 __lshrdi3
.text.libgcc.fmul
0x0000000000002448 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
.text.libgcc.fixed
0x0000000000002448 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
.text.libgcc.mul
0x0000000000002448 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
.text.libgcc.div
0x0000000000002448 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
.text.libgcc 0x0000000000002448 0x12 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
0x0000000000002448 __adddi3
.text.libgcc.prologue
0x000000000000245a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
.text.libgcc.builtins
0x000000000000245a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
.text.libgcc.fmul
0x000000000000245a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
.text.libgcc.fixed
0x000000000000245a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
.text.libgcc.mul
0x000000000000245a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
.text.libgcc.div
0x000000000000245a 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
.text.libgcc 0x000000000000245a 0x18 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
0x000000000000245a __adddi3_s8
.text.libgcc.prologue
0x0000000000002472 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
.text.libgcc.builtins
0x0000000000002472 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
.text.libgcc.fmul
0x0000000000002472 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
.text.libgcc.fixed
0x0000000000002472 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
.text.libgcc.mul
0x0000000000002472 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
.text.libgcc.div
0x0000000000002472 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
.text.libgcc 0x0000000000002472 0x12 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
0x0000000000002472 __subdi3
.text.libgcc.prologue
0x0000000000002484 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
.text.libgcc.builtins
0x0000000000002484 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
.text.libgcc.fmul
0x0000000000002484 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
.text.libgcc.fixed
0x0000000000002484 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
.text.libgcc.mul
0x0000000000002484 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
.text.libgcc.div
0x0000000000002484 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
.text.libgcc 0x0000000000002484 0x12 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
0x0000000000002484 __cmpdi2
.text.libgcc.prologue
0x0000000000002496 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
.text.libgcc.builtins
0x0000000000002496 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
.text.libgcc.fmul
0x0000000000002496 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
.text.libgcc.fixed
0x0000000000002496 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
.text.libgcc.mul
0x0000000000002496 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
.text.libgcc.div
0x0000000000002496 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
.text.libgcc 0x0000000000002496 0x18 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
0x0000000000002496 __cmpdi2_s8
.text.libgcc.prologue
0x00000000000024ae 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
.text.libgcc.builtins
0x00000000000024ae 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
.text.libgcc.fmul
0x00000000000024ae 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
.text.libgcc.fixed
0x00000000000024ae 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
.text.libgcc.mul
0x00000000000024ae 0x1e /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
0x00000000000024ae __umulhisi3
.text.libgcc.div
0x00000000000024cc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc 0x00000000000024cc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc.prologue
0x00000000000024cc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc.builtins
0x00000000000024cc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc.fmul
0x00000000000024cc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.libgcc.fixed
0x00000000000024cc 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.text.avr-libc
0x00000000000034aa 0x12 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp_P.o)
0x00000000000034aa strcmp_P
0x00000000000024cc 0x16 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
0x00000000000024cc strchr
.text.avr-libc
0x00000000000034bc 0x1c /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp_P.o)
0x00000000000034bc strncmp_P
.text.avr-libc
0x00000000000034d8 0x12 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memcpy.o)
0x00000000000034d8 memcpy
.text.avr-libc
0x00000000000034ea 0xe /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memset.o)
0x00000000000034ea memset
.text.avr-libc
0x00000000000034f8 0x16 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
0x00000000000034f8 strchr
.text.avr-libc
0x000000000000350e 0x12 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp.o)
0x000000000000350e strcmp
.text.avr-libc
0x0000000000003520 0x1c /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
0x0000000000003520 strncmp
.text.avr-libc
0x000000000000353c 0x1e /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncpy.o)
0x000000000000353c strncpy
.text.avr-libc
0x000000000000355a 0x16 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strrchr.o)
0x000000000000355a strrchr
0x0000000000003570 . = ALIGN (0x2)
0x00000000000024e2 0x1c /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
0x00000000000024e2 strncmp
0x00000000000024fe . = ALIGN (0x2)
*(.fini9)
.fini9 0x0000000000003570 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
0x0000000000003570 exit
0x0000000000003570 _exit
.fini9 0x00000000000024fe 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
0x00000000000024fe exit
0x00000000000024fe _exit
*(.fini9)
*(.fini8)
*(.fini8)
@ -514,39 +616,41 @@ END GROUP
*(.fini1)
*(.fini1)
*(.fini0)
.fini0 0x0000000000003570 0x4 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.fini0 0x00000000000024fe 0x4 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
*(.fini0)
0x0000000000003574 _etext = .
0x0000000000002502 _etext = .
.data 0x0000000000800100 0x10 load address 0x0000000000003574
.data 0x0000000000800100 0x10 load address 0x0000000000002502
0x0000000000800100 PROVIDE (__data_start, .)
*(.data)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.data 0x0000000000800100 0x0 partition.o
.data 0x0000000000800100 0x0 sd_raw.o
.data 0x0000000000800100 0x0 uart.o
.data 0x0000000000800100 0x0 byteordering.o
.data 0x0000000000800100 0x0 lcd.o
.data 0x0000000000800100 0x0 fat.o
.data 0x0000000000800100 0x0 main.o
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp_P.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp_P.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memcpy.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memset.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncpy.o)
.data 0x0000000000800100 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strrchr.o)
*(.data*)
*(.rodata)
.rodata 0x0000000000800100 0xd fat.o
@ -559,46 +663,48 @@ END GROUP
0x0000000000800110 _edata = .
0x0000000000800110 PROVIDE (__data_end, .)
.bss 0x0000000000800110 0x2c8
.bss 0x0000000000800110 0xf5
0x0000000000800110 PROVIDE (__bss_start, .)
*(.bss)
.bss 0x0000000000800110 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega168.o
.bss 0x0000000000800110 0x11 partition.o
.bss 0x0000000000800121 0x206 sd_raw.o
.bss 0x0000000000800327 0x0 uart.o
.bss 0x0000000000800327 0x0 byteordering.o
.bss 0x0000000000800327 0xb1 fat.o
.bss 0x00000000008003d8 0x0 main.o
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_divmodhi4.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp_P.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp_P.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memcpy.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(memset.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strcmp.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncpy.o)
.bss 0x00000000008003d8 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strrchr.o)
.bss 0x0000000000800121 0x1 sd_raw.o
.bss 0x0000000000800122 0x0 byteordering.o
.bss 0x0000000000800122 0x0 lcd.o
.bss 0x0000000000800122 0xe3 fat.o
.bss 0x0000000000800205 0x0 main.o
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_mulsi3.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodhi4.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_udivmodsi4.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_exit.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_tablejump2.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_copy_data.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_clear_bss.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muluhisi3.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_muldi3_6.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulsidi3.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashldi3.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_ashrdi3.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_adddi3_s8.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_subdi3.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_cmpdi2_s8.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/avr5/libgcc.a(_umulhisi3.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strchr.o)
.bss 0x0000000000800205 0x0 /usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/libc.a(strncmp.o)
*(.bss*)
*(COMMON)
0x00000000008003d8 PROVIDE (__bss_end, .)
0x0000000000003574 __data_load_start = LOADADDR (.data)
0x0000000000003584 __data_load_end = (__data_load_start + SIZEOF (.data))
0x0000000000800205 PROVIDE (__bss_end, .)
0x0000000000002502 __data_load_start = LOADADDR (.data)
0x0000000000002512 __data_load_end = (__data_load_start + SIZEOF (.data))
.noinit 0x00000000008003d8 0x0
.noinit 0x0000000000800205 0x0
[!provide] PROVIDE (__noinit_start, .)
*(.noinit*)
[!provide] PROVIDE (__noinit_end, .)
0x00000000008003d8 _end = .
0x0000000000800205 _end = .
[!provide] PROVIDE (__heap_start, .)
.eeprom 0x0000000000810000 0x0
@ -620,23 +726,23 @@ END GROUP
.user_signatures
*(.user_signatures*)
.stab 0x0000000000000000 0x67bc
.stab 0x0000000000000000 0x4b3c
*(.stab)
.stab 0x0000000000000000 0x6e4 partition.o
.stab 0x00000000000006e4 0x1350 sd_raw.o
0x1500 (size before relaxing)
.stab 0x0000000000001a34 0xa20 uart.o
0xbf4 (size before relaxing)
.stab 0x0000000000002454 0x414 byteordering.o
.stab 0x00000000000006e4 0x129c sd_raw.o
0x144c (size before relaxing)
.stab 0x0000000000001980 0x414 byteordering.o
0x594 (size before relaxing)
.stab 0x0000000000002868 0x2fdc fat.o
0x31f8 (size before relaxing)
.stab 0x0000000000005844 0xf78 main.o
0x1200 (size before relaxing)
.stab 0x0000000000001d94 0xe34 lcd.o
0x1008 (size before relaxing)
.stab 0x0000000000002bc8 0x1b0c fat.o
0x1d28 (size before relaxing)
.stab 0x00000000000046d4 0x468 main.o
0x6fc (size before relaxing)
.stabstr 0x0000000000000000 0x2a7b
.stabstr 0x0000000000000000 0x2390
*(.stabstr)
.stabstr 0x0000000000000000 0x2a7b partition.o
.stabstr 0x0000000000000000 0x2390 partition.o
.stab.excl
*(.stab.excl)
@ -655,8 +761,8 @@ END GROUP
.comment 0x0000000000000000 0x11 partition.o
0x12 (size before relaxing)
.comment 0x0000000000000011 0x12 sd_raw.o
.comment 0x0000000000000011 0x12 uart.o
.comment 0x0000000000000011 0x12 byteordering.o
.comment 0x0000000000000011 0x12 lcd.o
.comment 0x0000000000000011 0x12 fat.o
.comment 0x0000000000000011 0x12 main.o

View File

@ -34,7 +34,7 @@ extern "C"
*
* Set to 1 to enable MMC/SD write support, set to 0 to disable it.
*/
#define SD_RAW_WRITE_SUPPORT 1
#define SD_RAW_WRITE_SUPPORT 0
/**
* \ingroup sd_raw_config
@ -65,7 +65,7 @@ extern "C"
* Set to 1 to support so-called SDHC memory cards, i.e. SD
* cards with more than 2 gigabytes of memory.
*/
#define SD_RAW_SDHC 0
#define SD_RAW_SDHC 1
/**
* @}

View File

@ -1,198 +0,0 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <stdio.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/sfr_defs.h>
#include <avr/sleep.h>
#include "uart.h"
/* some mcus have multiple uarts */
#ifdef UDR0
#define UBRRH UBRR0H
#define UBRRL UBRR0L
#define UDR UDR0
#define UCSRA UCSR0A
#define UDRE UDRE0
#define RXC RXC0
#define UCSRB UCSR0B
#define RXEN RXEN0
#define TXEN TXEN0
#define RXCIE RXCIE0
#define UCSRC UCSR0C
#define URSEL
#define UCSZ0 UCSZ00
#define UCSZ1 UCSZ01
#define UCSRC_SELECT 0
#else
#define UCSRC_SELECT (1 << URSEL)
#endif
#ifndef USART_RXC_vect
#if defined(UART0_RX_vect)
#define USART_RXC_vect UART0_RX_vect
#elif defined(UART_RX_vect)
#define USART_RXC_vect UART_RX_vect
#elif defined(USART0_RX_vect)
#define USART_RXC_vect USART0_RX_vect
#elif defined(USART_RX_vect)
#define USART_RXC_vect USART_RX_vect
#elif defined(USART0_RXC_vect)
#define USART_RXC_vect USART0_RXC_vect
#elif defined(USART_RXC_vect)
#define USART_RXC_vect USART_RXC_vect
#else
#error "Uart receive complete interrupt not defined!"
#endif
#endif
#define BAUD 9600UL
#define UBRRVAL (F_CPU/(BAUD*16)-1)
#define USE_SLEEP 1
void uart_init()
{
/* set baud rate */
UBRRH = UBRRVAL >> 8;
UBRRL = UBRRVAL & 0xff;
/* set frame format: 8 bit, no parity, 1 bit */
UCSRC = UCSRC_SELECT | (1 << UCSZ1) | (1 << UCSZ0);
/* enable serial receiver and transmitter */
#if !USE_SLEEP
UCSRB = (1 << RXEN) | (1 << TXEN);
#else
UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
#endif
}
void uart_putc(uint8_t c)
{
if(c == '\n')
uart_putc('\r');
/* wait until transmit buffer is empty */
while(!(UCSRA & (1 << UDRE)));
/* send next byte */
UDR = c;
}
void uart_putc_hex(uint8_t b)
{
/* upper nibble */
if((b >> 4) < 0x0a)
uart_putc((b >> 4) + '0');
else
uart_putc((b >> 4) - 0x0a + 'a');
/* lower nibble */
if((b & 0x0f) < 0x0a)
uart_putc((b & 0x0f) + '0');
else
uart_putc((b & 0x0f) - 0x0a + 'a');
}
void uart_putw_hex(uint16_t w)
{
uart_putc_hex((uint8_t) (w >> 8));
uart_putc_hex((uint8_t) (w & 0xff));
}
void uart_putdw_hex(uint32_t dw)
{
uart_putw_hex((uint16_t) (dw >> 16));
uart_putw_hex((uint16_t) (dw & 0xffff));
}
void uart_putw_dec(uint16_t w)
{
uint16_t num = 10000;
uint8_t started = 0;
while(num > 0)
{
uint8_t b = w / num;
if(b > 0 || started || num == 1)
{
uart_putc('0' + b);
started = 1;
}
w -= b * num;
num /= 10;
}
}
void uart_putdw_dec(uint32_t dw)
{
uint32_t num = 1000000000;
uint8_t started = 0;
while(num > 0)
{
uint8_t b = dw / num;
if(b > 0 || started || num == 1)
{
uart_putc('0' + b);
started = 1;
}
dw -= b * num;
num /= 10;
}
}
void uart_puts(const char* str)
{
while(*str)
uart_putc(*str++);
}
void uart_puts_p(PGM_P str)
{
while(1)
{
uint8_t b = pgm_read_byte_near(str++);
if(!b)
break;
uart_putc(b);
}
}
uint8_t uart_getc()
{
/* wait until receive buffer is full */
#if USE_SLEEP
uint8_t sreg = SREG;
sei();
while(!(UCSRA & (1 << RXC)))
sleep_mode();
SREG = sreg;
#else
while(!(UCSRA & (1 << RXC)));
#endif
uint8_t b = UDR;
if(b == '\r')
b = '\n';
return b;
}
EMPTY_INTERRUPT(USART_RXC_vect)

View File

@ -1,42 +0,0 @@
/*
* Copyright (c) 2006-2012 by Roland Riegel <feedback@roland-riegel.de>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef UART_H
#define UART_H
#include <stdint.h>
#include <avr/pgmspace.h>
#ifdef __cplusplus
extern "C"
{
#endif
void uart_init();
void uart_putc(uint8_t c);
void uart_putc_hex(uint8_t b);
void uart_putw_hex(uint16_t w);
void uart_putdw_hex(uint32_t dw);
void uart_putw_dec(uint16_t w);
void uart_putdw_dec(uint32_t dw);
void uart_puts(const char* str);
void uart_puts_p(PGM_P str);
uint8_t uart_getc();
#ifdef __cplusplus
}
#endif
#endif

Binary file not shown.