⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 This project provides a general purpose library which implements read and write support for MMC, SD
💻 C
📖 第 1 页 / 共 2 页
字号:
                /* 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;                while(fat_read_file(fd, buffer, sizeof(buffer)) > 0)                {                    uart_putdw_hex(offset);                    uart_putc(':');                    for(uint8_t i = 0; i < 8; ++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("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 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_SUPPORTvoid 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -