Subversion Repositories HomeAutomation

Rev

Rev 233 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 233 Rev 254
Line 33... Line 33...
33
    // Re-enable interrupts (if they were ever enabled).
33
    // Re-enable interrupts (if they were ever enabled).
34
 
34
 
35
    SREG = sreg;
35
    SREG = sreg;
36
}
36
}
37
 
37
 
-
 
38
#ifdef FLASH_LOAD_BUFFER
-
 
39
void flash_load_buffer(uint16_t addr) BOOTLOADER;
38
void flash_load_buffer(uint16_t addr) {
40
void flash_load_buffer(uint16_t addr) {
39
    //TODO: Load current flash page contents into temporary buffer to implement
41
    //TODO: Load current flash page contents into temporary buffer to implement
40
    // flash read-modify-writes with word granularity. (If possible, the data
42
    // flash read-modify-writes with word granularity. (If possible, the data
41
    // sheet is a little fuzzy about this.)
43
    // sheet is a little fuzzy about this.)
42
    uint8_t i;
44
    uint8_t i;
Line 46... Line 48...
46
    for (i = 0; i < SPM_PAGESIZE; i += 2) {
48
    for (i = 0; i < SPM_PAGESIZE; i += 2) {
47
        data = pgm_read_word(page + i);
49
        data = pgm_read_word(page + i);
48
        boot_page_fill(page + i, data);
50
        boot_page_fill(page + i, data);
49
    }
51
    }
50
}
52
}
-
 
53
#endif
51
 
54
 
52
void flash_write_word(uint16_t addr, uint16_t word) {
55
void flash_write_word(uint16_t addr, uint16_t word) {
53
   
56
   
54
    if ((addr / SPM_PAGESIZE) != (flash_prev_addr / SPM_PAGESIZE)) {
57
    if ((addr / SPM_PAGESIZE) != (flash_prev_addr / SPM_PAGESIZE)) {
55
        flash_flush_buffer();
58
        flash_flush_buffer();
-
 
59
#ifdef FLASH_LOAD_BUFFER
56
        flash_load_buffer(addr);
60
        flash_load_buffer(addr);
-
 
61
#endif
57
    }
62
    }
58
   
63
   
59
    boot_page_fill(addr, word);
64
    boot_page_fill(addr, word);
60
    flash_prev_addr = addr;
65
    flash_prev_addr = addr;
61
    flash_buffer_dirty = 1;
66
    flash_buffer_dirty = 1;
Line 63... Line 68...
63
 
68
 
64
void flash_init() {
69
void flash_init() {
65
    flash_prev_addr = 0xffff;
70
    flash_prev_addr = 0xffff;
66
    flash_buffer_dirty = 0;
71
    flash_buffer_dirty = 0;
67
}
72
}
-
 
73
 
-
 
74
#ifdef FLASH_COPY_DATA
-
 
75
void flash_copy_data(uint16_t src, uint16_t dst, uint16_t len) {
-
 
76
    uint16_t i;
-
 
77
    flash_init();
-
 
78
    for (i = 0; i < len; i+=2) {
-
 
79
        flash_write_word(dst + i, pgm_read_word(src + i));
-
 
80
    }
-
 
81
    flash_flush_buffer();
-
 
82
}
-
 
83
#endif