[flashrom] #1: flashRom doesn't work on MotherBoard with ICH9 + MP2532

flashrom svn at flashrom.org
Thu Aug 20 22:35:01 CEST 2009


#1: flashRom doesn't work on MotherBoard with ICH9 + MP2532
--------------------------------------------------+-------------------------
   Reporter:  annyvonne.le_coq@…                  |          Owner:  hailfinger    
       Type:  defect                              |         Status:  assigned      
   Priority:  major                               |      Milestone:  flashrom 0.9.1
  Component:  flashrom                            |        Version:                
   Keywords:                                      |   Dependencies:                
Patchstatus:  there is no patch                   |  
--------------------------------------------------+-------------------------

Comment(by annyvonne.le_coq@…):

 Hi Carl-Daniel,
 and thanks for your answer.
 [[BR]]
 I'm not in the labs this evening (in France it's 10:00 pm).
 [[BR]]
 All that I can send for the moment is the attached file with the executed
 code.
 (The attach file button doesn't work, so I include the source code in this
 window!!!)
 [[BR]]
 I have inserted printf to trace the data. [[BR]]
 So, I can see that my Opcode (WREN=06) is not included in the opcode
 array.
 [[BR]]
 If the flashrom -V is really needed, I'll send it tomorrow.
 [[BR]]
 [[BR]]
 Kind regards.
 [[BR]]
 Anne

 '''Spi.c'''

 '''int spi_chip_erase_c7'''(struct flashchip *flash)
 537{
 538        int result;
 539        struct spi_command spicommands[] = {
 540        {
 541                .writecnt       = JEDEC_WREN_OUTSIZE,
 542                .writearr       = (const unsigned char[]){ JEDEC_WREN
 },
 543                .readcnt        = 0,
 544                .readarr        = NULL,
 545        }, {
 546                .writecnt       = JEDEC_CE_C7_OUTSIZE,
 547                .writearr       = (const unsigned char[]){ JEDEC_CE_C7
 },
 548                .readcnt        = 0,
 549                .readarr        = NULL,
 550        }, {
 551                .writecnt       = 0,
 552                .writearr       = NULL,
 553                .readcnt        = 0,
 554                .readarr        = NULL,
 555        }};
 556
 557        result = spi_disable_blockprotect();
 558        if (result) {
 559                fprintf(stderr, "spi_disable_blockprotect failed\n");
 560                return result;
 561        }
 562
 563        '''result = spi_send_multicommand(spicommands)''';

 …….
 '''int spi_send_multicommand(struct spi_command *spicommands)'''
 120{
 121        if (!spi_programmer[spi_controller].multicommand) {
 122                fprintf(stderr, "%s called, but SPI is unsupported on
 this "
 123                        "hardware. Please report a bug.\n", __func__);
 124                return 1;
 125        }
 126
 127       ''' return
 spi_programmer[spi_controller].multicommand(spicommands);'''
 128}

 ….
 '''const struct spi_programmer spi_programmer[]''' = {
 36        { /* SPI_CONTROLLER_NONE */
 37                .command = NULL,
 38                .multicommand = NULL,
 39                .read = NULL,
 40                .write_256 = NULL,
 41        },
 42
 43        { /* SPI_CONTROLLER_ICH7 */
 44                .command = ich_spi_send_command,
 45                .multicommand = ich_spi_send_multicommand,
 46                .read = ich_spi_read,
 47                .write_256 = ich_spi_write_256,
 48        },
 49
 50        { /* SPI_CONTROLLER_ICH9 */
 51                .command = ich_spi_send_command,
 52                .multicommand = '''ich_spi_send_multicommand,'''
 53                .read = ich_spi_read,
 54                .write_256 = ich_spi_write_256,
 55        },
 56
 …..

 '''Ichspi.c'''

 '''int ich_spi_send_multicommand'''(struct spi_command *spicommands)
 746{
 747        int ret = 0;
 748        while ((spicommands->writecnt || spicommands->readcnt) && !ret)
 {
 749                ret =
 '''ich_spi_send_command'''(spicommands->writecnt,spicommands->readcnt,
 750                  spicommands->writearr, spicommands->readarr) ;
 ….

 '''int ich_spi_send_command'''(unsigned int writecnt, unsigned int
 readcnt,
 691                    const unsigned char *writearr, unsigned char
 *readarr)
 692{
 693        int a;
 694        int result;
 695        int opcode_index = -1;
 696        const unsigned char cmd = *writearr;
 697        OPCODE *opcode;
 698        uint32_t addr = 0;
 699        uint8_t *data;
 700        int count;
 701
 702        /* find cmd in opcodes-table */
 703        for (a = 0; a < 8; a++) {
 704                if (('''curopcodes->opcode[a]).opcode == cmd''') {
 705                        opcode_index = a;
 706                        break;
 707                }
 708        }
 ….
 Cmd = JEDEC_WREN (that is 06) but it’s not in the following table :
 170OPCODES O_ST_M25P = {
 171        {
 172         JEDEC_WREN,
 173         0},
 174        {
 175         {JEDEC_BYTE_PROGRAM, SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS, 1},
 // Write Byte
 176         {JEDEC_READ, SPI_OPCODE_TYPE_READ_WITH_ADDRESS, 0},    // Read
 Data
 177         {JEDEC_BE_D8, SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS, 1},  //
 Erase Sector
 178         {JEDEC_RDSR, SPI_OPCODE_TYPE_READ_NO_ADDRESS, 0},      // Read
 Device Status Reg
 179         {JEDEC_REMS, SPI_OPCODE_TYPE_READ_WITH_ADDRESS, 0},    // Read
 Electronic Manufacturer Signature
 180         {JEDEC_WRSR, SPI_OPCODE_TYPE_WRITE_NO_ADDRESS, 1},     //
 Write Status Register
 181         {JEDEC_RDID, SPI_OPCODE_TYPE_READ_NO_ADDRESS, 0},      // Read
 JDEC ID
 182         {JEDEC_CE_C7, SPI_OPCODE_TYPE_WRITE_NO_ADDRESS, 1},    // Bulk
 erase
 183         }
 184};

 When I insert a printf while reading curopcodes->opcode[a].opcode, I read
 from JEDEC_BYTE_PROGRAM to JEDEC_CE_C7.
 The input cmd field is JEDEC_WREN. So, it doesn’t match !!

-- 
Ticket URL: <http://www.flashrom.org/trac/flashrom/ticket/1#comment:2>
flashrom <http://www.flashrom.org/>



More information about the flashrom mailing list