NAME

Device::Chip::SDCard - chip driver for SD and MMC cards

SYNOPSIS

 use Device::Chip::SDCard;

 my $card = Device::Chip::SDCard->new;

 $card->mount( Device::Chip::Adapter::...->new )->get;

 $card->initialise->get;

 my $bytes = $card->read_block( 0 )->get;

 print "Read block zero:\n";
 printf "%v02X\n", $bytes;

DESCRIPTION

This Device::Chip subclass provides specific communication to an SD or MMC storage card attached via an SPI adapter.

At present it only supports MMC and SDSC ("standard capacity") cards, not SDHC or SDXC.

METHODS

The following methods documented with a trailing call to ->get return Future instances.

initialise

   $card->initialise->get

Checks that an SD card is present, switches it into SPI mode and waits for its initialisation process to complete.

size

   $n_bytes = $card->size->get

Returns the size of the media card in bytes.

read_csd

   $data = $card->read_csd->get;

Returns a HASH reference containing decoded fields from the SD card's CSD ("card-specific data") register.

This hash will contain the following fields:

   TAAC
   NSAC
   TRAN_SPEED
   CCC
   READ_BL_LEN
   READ_BL_LEN_PARTIAL
   WRITE_BLK_MISALIGN
   READ_BLK_MISALIGN
   DSR_IMP
   C_SIZE
   VDD_R_CURR_MIN
   VDD_R_CURR_MAX
   VDD_W_CURR_MIN
   VDD_W_CURR_MAX
   C_SIZE_MULT
   ERASE_BLK_EN
   SECTOR_SIZE
   WP_GRP_SIZE
   WP_GRP_ENABLE
   R2W_FACTOR
   WRITE_BL_LEN
   WRITE_BL_PARTIAL
   FILE_FORMAT_GRP
   COPY
   PERM_WRITE_PROTECT
   TEMP_WRITE_PROTECT
   FILE_FORMAT

The hash will also contain the following calculated fields, derived from the decoded fields above for convenience of calling code.

   blocks          # number of blocks implied by C_SIZE / C_SIZE_MULT
   bytes           # number of bytes of storage, implied by blocks and READ_BL_LEN

read_ocr

   $fields = $card->read_ocr->get

Returns a HASH reference containing decoded fields from the card's OCR ("operating conditions register").

This hash will contain the following fields:

   BUSY
   CCS
   UHS_II
   1V8_ACCEPTED
   3V5, 3V4, 3V3, ..., 2V7

read_block

   $bytes = $card->read_block( $lba )->get

Returns a 512-byte bytestring containing data read from the given sector of the card.

TODO

  • Support block writing.

  • Support the different initialisation sequence (and block size requirements) of SDHC cards.

AUTHOR

Paul Evans <leonerd@leonerd.org.uk>