25 #define REG_NAME_WIDTH (12)
28 #define FLASH_BANK_BASE_S 0x00400000
29 #define FLASH_BANK_BASE_C 0x01000000
32 #define FLASH_BANK0_BASE_SD FLASH_BANK_BASE_S
34 #define FLASH_BANK1_BASE_1024K_SD (FLASH_BANK0_BASE_SD+(1024*1024/2))
36 #define FLASH_BANK1_BASE_2048K_SD (FLASH_BANK0_BASE_SD+(2048*1024/2))
39 #define FLASH_BANK0_BASE_C32 FLASH_BANK_BASE_C
40 #define FLASH_BANK1_BASE_C32 (FLASH_BANK_BASE_C+(2048*1024/2))
42 #define AT91C_EFC_FCMD_GETD (0x0)
43 #define AT91C_EFC_FCMD_WP (0x1)
44 #define AT91C_EFC_FCMD_WPL (0x2)
45 #define AT91C_EFC_FCMD_EWP (0x3)
46 #define AT91C_EFC_FCMD_EWPL (0x4)
47 #define AT91C_EFC_FCMD_EA (0x5)
50 #define AT91C_EFC_FCMD_EPA (0x7)
51 #define AT91C_EFC_FCMD_SLB (0x8)
52 #define AT91C_EFC_FCMD_CLB (0x9)
53 #define AT91C_EFC_FCMD_GLB (0xA)
54 #define AT91C_EFC_FCMD_SFB (0xB)
55 #define AT91C_EFC_FCMD_CFB (0xC)
56 #define AT91C_EFC_FCMD_GFB (0xD)
57 #define AT91C_EFC_FCMD_STUI (0xE)
58 #define AT91C_EFC_FCMD_SPUI (0xF)
60 #define OFFSET_EFC_FMR 0
61 #define OFFSET_EFC_FCR 4
62 #define OFFSET_EFC_FSR 8
63 #define OFFSET_EFC_FRR 12
65 static float _tomhz(uint32_t freq_hz)
67 return ((
float)freq_hz) / 1000000.0;
86 #define SAM4_CHIPID_CIDR (0x400E0740)
88 #define SAM4_CHIPID_EXID (0x400E0744)
91 #define SAM4_PMC_BASE (0x400E0400)
92 #define SAM4_PMC_SCSR (SAM4_PMC_BASE + 0x0008)
94 #define SAM4_PMC_PCSR (SAM4_PMC_BASE + 0x0018)
96 #define SAM4_CKGR_UCKR (SAM4_PMC_BASE + 0x001c)
98 #define SAM4_CKGR_MOR (SAM4_PMC_BASE + 0x0020)
100 #define SAM4_CKGR_MCFR (SAM4_PMC_BASE + 0x0024)
102 #define SAM4_CKGR_PLLAR (SAM4_PMC_BASE + 0x0028)
104 #define SAM4_PMC_MCKR (SAM4_PMC_BASE + 0x0030)
106 #define SAM4_PMC_PCK0 (SAM4_PMC_BASE + 0x0040)
108 #define SAM4_PMC_PCK1 (SAM4_PMC_BASE + 0x0044)
110 #define SAM4_PMC_PCK2 (SAM4_PMC_BASE + 0x0048)
112 #define SAM4_PMC_SR (SAM4_PMC_BASE + 0x0068)
114 #define SAM4_PMC_IMR (SAM4_PMC_BASE + 0x006c)
116 #define SAM4_PMC_FSMR (SAM4_PMC_BASE + 0x0070)
118 #define SAM4_PMC_FSPR (SAM4_PMC_BASE + 0x0074)
157 #define SAM4_N_NVM_BITS 3
162 #define SAM4_MAX_FLASH_BANKS 2
224 .name =
"at91sam4c32e",
225 .total_flash_size = 2024 * 1024,
226 .total_sram_size = 256 * 1024,
237 .controller_address = 0x400e0a00,
238 .flash_wait_states = 5,
240 .size_bytes = 1024 * 1024,
252 .controller_address = 0x400e0c00,
253 .flash_wait_states = 5,
255 .size_bytes = 1024 * 1024,
264 .chipid_cidr = 0xA64D0EE0,
265 .name =
"at91sam4c32c",
266 .total_flash_size = 2024 * 1024,
267 .total_sram_size = 256 * 1024,
278 .controller_address = 0x400e0a00,
279 .flash_wait_states = 5,
281 .size_bytes = 1024 * 1024,
293 .controller_address = 0x400e0c00,
294 .flash_wait_states = 5,
296 .size_bytes = 1024 * 1024,
305 .chipid_cidr = 0xA64C0CE0,
306 .name =
"at91sam4c16c",
307 .total_flash_size = 1024 * 1024,
308 .total_sram_size = 128 * 1024,
319 .controller_address = 0x400e0a00,
320 .flash_wait_states = 5,
322 .size_bytes = 1024 * 1024,
338 .chipid_cidr = 0xA64C0AE0,
339 .name =
"at91sam4c8c",
340 .total_flash_size = 512 * 1024,
341 .total_sram_size = 128 * 1024,
352 .controller_address = 0x400e0a00,
353 .flash_wait_states = 5,
355 .size_bytes = 512 * 1024,
371 .chipid_cidr = 0xA64C0CE5,
372 .name =
"at91sam4c4c",
373 .total_flash_size = 256 * 1024,
374 .total_sram_size = 128 * 1024,
385 .controller_address = 0x400e0a00,
386 .flash_wait_states = 5,
388 .size_bytes = 256 * 1024,
406 .chipid_cidr = 0xA3CC0CE0,
407 .name =
"at91sam4e16e",
408 .total_flash_size = 1024 * 1024,
409 .total_sram_size = 128 * 1024,
420 .controller_address = 0x400e0a00,
421 .flash_wait_states = 5,
423 .size_bytes = 1024 * 1024,
441 .chipid_cidr = 0x293B0AE0,
442 .name =
"at91sam4n8a",
443 .total_flash_size = 512 * 1024,
444 .total_sram_size = 64 * 1024,
455 .controller_address = 0x400e0a00,
456 .flash_wait_states = 5,
458 .size_bytes = 512 * 1024,
474 .chipid_cidr = 0x294B0AE0,
475 .name =
"at91sam4n8b",
476 .total_flash_size = 512 * 1024,
477 .total_sram_size = 64 * 1024,
488 .controller_address = 0x400e0a00,
489 .flash_wait_states = 5,
491 .size_bytes = 512 * 1024,
507 .chipid_cidr = 0x295B0AE0,
508 .name =
"at91sam4n8c",
509 .total_flash_size = 512 * 1024,
510 .total_sram_size = 64 * 1024,
521 .controller_address = 0x400e0a00,
522 .flash_wait_states = 5,
524 .size_bytes = 512 * 1024,
540 .chipid_cidr = 0x29460CE0,
541 .name =
"at91sam4n16b",
542 .total_flash_size = 1024 * 1024,
543 .total_sram_size = 80 * 1024,
554 .controller_address = 0x400e0a00,
555 .flash_wait_states = 5,
557 .size_bytes = 1024 * 1024,
573 .chipid_cidr = 0x29560CE0,
574 .name =
"at91sam4n16c",
575 .total_flash_size = 1024 * 1024,
576 .total_sram_size = 80 * 1024,
587 .controller_address = 0x400e0a00,
588 .flash_wait_states = 5,
590 .size_bytes = 1024 * 1024,
608 .chipid_cidr = 0x28AC0CE0,
609 .name =
"at91sam4s16c",
610 .total_flash_size = 1024 * 1024,
611 .total_sram_size = 128 * 1024,
622 .controller_address = 0x400e0a00,
623 .flash_wait_states = 5,
625 .size_bytes = 1024 * 1024,
641 .chipid_cidr = 0x28a70ce0,
642 .name =
"at91sam4sa16c",
643 .total_flash_size = 1024 * 1024,
644 .total_sram_size = 160 * 1024,
656 .controller_address = 0x400e0a00,
657 .flash_wait_states = 5,
659 .size_bytes = 1024 * 1024,
675 .chipid_cidr = 0x289C0CE0,
676 .name =
"at91sam4s16b",
677 .total_flash_size = 1024 * 1024,
678 .total_sram_size = 128 * 1024,
689 .controller_address = 0x400e0a00,
690 .flash_wait_states = 5,
692 .size_bytes = 1024 * 1024,
708 .chipid_cidr = 0x28970CE0,
709 .name =
"at91sam4sa16b",
710 .total_flash_size = 1024 * 1024,
711 .total_sram_size = 160 * 1024,
722 .controller_address = 0x400e0a00,
723 .flash_wait_states = 5,
725 .size_bytes = 1024 * 1024,
741 .chipid_cidr = 0x288C0CE0,
742 .name =
"at91sam4s16a",
743 .total_flash_size = 1024 * 1024,
744 .total_sram_size = 128 * 1024,
755 .controller_address = 0x400e0a00,
756 .flash_wait_states = 5,
758 .size_bytes = 1024 * 1024,
774 .chipid_cidr = 0x28AC0AE0,
775 .name =
"at91sam4s8c",
776 .total_flash_size = 512 * 1024,
777 .total_sram_size = 128 * 1024,
788 .controller_address = 0x400e0a00,
789 .flash_wait_states = 5,
791 .size_bytes = 512 * 1024,
807 .chipid_cidr = 0x289C0AE0,
808 .name =
"at91sam4s8b",
809 .total_flash_size = 512 * 1024,
810 .total_sram_size = 128 * 1024,
821 .controller_address = 0x400e0a00,
822 .flash_wait_states = 5,
824 .size_bytes = 512 * 1024,
840 .chipid_cidr = 0x288C0AE0,
841 .name =
"at91sam4s8a",
842 .total_flash_size = 512 * 1024,
843 .total_sram_size = 128 * 1024,
854 .controller_address = 0x400e0a00,
855 .flash_wait_states = 5,
857 .size_bytes = 512 * 1024,
874 .chipid_cidr = 0x28ab09e0,
875 .name =
"at91sam4s4c",
876 .total_flash_size = 256 * 1024,
877 .total_sram_size = 64 * 1024,
888 .controller_address = 0x400e0a00,
889 .flash_wait_states = 5,
891 .size_bytes = 256 * 1024,
908 .chipid_cidr = 0x289b09e0,
909 .name =
"at91sam4s4b",
910 .total_flash_size = 256 * 1024,
911 .total_sram_size = 64 * 1024,
922 .controller_address = 0x400e0a00,
923 .flash_wait_states = 5,
925 .size_bytes = 256 * 1024,
942 .chipid_cidr = 0x288b09e0,
943 .name =
"at91sam4s4a",
944 .total_flash_size = 256 * 1024,
945 .total_sram_size = 64 * 1024,
956 .controller_address = 0x400e0a00,
957 .flash_wait_states = 5,
959 .size_bytes = 256 * 1024,
976 .chipid_cidr = 0x28ab07e0,
977 .name =
"at91sam4s2c",
978 .total_flash_size = 128 * 1024,
979 .total_sram_size = 64 * 1024,
990 .controller_address = 0x400e0a00,
991 .flash_wait_states = 5,
993 .size_bytes = 128 * 1024,
1010 .chipid_cidr = 0x289b07e0,
1011 .name =
"at91sam4s2b",
1012 .total_flash_size = 128 * 1024,
1013 .total_sram_size = 64 * 1024,
1024 .controller_address = 0x400e0a00,
1025 .flash_wait_states = 5,
1027 .size_bytes = 128 * 1024,
1029 .sector_size = 8192,
1044 .chipid_cidr = 0x288b07e0,
1045 .name =
"at91sam4s2a",
1046 .total_flash_size = 128 * 1024,
1047 .total_sram_size = 64 * 1024,
1058 .controller_address = 0x400e0a00,
1059 .flash_wait_states = 5,
1061 .size_bytes = 128 * 1024,
1063 .sector_size = 8192,
1078 .chipid_cidr = 0x29a70ee0,
1079 .name =
"at91sam4sd32c",
1080 .total_flash_size = 2048 * 1024,
1081 .total_sram_size = 160 * 1024,
1093 .controller_address = 0x400e0a00,
1094 .flash_wait_states = 5,
1096 .size_bytes = 1024 * 1024,
1098 .sector_size = 8192,
1109 .controller_address = 0x400e0c00,
1110 .flash_wait_states = 5,
1112 .size_bytes = 1024 * 1024,
1114 .sector_size = 8192,
1122 .chipid_cidr = 0x29970ee0,
1123 .name =
"at91sam4sd32b",
1124 .total_flash_size = 2048 * 1024,
1125 .total_sram_size = 160 * 1024,
1137 .controller_address = 0x400e0a00,
1138 .flash_wait_states = 5,
1140 .size_bytes = 1024 * 1024,
1142 .sector_size = 8192,
1153 .controller_address = 0x400e0c00,
1154 .flash_wait_states = 5,
1156 .size_bytes = 1024 * 1024,
1158 .sector_size = 8192,
1166 .chipid_cidr = 0x29a70ce0,
1167 .name =
"at91sam4sd16c",
1168 .total_flash_size = 1024 * 1024,
1169 .total_sram_size = 160 * 1024,
1181 .controller_address = 0x400e0a00,
1182 .flash_wait_states = 5,
1184 .size_bytes = 512 * 1024,
1186 .sector_size = 8192,
1197 .controller_address = 0x400e0c00,
1198 .flash_wait_states = 5,
1200 .size_bytes = 512 * 1024,
1202 .sector_size = 8192,
1210 .chipid_cidr = 0x29970ce0,
1211 .name =
"at91sam4sd16b",
1212 .total_flash_size = 1024 * 1024,
1213 .total_sram_size = 160 * 1024,
1225 .controller_address = 0x400e0a00,
1226 .flash_wait_states = 5,
1228 .size_bytes = 512 * 1024,
1230 .sector_size = 8192,
1241 .controller_address = 0x400e0c00,
1242 .flash_wait_states = 5,
1244 .size_bytes = 512 * 1024,
1246 .sector_size = 8192,
1254 .chipid_cidr = 0x247e0ae0,
1255 .name =
"atsamg53n19",
1256 .total_flash_size = 512 * 1024,
1257 .total_sram_size = 96 * 1024,
1269 .controller_address = 0x400e0a00,
1270 .flash_wait_states = 5,
1272 .size_bytes = 512 * 1024,
1274 .sector_size = 8192,
1289 .chipid_cidr = 0x24470ae0,
1290 .name =
"atsamg55g19",
1291 .total_flash_size = 512 * 1024,
1292 .total_sram_size = 160 * 1024,
1304 .controller_address = 0x400e0a00,
1305 .flash_wait_states = 5,
1307 .size_bytes = 512 * 1024,
1309 .sector_size = 8192,
1323 .chipid_cidr = 0x24470ae1,
1324 .name =
"atsamg55g19b",
1325 .total_flash_size = 512 * 1024,
1326 .total_sram_size = 160 * 1024,
1338 .controller_address = 0x400e0a00,
1339 .flash_wait_states = 5,
1341 .size_bytes = 512 * 1024,
1343 .sector_size = 8192,
1357 .chipid_cidr = 0x24570ae0,
1358 .name =
"atsamg55j19",
1359 .total_flash_size = 512 * 1024,
1360 .total_sram_size = 160 * 1024,
1372 .controller_address = 0x400e0a00,
1373 .flash_wait_states = 5,
1375 .size_bytes = 512 * 1024,
1377 .sector_size = 8192,
1391 .chipid_cidr = 0x24570ae1,
1392 .name =
"atsamg55j19b",
1393 .total_flash_size = 512 * 1024,
1394 .total_sram_size = 160 * 1024,
1406 .controller_address = 0x400e0a00,
1407 .flash_wait_states = 5,
1409 .size_bytes = 512 * 1024,
1411 .sector_size = 8192,
1451 LOG_DEBUG(
"Status: 0x%08x (lockerror: %d, cmderror: %d, ready: %d)",
1453 ((
unsigned int)((*v >> 2) & 1)),
1454 ((
unsigned int)((*v >> 1) & 1)),
1455 ((
unsigned int)((*v >> 0) & 1)));
1474 LOG_DEBUG(
"Result: 0x%08x", ((
unsigned int)(rv)));
1479 unsigned int command,
unsigned int argument)
1498 n = (
private->size_bytes /
private->page_size);
1500 LOG_ERROR(
"*BUG*: Embedded flash has only %" PRIu32
" pages", n);
1505 if (argument >= private->chip->details.n_gpnvms) {
1506 LOG_ERROR(
"*BUG*: Embedded flash has only %d GPNVMs",
1507 private->chip->details.n_gpnvms);
1540 LOG_ERROR(
"flash controller(%d) is not ready! Error",
1541 private->bank_number);
1545 LOG_ERROR(
"Flash controller(%d) is not ready, attempting reset",
1546 private->bank_number);
1556 v = (0x5A << 24) | (argument << 8) |
command;
1557 LOG_DEBUG(
"Command: 0x%08x", ((
unsigned int)(v)));
1574 unsigned int argument,
1580 int64_t ms_now, ms_end;
1597 if (ms_now > ms_end) {
1602 }
while ((v & 1) == 0);
1622 private->chip->cfg.unique_id[0] = 0;
1623 private->chip->cfg.unique_id[1] = 0;
1624 private->chip->cfg.unique_id[2] = 0;
1625 private->chip->cfg.unique_id[3] = 0;
1632 for (x = 0; x < 4; x++) {
1634 private->bank->base + (x * 4),
1638 private->chip->cfg.unique_id[x] = v;
1642 LOG_DEBUG(
"End: R=%d, id = 0x%08x, 0x%08x, 0x%08x, 0x%08x",
1644 (
unsigned int)(private->chip->cfg.unique_id[0]),
1645 (
unsigned int)(private->chip->cfg.unique_id[1]),
1646 (
unsigned int)(private->chip->cfg.unique_id[2]),
1647 (
unsigned int)(private->chip->cfg.unique_id[3]));
1675 uint8_t erase_pages;
1676 switch (num_pages) {
1704 (first_page) | erase_pages,
1721 if (private->bank_number != 0) {
1722 LOG_ERROR(
"GPNVM only works with Bank0");
1726 if (
gpnvm >= private->chip->details.n_gpnvms) {
1727 LOG_ERROR(
"Invalid GPNVM %d, max: %d, ignored",
1728 gpnvm, private->chip->details.n_gpnvms);
1744 *puthere = (v >>
gpnvm) & 1;
1762 if (private->bank_number != 0) {
1763 LOG_ERROR(
"GPNVM only works with Bank0");
1767 if (
gpnvm >= private->chip->details.n_gpnvms) {
1768 LOG_ERROR(
"Invalid GPNVM %d, max: %d, ignored",
1769 gpnvm, private->chip->details.n_gpnvms);
1793 if (private->bank_number != 0) {
1794 LOG_ERROR(
"GPNVM only works with Bank0");
1798 if (
gpnvm >= private->chip->details.n_gpnvms) {
1799 LOG_ERROR(
"Invalid GPNVM %d, max: %d, ignored",
1800 gpnvm, private->chip->details.n_gpnvms);
1845 unsigned int start_sector,
1846 unsigned int end_sector)
1851 uint32_t pages_per_sector;
1853 pages_per_sector =
private->sector_size /
private->page_size;
1856 while (start_sector <= end_sector) {
1857 pg = start_sector * pages_per_sector;
1875 unsigned int start_sector,
1876 unsigned int end_sector)
1880 uint32_t pages_per_sector;
1883 pages_per_sector =
private->sector_size /
private->page_size;
1886 while (start_sector <= end_sector) {
1887 pg = start_sector * pages_per_sector;
1902 const char *regname,
1913 v = v & ((1 <<
width)-1);
1923 LOG_USER_N(
"\t%*s: %*" PRIu32
" [0x%0*" PRIx32
"] ",
1950 #define nvpsize2 nvpsize
1991 { 0x19,
"AT91SAM9xx Series" },
1992 { 0x29,
"AT91SAM9XExx Series" },
1993 { 0x34,
"AT91x34 Series" },
1994 { 0x37,
"CAP7 Series" },
1995 { 0x39,
"CAP9 Series" },
1996 { 0x3B,
"CAP11 Series" },
1997 { 0x3C,
"ATSAM4E" },
1998 { 0x40,
"AT91x40 Series" },
1999 { 0x42,
"AT91x42 Series" },
2000 { 0x43,
"SAMG51 Series"
2002 { 0x44,
"SAMG55 Series (49-pin WLCSP)" },
2003 { 0x45,
"SAMG55 Series (64-pin)" },
2004 { 0x47,
"SAMG53 Series"
2006 { 0x55,
"AT91x55 Series" },
2007 { 0x60,
"AT91SAM7Axx Series" },
2008 { 0x61,
"AT91SAM7AQxx Series" },
2009 { 0x63,
"AT91x63 Series" },
2010 { 0x64,
"SAM4CxxC (100-pin version)" },
2011 { 0x66,
"SAM4CxxE (144-pin version)" },
2012 { 0x70,
"AT91SAM7Sxx Series" },
2013 { 0x71,
"AT91SAM7XCxx Series" },
2014 { 0x72,
"AT91SAM7SExx Series" },
2015 { 0x73,
"AT91SAM7Lxx Series" },
2016 { 0x75,
"AT91SAM7Xxx Series" },
2017 { 0x76,
"AT91SAM7SLxx Series" },
2018 { 0x80,
"ATSAM3UxC Series (100-pin version)" },
2019 { 0x81,
"ATSAM3UxE Series (144-pin version)" },
2020 { 0x83,
"ATSAM3A/SAM4A xC Series (100-pin version)"},
2021 { 0x84,
"ATSAM3X/SAM4X xC Series (100-pin version)"},
2022 { 0x85,
"ATSAM3X/SAM4X xE Series (144-pin version)"},
2023 { 0x86,
"ATSAM3X/SAM4X xG Series (208/217-pin version)" },
2024 { 0x88,
"ATSAM3S/SAM4S xA Series (48-pin version)" },
2025 { 0x89,
"ATSAM3S/SAM4S xB Series (64-pin version)" },
2026 { 0x8A,
"ATSAM3S/SAM4S xC Series (100-pin version)"},
2027 { 0x92,
"AT91x92 Series" },
2028 { 0x93,
"ATSAM3NxA Series (48-pin version)" },
2029 { 0x94,
"ATSAM3NxB Series (64-pin version)" },
2030 { 0x95,
"ATSAM3NxC Series (100-pin version)" },
2031 { 0x98,
"ATSAM3SDxA Series (48-pin version)" },
2032 { 0x99,
"ATSAM3SDxB Series (64-pin version)" },
2033 { 0x9A,
"ATSAM3SDxC Series (100-pin version)" },
2034 { 0xA5,
"ATSAM5A" },
2035 { 0xF0,
"AT75Cxx Series" },
2041 "romless or onchip flash",
2042 "embedded flash memory",
2043 "rom(nvpsiz) + embedded flash (nvpsiz2)",
2044 "sram emulating flash",
2059 "4 MHz",
"8 MHz",
"12 MHz",
"reserved"
2095 LOG_USER(
"(startup clks, time= %f uSecs)",
2096 ((
float)(v * 1000000)) / ((
float)(chip->
cfg.
slow_freq)));
2099 v ?
"external xtal" :
"internal RC");
2102 LOG_USER(
"(clock failure enabled: %s)",
2157 LOG_USER(
"(%3.03f Mhz (%" PRIu32
".%03" PRIu32
"khz slowclk)",
2165 uint32_t mula, diva;
2173 LOG_USER(
"\tPLLA Freq: (Disabled,mula = 0)");
2175 LOG_USER(
"\tPLLA Freq: (Disabled,diva = 0)");
2176 else if (diva >= 1) {
2178 LOG_USER(
"\tPLLA Freq: %3.03f MHz",
2185 uint32_t css, pres, fin = 0;
2187 const char *cp =
NULL;
2205 fin = 480 * 1000 * 1000;
2209 cp =
"upll (*ERROR* UPLL is disabled)";
2221 switch (pres & 0x07) {
2224 cp =
"selected clock";
2265 LOG_USER(
"\t\tResult CPU Freq: %3.03f",
2301 #define SAM4_ENTRY(NAME, FUNC) { .address = SAM4_ ## NAME, .struct_offset = offsetof( \
2303 NAME), # NAME, FUNC }
2328 return bank->driver_priv;
2346 possible = ((uint32_t *)(
void *)(((
char *)(&(chip->
cfg))) +
reg->struct_offset));
2349 if (possible == goes_here) {
2373 LOG_ERROR(
"Cannot read SAM4 register: %s @ 0x%08" PRIx32
", Err: %d",
2389 LOG_ERROR(
"Cannot read SAM4 register: %s @ 0x%08" PRIx32
", Error: %d",
2414 LOG_USER(
"%*s: [0x%08" PRIx32
"] -> 0x%08" PRIx32,
2419 if (
reg->explain_func)
2420 (*(
reg->explain_func))(chip);
2430 LOG_USER(
" UniqueId: 0x%08" PRIx32
" 0x%08" PRIx32
" 0x%08" PRIx32
" 0x%08"PRIx32,
2442 uint32_t v[4] = {0};
2457 if (!(private->probed))
2466 for (x = 0; x <
private->nsectors; x++)
2467 bank->sectors[x].is_protected = (!!(v[x >> 5] & (1 << (x % 32))));
2487 chip = calloc(1,
sizeof(
struct sam4_chip));
2502 switch (
bank->base) {
2508 bank->bank_number = 0;
2518 bank->bank_number = 1;
2525 "[at91sam4s series] )",
2560 while (details->
name) {
2562 if (details->
chipid_cidr == (private->chip->cfg.CHIPID_CIDR & 0xFFFFFFE0))
2567 if (!details->
name) {
2568 LOG_ERROR(
"SAM4 ChipID 0x%08x not found in table (perhaps you can ID this chip?)",
2569 (
unsigned int)(private->chip->cfg.CHIPID_CIDR));
2571 LOG_INFO(
"SAM4 CHIPID_CIDR: 0x%08" PRIx32
" decodes as follows",
2572 private->chip->cfg.CHIPID_CIDR);
2583 chip =
private->chip;
2596 memcpy(&(private->chip->details),
2598 sizeof(private->chip->details));
2615 int k =
bank->size / 1024;
2622 private->chip->details.name,
2623 private->bank_number,
2644 LOG_ERROR(
"Invalid/unknown bank number");
2653 if (private->chip->probed)
2662 if (
bank->base == private->chip->details.bank[x].base_address) {
2663 bank->size =
private->chip->details.bank[x].size_bytes;
2671 if (!
bank->sectors) {
2672 bank->sectors = calloc(private->nsectors, (
sizeof((
bank->sectors)[0])));
2673 if (!
bank->sectors) {
2677 bank->num_sectors =
private->nsectors;
2679 for (
unsigned int x = 0; x <
bank->num_sectors; x++) {
2680 bank->sectors[x].size =
private->sector_size;
2681 bank->sectors[x].offset = x * (
private->sector_size);
2683 bank->sectors[x].is_erased = -1;
2684 bank->sectors[x].is_protected = -1;
2688 private->probed =
true;
2695 private->bank_number, private->chip->details.n_banks);
2696 if ((private->bank_number + 1) == private->chip->details.n_banks) {
2710 if (
private && private->probed)
2739 if (!(private->probed))
2742 if ((first == 0) && ((last + 1) == private->nsectors)) {
2747 LOG_INFO(
"sam4 does not auto-erase while programming (Erasing relevant sectors)");
2748 LOG_INFO(
"sam4 First: 0x%08x Last: 0x%08x", first, last);
2749 for (
unsigned int i = first; i <= last; i++) {
2752 LOG_INFO(
"Erasing sector: 0x%08x", i);
2754 LOG_ERROR(
"SAM4: Error performing Erase page @ lock region number %u",
2757 LOG_ERROR(
"SAM4: Lock Region %u is locked", i);
2761 LOG_ERROR(
"SAM4: Flash Command error @lock region %u", i);
2782 if (!(private->probed))
2800 adr = pagenum *
private->page_size;
2801 adr = adr +
private->base_address;
2806 private->page_size / 4,
2809 LOG_ERROR(
"SAM4: Flash program failed to read page phys address: 0x%08x",
2810 (
unsigned int)(adr));
2820 r =
target_read_u32(private->chip->target, private->controller_address, &fmr);
2822 LOG_ERROR(
"Error Read failed: read flash mode register");
2830 fmr |= (
private->flash_wait_states << 8);
2832 LOG_DEBUG(
"Flash Mode: 0x%08x", ((
unsigned int)(fmr)));
2833 r =
target_write_u32(private->bank->target, private->controller_address, fmr);
2835 LOG_ERROR(
"Error Write failed: set flash mode register");
2846 adr = pagenum *
private->page_size;
2847 adr = (adr +
private->base_address);
2852 LOG_DEBUG(
"Wr Page %u @ phys address: 0x%08x", pagenum, (
unsigned int)(adr));
2856 private->page_size / 4,
2859 LOG_ERROR(
"SAM4: Failed to write (buffer) page at phys address 0x%08x",
2860 (
unsigned int)(adr));
2871 LOG_ERROR(
"SAM4: Error performing Write page @ phys address 0x%08x",
2872 (
unsigned int)(adr));
2874 LOG_ERROR(
"SAM4: Page @ Phys address 0x%08x is locked", (
unsigned int)(adr));
2878 LOG_ERROR(
"SAM4: Flash Command error @phys address 0x%08x", (
unsigned int)(adr));
2890 unsigned int page_cur;
2891 unsigned int page_end;
2893 unsigned int page_offset;
2895 uint8_t *pagebuffer;
2913 if (!(private->probed)) {
2919 LOG_ERROR(
"Flash write error - past end of bank");
2920 LOG_ERROR(
" offset: 0x%08x, count 0x%08x, BankEnd: 0x%08x",
2922 (
unsigned int)(
count),
2923 (
unsigned int)(private->size_bytes));
2928 pagebuffer = malloc(private->page_size);
2930 LOG_ERROR(
"No memory for %d Byte page buffer", (
int)(private->page_size));
2940 page_cur =
offset /
private->page_size;
2941 page_end = (
offset +
count - 1) / private->page_size;
2944 LOG_DEBUG(
"Page start: %d, Page End: %d", (
int)(page_cur), (
int)(page_end));
2954 if (page_cur == page_end) {
2955 LOG_DEBUG(
"Special case, all in one page");
2960 page_offset = (
offset & (
private->page_size-1));
2961 memcpy(pagebuffer + page_offset,
2973 page_offset =
offset & (
private->page_size - 1);
2982 n = (
private->page_size - page_offset);
2983 memcpy(pagebuffer + page_offset,
2999 assert(
offset % private->page_size == 0);
3004 LOG_DEBUG(
"Full Page Loop: cur=%d, end=%d, count = 0x%08x",
3005 (
int)page_cur, (
int)page_end, (
unsigned int)(
count));
3007 while ((page_cur < page_end) &&
3008 (
count >= private->page_size)) {
3012 count -=
private->page_size;
3013 buffer +=
private->page_size;
3019 LOG_DEBUG(
"Terminal partial page, count = 0x%08x", (
unsigned int)(
count));
3052 "Please define bank %d via command: flash bank %s ... ",
3127 if ((strcmp(
CMD_ARGV[0],
"show") == 0) && (strcmp(
CMD_ARGV[1],
"all") == 0)) {
3139 if (strcmp(
"show",
CMD_ARGV[0]) == 0) {
3167 if (strcmp(
"set",
CMD_ARGV[0]) == 0)
3169 else if ((strcmp(
"clr",
CMD_ARGV[0]) == 0) ||
3170 (strcmp(
"clear",
CMD_ARGV[0]) == 0))
3218 .handler = sam4_handle_gpnvm_command,
3220 .usage =
"[('clr'|'set'|'show') bitnum]",
3221 .help =
"Without arguments, shows all bits in the gpnvm "
3222 "register. Otherwise, clears, sets, or shows one "
3223 "General Purpose Non-Volatile Memory (gpnvm) bit.",
3227 .handler = sam4_handle_info_command,
3229 .help =
"Print information about the current at91sam4 chip "
3230 "and its flash configuration.",
3235 .handler = sam4_handle_slowclk_command,
3237 .usage =
"[clock_hz]",
3238 .help =
"Display or set the slowclock frequency "
3239 "(default 32768 Hz).",
3247 .help =
"at91sam4 flash command group",
3257 .flash_bank_command = sam4_flash_bank_command,
#define FLASH_BANK0_BASE_C32
#define FLASH_BANK1_BASE_2048K_SD
#define AT91C_EFC_FCMD_WPL
static int sam4_page_write(struct sam4_bank_private *private, unsigned int pagenum, const uint8_t *buf)
#define AT91C_EFC_FCMD_GLB
#define FLASH_BANK_BASE_S
static const struct sam4_reg_list * sam4_get_reg(struct sam4_chip *chip, uint32_t *goes_here)
Given a pointer to where it goes in the structure, determine the register name, address from the all ...
static const char *const eproc_names[]
#define AT91C_EFC_FCMD_EWPL
static const struct sam4_chip_details all_sam4_details[]
static int sam4_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
COMMAND_HANDLER(sam4_handle_info_command)
static int sam4_info(struct flash_bank *bank, struct command_invocation *cmd)
static void sam4_explain_chipid_cidr(struct sam4_chip *chip)
static const char _unknown[]
static int flashd_get_gpnvm(struct sam4_bank_private *private, unsigned int gpnvm, unsigned int *puthere)
Gets current GPNVM state.
static int sam4_auto_probe(struct flash_bank *bank)
static const char * _yes_or_no(uint32_t v)
static struct sam4_bank_private * get_sam4_bank_private(struct flash_bank *bank)
static void sam4_explain_ckgr_plla(struct sam4_chip *chip)
#define AT91C_EFC_FCMD_SFB
#define AT91C_EFC_FCMD_EA
static int sam4_get_details(struct sam4_bank_private *private)
#define FLASH_BANK1_BASE_1024K_SD
#define AT91C_EFC_FCMD_EPA
static struct sam4_chip * all_sam4_chips
static int sam4_read_this_reg(struct sam4_chip *chip, uint32_t *goes_here)
#define AT91C_EFC_FCMD_GFB
static void sam4_explain_ckgr_mor(struct sam4_chip *chip)
#define SAM4_ENTRY(NAME, FUNC)
static uint32_t * sam4_get_reg_ptr(struct sam4_cfg *cfg, const struct sam4_reg_list *list)
#define FLASH_BANK_BASE_C
static const struct sam4_reg_list sam4_all_regs[]
static int sam4_protect_check(struct flash_bank *bank)
static struct sam4_chip * get_current_sam4(struct command_invocation *cmd)
static int efc_get_status(struct sam4_bank_private *private, uint32_t *v)
Get the current status of the EEFC and the value of some status bits (LOCKE, PROGE).
static const char *const nvpsize[]
static void sam4_explain_mckr(struct sam4_chip *chip)
#define AT91C_EFC_FCMD_EWP
static float _tomhz(uint32_t freq_hz)
static const struct command_registration at91sam4_exec_command_handlers[]
#define AT91C_EFC_FCMD_WP
static int flashd_get_lock_bits(struct sam4_bank_private *private, uint32_t *v)
Returns a bit field (at most 64) of locked regions within a page.
static int flashd_read_uid(struct sam4_bank_private *private)
Read the unique ID.
#define SAM4_MAX_FLASH_BANKS
static const struct command_registration at91sam4_command_handlers[]
static int flashd_set_gpnvm(struct sam4_bank_private *private, unsigned int gpnvm)
Sets the selected GPNVM bit.
static const char *const nvptype[]
static uint32_t sam4_reg_fieldname(struct sam4_chip *chip, const char *regname, uint32_t value, unsigned int shift, unsigned int width)
#define FLASH_BANK1_BASE_C32
static void sam4_explain_ckgr_mcfr(struct sam4_chip *chip)
#define FLASH_BANK0_BASE_SD
static int efc_start_command(struct sam4_bank_private *private, unsigned int command, unsigned int argument)
static int flashd_lock(struct sam4_bank_private *private, unsigned int start_sector, unsigned int end_sector)
Locks regions.
static int sam4_set_wait(struct sam4_bank_private *private)
#define AT91C_EFC_FCMD_STUI
static void sam4_free_driver_priv(struct flash_bank *bank)
Remove all chips from the internal list without distinguishing which one is owned by this bank.
static int flashd_unlock(struct sam4_bank_private *private, unsigned int start_sector, unsigned int end_sector)
Unlocks all the regions in the given address range.
#define AT91C_EFC_FCMD_GETD
static int flashd_erase_pages(struct sam4_bank_private *private, int first_page, int num_pages, uint32_t *status)
Erases the entire flash.
static int sam4_protect(struct flash_bank *bank, int set, unsigned int first, unsigned int last)
FLASH_BANK_COMMAND_HANDLER(sam4_flash_bank_command)
static int efc_get_result(struct sam4_bank_private *private, uint32_t *v)
Get the result of the last executed command.
static int sam4_read_all_regs(struct sam4_chip *chip)
static const char *const sramsize[]
const struct flash_driver at91sam4_flash
static int sam4_probe(struct flash_bank *bank)
static int flashd_clr_gpnvm(struct sam4_bank_private *private, unsigned int gpnvm)
Clears the selected GPNVM bit.
#define AT91C_EFC_FCMD_SPUI
static int sam4_page_read(struct sam4_bank_private *private, unsigned int pagenum, uint8_t *buf)
#define AT91C_EFC_FCMD_CLB
static int flashd_erase_entire_bank(struct sam4_bank_private *private)
Erases the entire flash.
static int sam4_get_info(struct sam4_chip *chip)
#define AT91C_EFC_FCMD_SLB
static int sam4_erase(struct flash_bank *bank, unsigned int first, unsigned int last)
static const char *const _rc_freq[]
#define AT91C_EFC_FCMD_CFB
static int efc_perform_command(struct sam4_bank_private *private, unsigned int command, unsigned int argument, uint32_t *status)
Performs the given command and wait until its completion (or an error).
void command_print_sameline(struct command_invocation *cmd, const char *format,...)
void command_print(struct command_invocation *cmd, const char *format,...)
#define CMD
Use this macro to access the command being handled, rather than accessing the variable directly.
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
#define ERROR_COMMAND_SYNTAX_ERROR
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
#define COMMAND_PARSE_NUMBER(type, in, out)
parses the string in into out as a type, or prints a command error and passes the error code to the c...
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
uint64_t buffer
Pointer to data buffer to send over SPI.
#define ERROR_FLASH_BANK_NOT_PROBED
int default_flash_blank_check(struct flash_bank *bank)
Provides default erased-bank check handling.
int default_flash_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
Provides default read implementation for flash memory.
#define LOG_USER(expr ...)
#define LOG_USER_N(expr ...)
#define LOG_ERROR(expr ...)
#define LOG_INFO(expr ...)
#define LOG_DEBUG(expr ...)
When run_command is called, a new instance will be created on the stack, filled with the proper value...
Provides details of a flash bank, available either on-chip or through a major interface.
Provides the implementation-independent structure that defines all of the callbacks required by OpenO...
const char * name
Gives a human-readable name of this flash driver, This field is used to select and initialize the dri...
uint32_t controller_address
uint32_t flash_wait_states
unsigned int total_flash_size
struct sam4_bank_private bank[SAM4_MAX_FLASH_BANKS]
unsigned int total_sram_size
unsigned int gpnvm[SAM4_N_NVM_BITS]
struct sam4_chip_details details
void(* explain_func)(struct sam4_chip *chip)
int target_write_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Write count items of size bytes to the memory of target at the address given.
int target_write_u32(struct target *target, target_addr_t address, uint32_t value)
int target_read_u32(struct target *target, target_addr_t address, uint32_t *value)
int target_read_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Read count items of size bytes from the memory of target at the address given.
struct target * get_current_target(struct command_context *cmd_ctx)
#define ERROR_TARGET_NOT_HALTED