Changeset 1475 for trunk/bitbang_spi.c
- Timestamp:
- 12/20/11 01:19:29 (5 months ago)
- File:
-
- 1 edited
-
trunk/bitbang_spi.c (modified) (6 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;
Note: See TracChangeset
for help on using the changeset viewer.
