Changeset 0596902 in rtems


Ignore:
Timestamp:
Jun 22, 2010, 11:36:14 AM (9 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, master
Children:
0378b478
Parents:
5e649e5
Message:

2010-06-22 Arnout Vandecappelle <arnout@…>

PR 1580/misc

  • libchip/i2c/spi-sd-card.c: Use bigger chunks and yield processor while waiting for read data.
Location:
c/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • c/src/ChangeLog

    r5e649e5 r0596902  
     12010-06-22      Arnout Vandecappelle <arnout@mind.be>
     2
     3        PR 1580/misc
     4        * libchip/i2c/spi-sd-card.c: Use bigger chunks and yield processor
     5        while waiting for read data.
     6
    172010-06-22      Arnout Vandecappelle <arnout@mind.be>
    28
  • c/src/libchip/i2c/spi-sd-card.c

    r5e649e5 r0596902  
    375375        int retries = e->n_ac_max * 25 / 10;
    376376        /* n_ac_max/100 is supposed to be the average waiting time. To
    377            approximate this, we start with waiting n_ac_max/250 and
     377           approximate this, we start with waiting n_ac_max/150 and
    378378           gradually increase the waiting time. */
    379379        int wait_time_bytes = (retries + 149) / 150;
     
    531531        int rv = 0;
    532532
    533         /* Access time idle tokens */
    534         uint32_t n_ac = 1;
    535 
    536533        /* Discard command response */
    537534        int r = e->response_index + 1;
    538535
    539         /* Minimum token number before data start */
    540         int next_response_size = 2;
    541 
    542536        /* Standard response size */
    543537        int response_size = SD_CARD_COMMAND_SIZE;
    544538
     539        /* Where the response is stored */
     540        uint8_t *response = e->response;
     541
    545542        /* Data input index */
    546543        int i = 0;
     
    549546        uint16_t crc16;
    550547
     548        /* Maximum number of tokens to read. */
     549        int retries = e->n_ac_max;
     550
    551551        SD_CARD_INVALIDATE_RESPONSE_INDEX( e);
    552552
     
    555555
    556556                /* Search the data start token in in current response buffer */
     557                retries -= (response_size - r);
    557558                while (r < response_size) {
    558                         RTEMS_DEBUG_PRINT( "Token [%02u]: 0x%02x\n", r, e->response [r]);
    559                         if (n_ac > e->n_ac_max) {
    560                                 RTEMS_SYSLOG_ERROR( "Timeout\n");
    561                                 return -RTEMS_IO_ERROR;
    562                         } else if (e->response [r] == start_token) {
     559                        RTEMS_DEBUG_PRINT( "Token [%02u]: 0x%02x\n", r, response [r]);
     560                        if (response [r] == start_token) {
    563561                                /* Discard data start token */
    564562                                ++r;
    565563                                goto sd_card_read_start;
    566                         } else if (SD_CARD_IS_DATA_ERROR( e->response [r])) {
    567                                 RTEMS_SYSLOG_ERROR( "Data error token [%02i]: 0x%02" PRIx8 "\n", r, e->response [r]);
     564                        } else if (SD_CARD_IS_DATA_ERROR( response [r])) {
     565                                RTEMS_SYSLOG_ERROR( "Data error token [%02i]: 0x%02" PRIx8 "\n", r, response [r]);
    568566                                return -RTEMS_IO_ERROR;
    569                         } else if (e->response [r] != SD_CARD_IDLE_TOKEN) {
    570                                 RTEMS_SYSLOG_ERROR( "Unexpected token [%02i]: 0x%02" PRIx8 "\n", r, e->response [r]);
     567                        } else if (response [r] != SD_CARD_IDLE_TOKEN) {
     568                                RTEMS_SYSLOG_ERROR( "Unexpected token [%02i]: 0x%02" PRIx8 "\n", r, response [r]);
    571569                                return -RTEMS_IO_ERROR;
    572570                        }
    573                         ++n_ac;
    574571                        ++r;
    575572                }
    576573
    577                 /* Query more */
    578                 rv = sd_card_query( e, e->response, next_response_size);
     574                if (retries <= 0) {
     575                        RTEMS_SYSLOG_ERROR( "Timeout\n");
     576                        return -RTEMS_IO_ERROR;
     577                }
     578
     579                if (e->schedule_if_busy)
     580                        rtems_task_wake_after( RTEMS_YIELD_PROCESSOR);
     581
     582                /* Query more.  We typically have to wait between 10 and 100
     583                   bytes.  To reduce overhead, read the response in chunks of
     584                   50 bytes - this doesn't introduce too much copy overhead
     585                   but does allow SPI DMA transfers to work efficiently. */
     586                response = in;
     587                response_size = 50;
     588                if (response_size > n)
     589                        response_size = n;
     590                rv = sd_card_query( e, response, response_size);
    579591                RTEMS_CHECK_RV( rv, "Query data start token");
    580 
    581                 /* Set standard query size */
    582                 response_size = next_response_size;
    583                 next_response_size = SD_CARD_COMMAND_SIZE;
    584592
    585593                /* Reset start position */
     
    591599        /* Read data */
    592600        while (r < response_size && i < n) {
    593                 in [i++] = e->response [r++];
     601                in [i++] = response [r++];
    594602        }
    595603
Note: See TracChangeset for help on using the changeset viewer.