Paul Sokolovsky | 40f5ecd | 2016-04-12 00:37:04 +0300 | [diff] [blame] | 1 | import esp |
| 2 | |
| 3 | class FlashBdev: |
| 4 | |
| 5 | SEC_SIZE = 4096 |
Paul Sokolovsky | 5f7ce2a | 2017-05-12 16:08:54 +0300 | [diff] [blame] | 6 | RESERVED_SECS = 1 |
Damien George | bae7798 | 2017-01-04 23:47:09 +1100 | [diff] [blame] | 7 | START_SEC = esp.flash_user_start() // SEC_SIZE + RESERVED_SECS |
| 8 | NUM_BLK = 0x6b - RESERVED_SECS |
Paul Sokolovsky | 40f5ecd | 2016-04-12 00:37:04 +0300 | [diff] [blame] | 9 | |
| 10 | def __init__(self, blocks=NUM_BLK): |
| 11 | self.blocks = blocks |
| 12 | |
Damien George | 6eee541 | 2019-11-07 18:43:37 +1100 | [diff] [blame] | 13 | def readblocks(self, n, buf, off=0): |
| 14 | #print("readblocks(%s, %x(%d), %d)" % (n, id(buf), len(buf), off)) |
| 15 | esp.flash_read((n + self.START_SEC) * self.SEC_SIZE + off, buf) |
Paul Sokolovsky | 40f5ecd | 2016-04-12 00:37:04 +0300 | [diff] [blame] | 16 | |
Damien George | 6eee541 | 2019-11-07 18:43:37 +1100 | [diff] [blame] | 17 | def writeblocks(self, n, buf, off=None): |
| 18 | #print("writeblocks(%s, %x(%d), %d)" % (n, id(buf), len(buf), off)) |
Paul Sokolovsky | 2494399 | 2016-04-20 00:35:46 +0300 | [diff] [blame] | 19 | #assert len(buf) <= self.SEC_SIZE, len(buf) |
Damien George | 6eee541 | 2019-11-07 18:43:37 +1100 | [diff] [blame] | 20 | if off is None: |
| 21 | esp.flash_erase(n + self.START_SEC) |
| 22 | off = 0 |
| 23 | esp.flash_write((n + self.START_SEC) * self.SEC_SIZE + off, buf) |
Paul Sokolovsky | 40f5ecd | 2016-04-12 00:37:04 +0300 | [diff] [blame] | 24 | |
| 25 | def ioctl(self, op, arg): |
Paul Sokolovsky | 2494399 | 2016-04-20 00:35:46 +0300 | [diff] [blame] | 26 | #print("ioctl(%d, %r)" % (op, arg)) |
Damien George | cfe1c5a | 2019-10-29 12:25:30 +1100 | [diff] [blame] | 27 | if op == 4: # MP_BLOCKDEV_IOCTL_BLOCK_COUNT |
Paul Sokolovsky | 40f5ecd | 2016-04-12 00:37:04 +0300 | [diff] [blame] | 28 | return self.blocks |
Damien George | cfe1c5a | 2019-10-29 12:25:30 +1100 | [diff] [blame] | 29 | if op == 5: # MP_BLOCKDEV_IOCTL_BLOCK_SIZE |
Paul Sokolovsky | 40f5ecd | 2016-04-12 00:37:04 +0300 | [diff] [blame] | 30 | return self.SEC_SIZE |
Damien George | 6eee541 | 2019-11-07 18:43:37 +1100 | [diff] [blame] | 31 | if op == 6: # MP_BLOCKDEV_IOCTL_BLOCK_ERASE |
| 32 | esp.flash_erase(arg + self.START_SEC) |
| 33 | return 0 |
Paul Sokolovsky | 40f5ecd | 2016-04-12 00:37:04 +0300 | [diff] [blame] | 34 | |
Paul Sokolovsky | 237c519 | 2016-04-26 01:36:32 +0300 | [diff] [blame] | 35 | size = esp.flash_size() |
| 36 | if size < 1024*1024: |
Paul Sokolovsky | 8dcce92 | 2016-04-18 17:14:00 +0300 | [diff] [blame] | 37 | bdev = None |
| 38 | else: |
Paul Sokolovsky | ca59f5f | 2016-08-06 15:21:49 +0300 | [diff] [blame] | 39 | # 20K at the flash end is reserved for SDK params storage |
| 40 | bdev = FlashBdev((size - 20480) // FlashBdev.SEC_SIZE - FlashBdev.START_SEC) |