Changeset 1475
- Timestamp:
- 12/20/11 01:19:29 (5 months ago)
- Location:
- trunk
- Files:
-
- 14 edited
-
bitbang_spi.c (modified) (6 diffs)
-
cli_classic.c (modified) (5 diffs)
-
flash.h (modified) (5 diffs)
-
flashrom.c (modified) (8 diffs)
-
ichspi.c (modified) (5 diffs)
-
mcp6x_spi.c (modified) (2 diffs)
-
nicintel_spi.c (modified) (2 diffs)
-
ogp_spi.c (modified) (2 diffs)
-
opaque.c (modified) (1 diff)
-
programmer.c (modified) (3 diffs)
-
programmer.h (modified) (10 diffs)
-
rayer_spi.c (modified) (2 diffs)
-
spi.c (modified) (10 diffs)
-
spi25.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/bitbang_spi.c
r1474 r1475 26 26 #include "spi.h" 27 27 28 /* Length of half a clock period in usecs. */29 static int bitbang_spi_half_period;30 31 static const struct bitbang_spi_master *bitbang_spi_master = NULL;32 33 28 /* Note that CS# is active low, so val=0 means the chip is active. */ 34 static void bitbang_spi_set_cs( int val)29 static void bitbang_spi_set_cs(const const struct bitbang_spi_master *master, int val) 35 30 { 36 bitbang_spi_master->set_cs(val);31 master->set_cs(val); 37 32 } 38 33 39 static void bitbang_spi_set_sck( int val)34 static void bitbang_spi_set_sck(const const struct bitbang_spi_master *master, int val) 40 35 { 41 bitbang_spi_master->set_sck(val);36 master->set_sck(val); 42 37 } 43 38 44 static void bitbang_spi_set_mosi( int val)39 static void bitbang_spi_set_mosi(const const struct bitbang_spi_master *master, int val) 45 40 { 46 bitbang_spi_master->set_mosi(val);41 master->set_mosi(val); 47 42 } 48 43 49 static int bitbang_spi_get_miso( void)44 static int bitbang_spi_get_miso(const const struct bitbang_spi_master *master) 50 45 { 51 return bitbang_spi_master->get_miso();46 return master->get_miso(); 52 47 } 53 48 54 static void bitbang_spi_request_bus( void)49 static void bitbang_spi_request_bus(const const struct bitbang_spi_master *master) 55 50 { 56 if ( bitbang_spi_master->request_bus)57 bitbang_spi_master->request_bus();51 if (master->request_bus) 52 master->request_bus(); 58 53 } 59 54 60 static void bitbang_spi_release_bus( void)55 static void bitbang_spi_release_bus(const const struct bitbang_spi_master *master) 61 56 { 62 if ( bitbang_spi_master->release_bus)63 bitbang_spi_master->release_bus();57 if (master->release_bus) 58 master->release_bus(); 64 59 } 65 60 … … 79 74 }; 80 75 81 int bitbang_spi_init(const struct bitbang_spi_master *master, int halfperiod) 76 #if 0 // until it is needed 77 static int bitbang_spi_shutdown(const struct bitbang_spi_master *master) 82 78 { 79 /* FIXME: Run bitbang_spi_release_bus here or per command? */ 80 return 0; 81 } 82 #endif 83 84 int bitbang_spi_init(const struct bitbang_spi_master *master) 85 { 86 struct spi_programmer pgm = spi_programmer_bitbang; 83 87 /* BITBANG_SPI_INVALID is 0, so if someone forgot to initialize ->type, 84 88 * we catch it here. Same goes for missing initialization of bitbanging … … 86 90 */ 87 91 if (!master || master->type == BITBANG_SPI_INVALID || !master->set_cs || 88 !master->set_sck || !master->set_mosi || !master->get_miso) { 92 !master->set_sck || !master->set_mosi || !master->get_miso || 93 (master->request_bus && !master->release_bus) || 94 (!master->request_bus && master->release_bus)) { 89 95 msg_perr("Incomplete SPI bitbang master setting!\n" 90 96 "Please report a bug at flashrom@flashrom.org\n"); 91 return 1; 92 } 93 if (bitbang_spi_master) { 94 msg_perr("SPI bitbang master already initialized!\n" 95 "Please report a bug at flashrom@flashrom.org\n"); 96 return 1; 97 return ERROR_FLASHROM_BUG; 97 98 } 98 99 99 bitbang_spi_master= master;100 bitbang_spi_half_period = halfperiod;100 pgm.data = master; 101 register_spi_programmer(&pgm); 101 102 102 register_spi_programmer(&spi_programmer_bitbang); 103 104 /* FIXME: Run bitbang_spi_request_bus here or in programmer init? */ 105 bitbang_spi_set_cs(1); 106 bitbang_spi_set_sck(0); 107 bitbang_spi_set_mosi(0); 103 /* Only mess with the bus if we're sure nobody else uses it. */ 104 bitbang_spi_request_bus(master); 105 bitbang_spi_set_cs(master, 1); 106 bitbang_spi_set_sck(master, 0); 107 bitbang_spi_set_mosi(master, 0); 108 /* FIXME: Release SPI bus here and request it again for each command or 109 * don't release it now and only release it on programmer shutdown? 110 */ 111 bitbang_spi_release_bus(master); 108 112 return 0; 109 113 } 110 114 111 int bitbang_spi_shutdown(const struct bitbang_spi_master *master) 112 { 113 if (!bitbang_spi_master) { 114 msg_perr("Shutting down an uninitialized SPI bitbang master!\n" 115 "Please report a bug at flashrom@flashrom.org\n"); 116 return 1; 117 } 118 if (master != bitbang_spi_master) { 119 msg_perr("Shutting down a mismatched SPI bitbang master!\n" 120 "Please report a bug at flashrom@flashrom.org\n"); 121 return 1; 122 } 123 124 /* FIXME: Run bitbang_spi_release_bus here or per command? */ 125 bitbang_spi_master = NULL; 126 return 0; 127 } 128 129 static uint8_t bitbang_spi_readwrite_byte(uint8_t val) 115 static uint8_t bitbang_spi_rw_byte(const struct bitbang_spi_master *master, 116 uint8_t val) 130 117 { 131 118 uint8_t ret = 0; … … 133 120 134 121 for (i = 7; i >= 0; i--) { 135 bitbang_spi_set_mosi( (val >> i) & 1);136 programmer_delay( bitbang_spi_half_period);137 bitbang_spi_set_sck( 1);122 bitbang_spi_set_mosi(master, (val >> i) & 1); 123 programmer_delay(master->half_period); 124 bitbang_spi_set_sck(master, 1); 138 125 ret <<= 1; 139 ret |= bitbang_spi_get_miso( );140 programmer_delay( bitbang_spi_half_period);141 bitbang_spi_set_sck( 0);126 ret |= bitbang_spi_get_miso(master); 127 programmer_delay(master->half_period); 128 bitbang_spi_set_sck(master, 0); 142 129 } 143 130 return ret; … … 150 137 { 151 138 int i; 139 const struct bitbang_spi_master *master = flash->pgm->spi.data; 152 140 153 141 /* FIXME: Run bitbang_spi_request_bus here or in programmer init? … … 155 143 * programmer to use its own SPI engine for native accesses. 156 144 */ 157 bitbang_spi_request_bus( );158 bitbang_spi_set_cs( 0);145 bitbang_spi_request_bus(master); 146 bitbang_spi_set_cs(master, 0); 159 147 for (i = 0; i < writecnt; i++) 160 bitbang_spi_r eadwrite_byte(writearr[i]);148 bitbang_spi_rw_byte(master, writearr[i]); 161 149 for (i = 0; i < readcnt; i++) 162 readarr[i] = bitbang_spi_r eadwrite_byte(0);150 readarr[i] = bitbang_spi_rw_byte(master, 0); 163 151 164 programmer_delay( bitbang_spi_half_period);165 bitbang_spi_set_cs( 1);166 programmer_delay( bitbang_spi_half_period);152 programmer_delay(master->half_period); 153 bitbang_spi_set_cs(master, 1); 154 programmer_delay(master->half_period); 167 155 /* FIXME: Run bitbang_spi_release_bus here or in programmer init? */ 168 bitbang_spi_release_bus( );156 bitbang_spi_release_bus(master); 169 157 170 158 return 0; -
trunk/cli_classic.c
r1473 r1475 173 173 struct flashctx *fill_flash; 174 174 const char *name; 175 int namelen, opt, i ;175 int namelen, opt, i, j; 176 176 int startchip = 0, chipcount = 0, option_index = 0, force = 0; 177 177 #if CONFIG_PRINT_WIKI == 1 … … 445 445 goto out_shutdown; 446 446 } 447 tempstr = flashbuses_to_text( buses_supported);448 msg_pdbg("Th is programmer supports the following protocols: %s.\n",447 tempstr = flashbuses_to_text(get_buses_supported()); 448 msg_pdbg("The following protocols are supported: %s.\n", 449 449 tempstr); 450 450 free(tempstr); 451 451 452 for (i = 0; i < ARRAY_SIZE(flashes); i++) { 453 startchip = probe_flash(startchip, &flashes[i], 0); 454 if (startchip == -1) 455 break; 456 chipcount++; 457 startchip++; 452 for (j = 0; j < registered_programmer_count; j++) { 453 startchip = 0; 454 for (i = 0; i < ARRAY_SIZE(flashes); i++) { 455 startchip = probe_flash(®istered_programmers[j], 456 startchip, &flashes[i], 0); 457 if (startchip == -1) 458 break; 459 chipcount++; 460 startchip++; 461 } 458 462 } 459 463 … … 473 477 "chip isn't found automatically.\n"); 474 478 } 479 #if 0 // FIXME: What happens for a forced chip read if multiple compatible programmers are registered? 475 480 if (force && read_it && chip_to_probe) { 476 481 printf("Force read (-f -r -c) requested, pretending " … … 487 492 return read_flash_to_file(&flashes[0], filename); 488 493 } 494 #endif 489 495 ret = 1; 490 496 goto out_shutdown; … … 503 509 504 510 size = fill_flash->total_size * 1024; 505 if (check_max_decode( (buses_supported & fill_flash->bustype), size) &&511 if (check_max_decode(fill_flash->pgm->buses_supported & fill_flash->bustype, size) && 506 512 (!force)) { 507 513 fprintf(stderr, "Chip is too big for this programmer " -
trunk/flash.h
r1474 r1475 172 172 /* Some flash devices have an additional register space. */ 173 173 chipaddr virtual_registers; 174 struct registered_programmer *pgm; 174 175 }; 175 176 … … 225 226 write_gran_256bytes, 226 227 }; 227 extern enum chipbustype buses_supported;228 228 extern int verbose; 229 229 extern const char flashrom_version[]; … … 232 232 int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 233 233 int erase_flash(struct flashctx *flash); 234 int probe_flash( int startchip, struct flashctx *fill_flash, int force);234 int probe_flash(struct registered_programmer *pgm, int startchip, struct flashctx *fill_flash, int force); 235 235 int read_flash_to_file(struct flashctx *flash, const char *filename); 236 236 int min(int a, int b); … … 257 257 /* Something happened that shouldn't happen, we'll abort. */ 258 258 #define ERROR_FATAL -0xee 259 #define ERROR_FLASHROM_BUG -200 260 /* We reached one of the hardcoded limits of flashrom. This can be fixed by 261 * increasing the limit of a compile-time allocation or by switching to dynamic 262 * allocation. 263 * Note: If this warning is triggered, check first for runaway registrations. 264 */ 265 #define ERROR_FLASHROM_LIMIT -201 259 266 260 267 /* cli_output.c */ … … 298 305 uint32_t spi_get_valid_read_addr(struct flashctx *flash); 299 306 307 enum chipbustype get_buses_supported(void); 300 308 #endif /* !__FLASH_H__ */ -
trunk/flashrom.c
r1474 r1475 47 47 static char *programmer_param = NULL; 48 48 49 /* Supported buses for the current programmer. */50 enum chipbustype buses_supported;51 52 49 /* 53 50 * Programmers supporting multiple buses can have differing size limits on … … 315 312 .spi = 0xffffffff, 316 313 }; 317 buses_supported = BUS_NONE;318 314 /* Default to top aligned flash at 4 GB. */ 319 315 flashbase = 0; … … 362 358 void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr) 363 359 { 364 par_programmer->chip_writeb(flash, val, addr);360 flash->pgm->par.chip_writeb(flash, val, addr); 365 361 } 366 362 367 363 void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr) 368 364 { 369 par_programmer->chip_writew(flash, val, addr);365 flash->pgm->par.chip_writew(flash, val, addr); 370 366 } 371 367 372 368 void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr) 373 369 { 374 par_programmer->chip_writel(flash, val, addr);370 flash->pgm->par.chip_writel(flash, val, addr); 375 371 } 376 372 … … 378 374 size_t len) 379 375 { 380 par_programmer->chip_writen(flash, buf, addr, len);376 flash->pgm->par.chip_writen(flash, buf, addr, len); 381 377 } 382 378 383 379 uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr) 384 380 { 385 return par_programmer->chip_readb(flash, addr);381 return flash->pgm->par.chip_readb(flash, addr); 386 382 } 387 383 388 384 uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr) 389 385 { 390 return par_programmer->chip_readw(flash, addr);386 return flash->pgm->par.chip_readw(flash, addr); 391 387 } 392 388 393 389 uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr) 394 390 { 395 return par_programmer->chip_readl(flash, addr);391 return flash->pgm->par.chip_readl(flash, addr); 396 392 } 397 393 … … 399 395 size_t len) 400 396 { 401 par_programmer->chip_readn(flash, buf, addr, len);397 flash->pgm->par.chip_readn(flash, buf, addr, len); 402 398 } 403 399 … … 943 939 } 944 940 945 int probe_flash(int startchip, struct flashctx *fill_flash, int force) 941 int probe_flash(struct registered_programmer *pgm, int startchip, 942 struct flashctx *fill_flash, int force) 946 943 { 947 944 const struct flashchip *flash; … … 955 952 if (chip_to_probe && strcmp(flash->name, chip_to_probe) != 0) 956 953 continue; 957 buses_common = buses_supported & flash->bustype; 958 if (!buses_common) { 959 msg_gspew("Probing for %s %s, %d kB: skipped. ", 960 flash->vendor, flash->name, flash->total_size); 961 tmp = flashbuses_to_text(buses_supported); 962 msg_gspew("Host bus type %s ", tmp); 963 free(tmp); 964 tmp = flashbuses_to_text(flash->bustype); 965 msg_gspew("and chip bus type %s are incompatible.", 966 tmp); 967 free(tmp); 968 msg_gspew("\n"); 954 buses_common = pgm->buses_supported & flash->bustype; 955 if (!buses_common) 969 956 continue; 970 }971 957 msg_gdbg("Probing for %s %s, %d kB: ", 972 958 flash->vendor, flash->name, flash->total_size); … … 982 968 /* Start filling in the dynamic data. */ 983 969 memcpy(fill_flash, flash, sizeof(struct flashchip)); 970 fill_flash->pgm = pgm; 984 971 985 972 base = flashbase ? flashbase : (0xffffffff - size + 1); -
trunk/ichspi.c
r1474 r1475 636 636 /* Read len bytes from the fdata/spid register into the data array. 637 637 * 638 * Note that using len > spi_programmer->max_data_read will return garbage or638 * Note that using len > flash->pgm->spi.max_data_read will return garbage or 639 639 * may even crash. 640 640 */ … … 654 654 /* Fill len bytes from the data array into the fdata/spid registers. 655 655 * 656 * Note that using len > spi_programmer->max_data_write will trash the registers656 * Note that using len > flash->pgm->spi.max_data_write will trash the registers 657 657 * following the data registers. 658 658 */ … … 961 961 { 962 962 /* max_data_read == max_data_write for all Intel/VIA SPI masters */ 963 uint8_t maxlength = spi_programmer->max_data_read;964 965 if ( spi_programmer->type == SPI_CONTROLLER_NONE) {963 uint8_t maxlength = flash->pgm->spi.max_data_read; 964 965 if (ich_generation == CHIPSET_ICH_UNKNOWN) { 966 966 msg_perr("%s: unsupported chipset\n", __func__); 967 967 return -1; … … 1298 1298 1299 1299 while (len > 0) { 1300 block_len = min(len, opaque_programmer->max_data_read);1300 block_len = min(len, flash->pgm->opaque.max_data_read); 1301 1301 ich_hwseq_set_addr(addr); 1302 1302 hsfc = REGREAD16(ICH9_REG_HSFC); … … 1337 1337 while (len > 0) { 1338 1338 ich_hwseq_set_addr(addr); 1339 block_len = min(len, opaque_programmer->max_data_write);1339 block_len = min(len, flash->pgm->opaque.max_data_write); 1340 1340 ich_fill_data(buf, block_len, ICH9_REG_FDATA0); 1341 1341 hsfc = REGREAD16(ICH9_REG_HSFC); -
trunk/mcp6x_spi.c
r1299 r1475 99 99 .request_bus = mcp6x_request_spibus, 100 100 .release_bus = mcp6x_release_spibus, 101 .half_period = 0, 101 102 }; 102 103 … … 160 161 mcp_gpiostate = status & 0xff; 161 162 162 /* Zero halfperiod delay. */ 163 if (bitbang_spi_init(&bitbang_spi_master_mcp6x, 0)) { 163 if (bitbang_spi_init(&bitbang_spi_master_mcp6x)) { 164 164 /* This should never happen. */ 165 165 msg_perr("MCP6X bitbang SPI master init failed!\n"); -
trunk/nicintel_spi.c
r1338 r1475 138 138 .request_bus = nicintel_request_spibus, 139 139 .release_bus = nicintel_release_spibus, 140 .half_period = 1, 140 141 }; 141 142 … … 182 183 return 1; 183 184 184 /* 1 usec halfperiod delay for now. */ 185 if (bitbang_spi_init(&bitbang_spi_master_nicintel, 1)) 185 if (bitbang_spi_init(&bitbang_spi_master_nicintel)) 186 186 return 1; 187 187 -
trunk/ogp_spi.c
r1338 r1475 92 92 .request_bus = ogp_request_spibus, 93 93 .release_bus = ogp_release_spibus, 94 .half_period = 0, 94 95 }; 95 96 … … 137 138 return 1; 138 139 139 /* no delay for now. */ 140 if (bitbang_spi_init(&bitbang_spi_master_ogp, 0)) 140 if (bitbang_spi_init(&bitbang_spi_master_ogp)) 141 141 return 1; 142 142 -
trunk/opaque.c
r1473 r1475 31 31 #include "programmer.h" 32 32 33 const struct opaque_programmer opaque_programmer_none = {34 .max_data_read = MAX_DATA_UNSPECIFIED,35 .max_data_write = MAX_DATA_UNSPECIFIED,36 .probe = NULL,37 .read = NULL,38 .write = NULL,39 .erase = NULL,40 };41 42 const struct opaque_programmer *opaque_programmer = &opaque_programmer_none;43 44 33 int probe_opaque(struct flashctx *flash) 45 34 { 46 if (!opaque_programmer->probe) { 47 msg_perr("%s called before register_opaque_programmer. " 48 "Please report a bug at flashrom@flashrom.org\n", 49 __func__); 50 return 0; 51 } 52 53 return opaque_programmer->probe(flash); 35 return flash->pgm->opaque.probe(flash); 54 36 } 55 37 56 38 int read_opaque(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len) 57 39 { 58 if (!opaque_programmer->read) { 59 msg_perr("%s called before register_opaque_programmer. " 60 "Please report a bug at flashrom@flashrom.org\n", 61 __func__); 62 return 1; 63 } 64 return opaque_programmer->read(flash, buf, start, len); 40 return flash->pgm->opaque.read(flash, buf, start, len); 65 41 } 66 42 67 43 int write_opaque(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len) 68 44 { 69 if (!opaque_programmer->write) { 70 msg_perr("%s called before register_opaque_programmer. " 71 "Please report a bug at flashrom@flashrom.org\n", 72 __func__); 73 return 1; 74 } 75 return opaque_programmer->write(flash, buf, start, len); 45 return flash->pgm->opaque.write(flash, buf, start, len); 76 46 } 77 47 78 48 int erase_opaque(struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen) 79 49 { 80 if (!opaque_programmer->erase) { 81 msg_perr("%s called before register_opaque_programmer. " 50 return flash->pgm->opaque.erase(flash, blockaddr, blocklen); 51 } 52 53 int register_opaque_programmer(const struct opaque_programmer *pgm) 54 { 55 struct registered_programmer rpgm; 56 57 if (!pgm->probe || !pgm->read || !pgm->write || !pgm->erase) { 58 msg_perr("%s called with incomplete programmer definition. " 82 59 "Please report a bug at flashrom@flashrom.org\n", 83 60 __func__); 84 return 1;61 return ERROR_FLASHROM_BUG; 85 62 } 86 return opaque_programmer->erase(flash, blockaddr, blocklen); 63 rpgm.buses_supported = BUS_PROG; 64 rpgm.opaque = *pgm; 65 return register_programmer(&rpgm); 87 66 } 88 89 void register_opaque_programmer(const struct opaque_programmer *pgm)90 {91 if (!pgm->probe || !pgm->read || !pgm->write || !pgm->erase) {92 msg_perr("%s called with one of probe/read/write/erase being "93 "NULL. Please report a bug at flashrom@flashrom.org\n",94 __func__);95 return;96 }97 opaque_programmer = pgm;98 buses_supported |= BUS_PROG;99 } -
trunk/programmer.c
r1474 r1475 22 22 #include "programmer.h" 23 23 24 static const struct par_programmer par_programmer_none = {25 .chip_readb = noop_chip_readb,26 .chip_readw = fallback_chip_readw,27 .chip_readl = fallback_chip_readl,28 .chip_readn = fallback_chip_readn,29 .chip_writeb = noop_chip_writeb,30 .chip_writew = fallback_chip_writew,31 .chip_writel = fallback_chip_writel,32 .chip_writen = fallback_chip_writen,33 };34 35 const struct par_programmer *par_programmer = &par_programmer_none;36 37 24 /* No-op shutdown() for programmers which don't need special handling */ 38 25 int noop_shutdown(void) … … 53 40 } 54 41 55 /* No-op chip_writeb() for drivers not supporting addr/data pair accesses */ 56 uint8_t noop_chip_readb(const struct flashctx *flash, const chipaddr addr) 57 { 58 return 0xff; 59 } 60 61 /* No-op chip_writeb() for drivers not supporting addr/data pair accesses */ 42 /* No-op chip_writeb() for parallel style drivers not supporting writes */ 62 43 void noop_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr) 63 44 { … … 116 97 } 117 98 118 void register_par_programmer(const struct par_programmer *pgm, const enum chipbustype buses) 99 int register_par_programmer(const struct par_programmer *pgm, 100 const enum chipbustype buses) 119 101 { 120 par_programmer = pgm; 121 buses_supported |= buses; 102 struct registered_programmer rpgm; 103 if (!pgm->chip_writeb || !pgm->chip_writew || !pgm->chip_writel || 104 !pgm->chip_writen || !pgm->chip_readb || !pgm->chip_readw || 105 !pgm->chip_readl || !pgm->chip_readn) { 106 msg_perr("%s called with incomplete programmer definition. " 107 "Please report a bug at flashrom@flashrom.org\n", 108 __func__); 109 return ERROR_FLASHROM_BUG; 110 } 111 112 rpgm.buses_supported = buses; 113 rpgm.par = *pgm; 114 return register_programmer(&rpgm); 122 115 } 116 117 /* The limit of 4 is totally arbitrary. */ 118 #define PROGRAMMERS_MAX 4 119 struct registered_programmer registered_programmers[PROGRAMMERS_MAX]; 120 int registered_programmer_count = 0; 121 122 /* This function copies the struct registered_programmer parameter. */ 123 int register_programmer(struct registered_programmer *pgm) 124 { 125 if (registered_programmer_count >= PROGRAMMERS_MAX) { 126 msg_perr("Tried to register more than %i programmer " 127 "interfaces.\n", PROGRAMMERS_MAX); 128 return ERROR_FLASHROM_LIMIT; 129 } 130 registered_programmers[registered_programmer_count] = *pgm; 131 registered_programmer_count++; 132 133 return 0; 134 } 135 136 enum chipbustype get_buses_supported(void) 137 { 138 int i; 139 enum chipbustype ret = BUS_NONE; 140 141 for (i = 0; i < registered_programmer_count; i++) 142 ret |= registered_programmers[i].buses_supported; 143 144 return ret; 145 } -
trunk/programmer.h
r1474 r1475 134 134 void (*request_bus) (void); 135 135 void (*release_bus) (void); 136 /* Length of half a clock period in usecs. */ 137 unsigned int half_period; 136 138 }; 137 139 … … 209 211 #if NEED_PCI == 1 210 212 /* pcidev.c */ 213 // FIXME: These need to be local, not global 211 214 extern uint32_t io_base_addr; 212 215 extern struct pci_access *pacc; … … 428 431 429 432 /* bitbang_spi.c */ 430 int bitbang_spi_init(const struct bitbang_spi_master *master, int halfperiod); 431 int bitbang_spi_shutdown(const struct bitbang_spi_master *master); 433 int bitbang_spi_init(const struct bitbang_spi_master *master); 432 434 433 435 /* buspirate_spi.c */ … … 453 455 uint32_t spi; 454 456 }; 457 // FIXME: These need to be local, not global 455 458 extern struct decode_sizes max_rom_decode; 456 459 extern int programmer_may_write; … … 499 502 #endif 500 503 }; 501 extern const int spi_programmer_count;502 504 503 505 #define MAX_DATA_UNSPECIFIED 0 … … 515 517 int (*read)(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 516 518 int (*write_256)(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 517 };518 519 extern const struct spi_programmer *spi_programmer; 519 const void *data; 520 }; 521 520 522 int default_spi_send_command(struct flashctx *flash, unsigned int writecnt, unsigned int readcnt, 521 523 const unsigned char *writearr, unsigned char *readarr); … … 523 525 int default_spi_read(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 524 526 int default_spi_write_256(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 525 voidregister_spi_programmer(const struct spi_programmer *programmer);527 int register_spi_programmer(const struct spi_programmer *programmer); 526 528 527 529 /* ichspi.c */ … … 571 573 int (*write) (struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); 572 574 int (*erase) (struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen); 573 };574 extern const struct opaque_programmer *opaque_programmer;575 voidregister_opaque_programmer(const struct opaque_programmer *pgm);575 const void *data; 576 }; 577 int register_opaque_programmer(const struct opaque_programmer *pgm); 576 578 577 579 /* programmer.c */ … … 579 581 void *fallback_map(const char *descr, unsigned long phys_addr, size_t len); 580 582 void fallback_unmap(void *virt_addr, size_t len); 581 uint8_t noop_chip_readb(const struct flashctx *flash, const chipaddr addr);582 583 void noop_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr); 583 584 void fallback_chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr); … … 596 597 uint32_t (*chip_readl) (const struct flashctx *flash, const chipaddr addr); 597 598 void (*chip_readn) (const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len); 598 }; 599 extern const struct par_programmer *par_programmer; 600 void register_par_programmer(const struct par_programmer *pgm, const enum chipbustype buses); 599 const void *data; 600 }; 601 int register_par_programmer(const struct par_programmer *pgm, const enum chipbustype buses); 602 struct registered_programmer { 603 enum chipbustype buses_supported; 604 union { 605 struct par_programmer par; 606 struct spi_programmer spi; 607 struct opaque_programmer opaque; 608 }; 609 }; 610 extern struct registered_programmer registered_programmers[]; 611 extern int registered_programmer_count; 612 int register_programmer(struct registered_programmer *pgm); 601 613 602 614 /* serprog.c */ -
trunk/rayer_spi.c
r1454 r1475 93 93 .set_mosi = rayer_bitbang_set_mosi, 94 94 .get_miso = rayer_bitbang_get_miso, 95 .half_period = 0, 95 96 }; 96 97 … … 172 173 lpt_outbyte = INB(lpt_iobase); 173 174 174 /* Zero halfperiod delay. */ 175 if (bitbang_spi_init(&bitbang_spi_master_rayer, 0)) 175 if (bitbang_spi_init(&bitbang_spi_master_rayer)) 176 176 return 1; 177 177 -
trunk/spi.c
r1474 r1475 2 2 * This file is part of the flashrom project. 3 3 * 4 * Copyright (C) 2007, 2008, 2009 Carl-Daniel Hailfinger4 * Copyright (C) 2007, 2008, 2009, 2010, 2011 Carl-Daniel Hailfinger 5 5 * Copyright (C) 2008 coresystems GmbH 6 6 * … … 31 31 #include "spi.h" 32 32 33 const struct spi_programmer spi_programmer_none = {34 .type = SPI_CONTROLLER_NONE,35 .max_data_read = MAX_DATA_UNSPECIFIED,36 .max_data_write = MAX_DATA_UNSPECIFIED,37 .command = NULL,38 .multicommand = NULL,39 .read = NULL,40 .write_256 = NULL,41 };42 43 const struct spi_programmer *spi_programmer = &spi_programmer_none;44 45 33 int spi_send_command(struct flashctx *flash, unsigned int writecnt, 46 34 unsigned int readcnt, const unsigned char *writearr, 47 35 unsigned char *readarr) 48 36 { 49 if (!spi_programmer->command) { 50 msg_perr("%s called, but SPI is unsupported on this " 51 "hardware. Please report a bug at " 52 "flashrom@flashrom.org\n", __func__); 53 return 1; 54 } 55 56 return spi_programmer->command(flash, writecnt, readcnt, writearr, 37 return flash->pgm->spi.command(flash, writecnt, readcnt, writearr, 57 38 readarr); 58 39 } … … 60 41 int spi_send_multicommand(struct flashctx *flash, struct spi_command *cmds) 61 42 { 62 if (!spi_programmer->multicommand) { 63 msg_perr("%s called, but SPI is unsupported on this " 64 "hardware. Please report a bug at " 65 "flashrom@flashrom.org\n", __func__); 66 return 1; 67 } 68 69 return spi_programmer->multicommand(flash, cmds); 43 return flash->pgm->spi.multicommand(flash, cmds); 70 44 } 71 45 … … 105 79 unsigned int len) 106 80 { 107 unsigned int max_data = spi_programmer->max_data_read;81 unsigned int max_data = flash->pgm->spi.max_data_read; 108 82 if (max_data == MAX_DATA_UNSPECIFIED) { 109 83 msg_perr("%s called, but SPI read chunk size not defined " … … 118 92 unsigned int start, unsigned int len) 119 93 { 120 unsigned int max_data = spi_programmer->max_data_write;94 unsigned int max_data = flash->pgm->spi.max_data_write; 121 95 if (max_data == MAX_DATA_UNSPECIFIED) { 122 96 msg_perr("%s called, but SPI write chunk size not defined " … … 132 106 { 133 107 unsigned int addrbase = 0; 134 if (!spi_programmer->read) {135 msg_perr("%s called, but SPI read is unsupported on this "136 "hardware. Please report a bug at "137 "flashrom@flashrom.org\n", __func__);138 return 1;139 }140 108 141 109 /* Check if the chip fits between lowest valid and highest possible … … 158 126 msg_perr("Read will probably return garbage.\n"); 159 127 } 160 return spi_programmer->read(flash, buf, addrbase + start, len);128 return flash->pgm->spi.read(flash, buf, addrbase + start, len); 161 129 } 162 130 … … 171 139 unsigned int len) 172 140 { 173 if (!spi_programmer->write_256) { 174 msg_perr("%s called, but SPI page write is unsupported on this " 175 "hardware. Please report a bug at " 176 "flashrom@flashrom.org\n", __func__); 177 return 1; 178 } 179 180 return spi_programmer->write_256(flash, buf, start, len); 141 return flash->pgm->spi.write_256(flash, buf, start, len); 181 142 } 182 143 … … 188 149 uint32_t spi_get_valid_read_addr(struct flashctx *flash) 189 150 { 190 switch ( spi_programmer->type) {151 switch (flash->pgm->spi.type) { 191 152 #if CONFIG_INTERNAL == 1 192 153 #if defined(__i386__) || defined(__x86_64__) … … 201 162 } 202 163 203 voidregister_spi_programmer(const struct spi_programmer *pgm)164 int register_spi_programmer(const struct spi_programmer *pgm) 204 165 { 205 spi_programmer = pgm; 206 buses_supported |= BUS_SPI; 166 struct registered_programmer rpgm; 167 168 if (!pgm->write_256 || !pgm->read || !pgm->command || 169 !pgm->multicommand || 170 ((pgm->command == default_spi_send_command) && 171 (pgm->multicommand == default_spi_send_multicommand))) { 172 msg_perr("%s called with incomplete programmer definition. " 173 "Please report a bug at flashrom@flashrom.org\n", 174 __func__); 175 return ERROR_FLASHROM_BUG; 176 } 177 178 179 rpgm.buses_supported = BUS_SPI; 180 rpgm.spi = *pgm; 181 return register_programmer(&rpgm); 207 182 } -
trunk/spi25.c
r1474 r1475 180 180 * readcnt=4. 181 181 */ 182 switch ( spi_programmer->type) {182 switch (flash->pgm->spi.type) { 183 183 #if CONFIG_INTERNAL == 1 184 184 #if defined(__i386__) || defined(__x86_64__) … … 1121 1121 }}; 1122 1122 1123 switch ( spi_programmer->type) {1123 switch (flash->pgm->spi.type) { 1124 1124 #if CONFIG_INTERNAL == 1 1125 1125 #if defined(__i386__) || defined(__x86_64__)
Note: See TracChangeset
for help on using the changeset viewer.
