Merge remote-tracking branch 'upstream/main' into esp32-analogout
This commit is contained in:
commit
b435ef0272
7
.github/workflows/build.yml
vendored
7
.github/workflows/build.yml
vendored
@ -28,7 +28,7 @@ jobs:
|
||||
- name: CircuitPython version
|
||||
run: |
|
||||
git describe --dirty --tags
|
||||
echo "::set-env name=CP_VERSION::$(git describe --dirty --tags)"
|
||||
echo >>$GITHUB_ENV CP_VERSION=$(git describe --dirty --tags)
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
@ -132,7 +132,7 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install gettext awscli
|
||||
echo "::set-env name=PATH::/usr/local/opt/gettext/bin:$PATH"
|
||||
echo >>$GITHUB_PATH /usr/local/opt/gettext/bin
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
@ -146,7 +146,7 @@ jobs:
|
||||
- name: CircuitPython version
|
||||
run: |
|
||||
git describe --dirty --tags
|
||||
echo "::set-env name=CP_VERSION::$(git describe --dirty --tags)"
|
||||
echo >>$GITHUB_ENV CP_VERSION=$(git describe --dirty --tags)
|
||||
- name: Build mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- uses: actions/upload-artifact@v2
|
||||
@ -243,6 +243,7 @@ jobs:
|
||||
- "metro_m0_express"
|
||||
- "metro_m4_airlift_lite"
|
||||
- "metro_m4_express"
|
||||
- "metro_m7_1011"
|
||||
- "metro_nrf52840_express"
|
||||
- "mini_sam_m4"
|
||||
- "monster_m4sk"
|
||||
|
2
.github/workflows/pre-commit.yml
vendored
2
.github/workflows/pre-commit.yml
vendored
@ -16,7 +16,7 @@ jobs:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/setup-python@v1
|
||||
- name: set PY
|
||||
run: echo "::set-env name=PY::$(python -c 'import hashlib, sys;print(hashlib.sha256(sys.version.encode()+sys.executable.encode()).hexdigest())')"
|
||||
run: echo >>$GITHUB_ENV PY="$(python -c 'import hashlib, sys;print(hashlib.sha256(sys.version.encode()+sys.executable.encode()).hexdigest())')"
|
||||
- uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.cache/pre-commit
|
||||
|
@ -98,7 +98,7 @@ bleio_adapter_obj_t *common_hal_bleio_allocate_adapter_or_raise(void) {
|
||||
|
||||
void common_hal_bleio_check_connected(uint16_t conn_handle) {
|
||||
if (conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||
mp_raise_bleio_ConnectionError(translate("Not connected"));
|
||||
mp_raise_ConnectionError(translate("Not connected"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -133,7 +133,7 @@ DRESULT disk_ioctl (
|
||||
}
|
||||
|
||||
// First part: call the relevant method of the underlying block device
|
||||
mp_obj_t ret = mp_const_none;
|
||||
mp_int_t out_value = 0;
|
||||
if (vfs->flags & FSUSER_HAVE_IOCTL) {
|
||||
// new protocol with ioctl
|
||||
static const uint8_t op_map[8] = {
|
||||
@ -144,9 +144,19 @@ DRESULT disk_ioctl (
|
||||
};
|
||||
uint8_t bp_op = op_map[cmd & 7];
|
||||
if (bp_op != 0) {
|
||||
if (vfs->flags & FSUSER_NATIVE) {
|
||||
bool (*f)(size_t, mp_int_t*) = (void*)(uintptr_t)vfs->u.ioctl[2];
|
||||
if (!f(bp_op, (mp_int_t*) &out_value)) {
|
||||
return RES_ERROR;
|
||||
}
|
||||
} else {
|
||||
vfs->u.ioctl[2] = MP_OBJ_NEW_SMALL_INT(bp_op);
|
||||
vfs->u.ioctl[3] = MP_OBJ_NEW_SMALL_INT(0); // unused
|
||||
ret = mp_call_method_n_kw(2, 0, vfs->u.ioctl);
|
||||
mp_obj_t ret = mp_call_method_n_kw(2, 0, vfs->u.ioctl);
|
||||
if (ret != mp_const_none) {
|
||||
out_value = mp_obj_get_int(ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// old protocol with sync and count
|
||||
@ -157,10 +167,13 @@ DRESULT disk_ioctl (
|
||||
}
|
||||
break;
|
||||
|
||||
case GET_SECTOR_COUNT:
|
||||
ret = mp_call_method_n_kw(0, 0, vfs->u.old.count);
|
||||
case GET_SECTOR_COUNT: {
|
||||
mp_obj_t ret = mp_call_method_n_kw(0, 0, vfs->u.old.count);
|
||||
if (ret != mp_const_none) {
|
||||
out_value = mp_obj_get_int(ret);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
case GET_SECTOR_SIZE:
|
||||
// old protocol has fixed sector size of 512 bytes
|
||||
break;
|
||||
@ -177,16 +190,16 @@ DRESULT disk_ioctl (
|
||||
return RES_OK;
|
||||
|
||||
case GET_SECTOR_COUNT: {
|
||||
*((DWORD*)buff) = mp_obj_get_int(ret);
|
||||
*((DWORD*)buff) = out_value;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
case GET_SECTOR_SIZE: {
|
||||
if (ret == mp_const_none) {
|
||||
if (out_value == 0) {
|
||||
// Default sector size
|
||||
*((WORD*)buff) = 512;
|
||||
} else {
|
||||
*((WORD*)buff) = mp_obj_get_int(ret);
|
||||
*((WORD*)buff) = out_value;
|
||||
}
|
||||
#if _MAX_SS != _MIN_SS
|
||||
// need to store ssize because we use it in disk_read/disk_write
|
||||
@ -202,7 +215,7 @@ DRESULT disk_ioctl (
|
||||
case IOCTL_INIT:
|
||||
case IOCTL_STATUS: {
|
||||
DSTATUS stat;
|
||||
if (ret != mp_const_none && MP_OBJ_SMALL_INT_VALUE(ret) != 0) {
|
||||
if (out_value != 0) {
|
||||
// error initialising
|
||||
stat = STA_NOINIT;
|
||||
} else if (vfs->writeblocks[0] == MP_OBJ_NULL) {
|
||||
|
96
locale/ID.po
96
locale/ID.po
@ -6,7 +6,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-09-29 20:14-0500\n"
|
||||
"PO-Revision-Date: 2020-07-06 18:10+0000\n"
|
||||
"PO-Revision-Date: 2020-10-08 16:22+0000\n"
|
||||
"Last-Translator: oon arfiandwi <oon.arfiandwi@gmail.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: ID\n"
|
||||
@ -14,7 +14,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 4.2-dev\n"
|
||||
"X-Generator: Weblate 4.3-dev\n"
|
||||
|
||||
#: main.c
|
||||
msgid ""
|
||||
@ -1218,32 +1218,32 @@ msgstr "Kesalahan fatal MicroPython."
|
||||
|
||||
#: shared-bindings/audiobusio/PDMIn.c
|
||||
msgid "Microphone startup delay must be in range 0.0 to 1.0"
|
||||
msgstr ""
|
||||
msgstr "Penundaan mulai mikrofon harus dalam kisaran 0,0 hingga 1,0"
|
||||
|
||||
#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/stm/common-hal/busio/SPI.c
|
||||
msgid "Missing MISO or MOSI Pin"
|
||||
msgstr ""
|
||||
msgstr "Tidak menemukan Pin MISO atau MOSI"
|
||||
|
||||
#: shared-bindings/displayio/Group.c
|
||||
msgid "Must be a %q subclass."
|
||||
msgstr ""
|
||||
msgstr "Harus berupa subclass %q."
|
||||
|
||||
#: ports/mimxrt10xx/common-hal/busio/SPI.c shared-bindings/busio/SPI.c
|
||||
msgid "Must provide MISO or MOSI pin"
|
||||
msgstr ""
|
||||
msgstr "Harus menyediakan pin MISO atau MOSI"
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
#, c-format
|
||||
msgid "Must use a multiple of 6 rgb pins, not %d"
|
||||
msgstr ""
|
||||
msgstr "Harus menggunakan kelipatan 6 pin rgb, bukan %d"
|
||||
|
||||
#: py/parse.c
|
||||
msgid "Name too long"
|
||||
msgstr ""
|
||||
msgstr "Nama terlalu panjang"
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||
msgid "No CCCD for this Characteristic"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada CCCD untuk Karakteristik ini"
|
||||
|
||||
#: ports/atmel-samd/common-hal/analogio/AnalogOut.c
|
||||
#: ports/stm/common-hal/analogio/AnalogOut.c
|
||||
@ -1258,12 +1258,12 @@ msgstr "tidak ada channel DMA ditemukan"
|
||||
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
|
||||
#: ports/stm/common-hal/busio/SPI.c
|
||||
msgid "No MISO Pin"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada Pin MISO"
|
||||
|
||||
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
|
||||
#: ports/stm/common-hal/busio/SPI.c
|
||||
msgid "No MOSI Pin"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada Pin MOSI"
|
||||
|
||||
#: ports/atmel-samd/common-hal/busio/UART.c
|
||||
#: ports/esp32s2/common-hal/busio/UART.c
|
||||
@ -1281,11 +1281,11 @@ msgstr "Tidak ada pin TX"
|
||||
|
||||
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
|
||||
msgid "No available clocks"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada clocks yang tersedia"
|
||||
|
||||
#: shared-bindings/_bleio/PacketBuffer.c
|
||||
msgid "No connection: length cannot be determined"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada koneksi: panjang tidak dapat ditentukan"
|
||||
|
||||
#: shared-bindings/board/__init__.c
|
||||
msgid "No default %q bus"
|
||||
@ -1297,11 +1297,11 @@ msgstr "Tidak ada GCLK yang kosong"
|
||||
|
||||
#: shared-bindings/os/__init__.c
|
||||
msgid "No hardware random available"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada perangkat keras acak yang tersedia"
|
||||
|
||||
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
|
||||
msgid "No hardware support on clk pin"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada dukungan perangkat keras pada pin clk"
|
||||
|
||||
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
|
||||
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
|
||||
@ -1310,11 +1310,11 @@ msgstr "Tidak ada dukungan hardware untuk pin"
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
msgid "No key was specified"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada kunci yang ditentukan"
|
||||
|
||||
#: shared-bindings/time/__init__.c
|
||||
msgid "No long integer support"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada dukungan bilangan bulat yang panjang"
|
||||
|
||||
#: ports/esp32s2/common-hal/pwmio/PWMOut.c
|
||||
msgid "No more channels available"
|
||||
@ -1326,7 +1326,7 @@ msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/pwmio/PWMOut.c
|
||||
msgid "No more timers available on this pin."
|
||||
msgstr ""
|
||||
msgstr "Tidak ada lagi penghitung waktu yang tersedia pada pin ini."
|
||||
|
||||
#: shared-bindings/wifi/Radio.c
|
||||
msgid "No network with that ssid"
|
||||
@ -1334,23 +1334,23 @@ msgstr ""
|
||||
|
||||
#: shared-module/touchio/TouchIn.c
|
||||
msgid "No pulldown on pin; 1Mohm recommended"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada pull-down pada pin; 1Mohm direkomendasikan"
|
||||
|
||||
#: py/moduerrno.c
|
||||
msgid "No space left on device"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada ruang yang tersisa di perangkat"
|
||||
|
||||
#: py/moduerrno.c
|
||||
msgid "No such file/directory"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada file/direktori"
|
||||
|
||||
#: shared-module/rgbmatrix/RGBMatrix.c
|
||||
msgid "No timer available"
|
||||
msgstr ""
|
||||
msgstr "Penghitung waktu tidak tersedia"
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Nordic Soft Device failure assertion."
|
||||
msgstr ""
|
||||
msgstr "Pernyataan kegagalan Perangkat Lunak Nordic."
|
||||
|
||||
#: shared-bindings/ipaddress/IPv4Address.c shared-bindings/ipaddress/__init__.c
|
||||
msgid "Not a valid IP string"
|
||||
@ -1365,7 +1365,7 @@ msgstr "Tidak dapat menyambungkan ke AP"
|
||||
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
|
||||
#: shared-bindings/audiopwmio/PWMAudioOut.c
|
||||
msgid "Not playing"
|
||||
msgstr ""
|
||||
msgstr "Tidak berfungsi"
|
||||
|
||||
#: main.c
|
||||
msgid "Not running saved code.\n"
|
||||
@ -1379,6 +1379,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Object has been deinitialized and can no longer be used. Create a new object."
|
||||
msgstr ""
|
||||
"Objek telah dideinisialisasi dan tidak dapat lagi digunakan. Buat objek baru."
|
||||
|
||||
#: ports/nrf/common-hal/busio/UART.c
|
||||
msgid "Odd parity is not supported"
|
||||
@ -1401,6 +1402,8 @@ msgstr ""
|
||||
msgid ""
|
||||
"Only Windows format, uncompressed BMP supported: given header size is %d"
|
||||
msgstr ""
|
||||
"Hanya format Windows, mendukung BMP tidak dikompresi: ukuran header yang "
|
||||
"diberikan adalah %d"
|
||||
|
||||
#: shared-module/displayio/OnDiskBitmap.c
|
||||
#, c-format
|
||||
@ -1408,6 +1411,8 @@ msgid ""
|
||||
"Only monochrome, indexed 4bpp or 8bpp, and 16bpp or greater BMPs supported: "
|
||||
"%d bpp given"
|
||||
msgstr ""
|
||||
"Hanya monokrom, 4bpp atau 8bpp yang diindeks, dan 16bpp atau lebih yang "
|
||||
"didukung: %d bpp diberikan"
|
||||
|
||||
#: shared-bindings/ipaddress/__init__.c
|
||||
msgid "Only raw int supported for ip"
|
||||
@ -1419,27 +1424,29 @@ msgstr ""
|
||||
|
||||
#: shared-bindings/audiobusio/PDMIn.c
|
||||
msgid "Oversample must be multiple of 8."
|
||||
msgstr ""
|
||||
msgstr "Sampel berlebihan harus kelipatan 8."
|
||||
|
||||
#: shared-bindings/pwmio/PWMOut.c
|
||||
msgid ""
|
||||
"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)"
|
||||
msgstr ""
|
||||
msgstr "PWM duty_cycle harus antara 0 dan 65535 inklusif (resolusi 16 bit)"
|
||||
|
||||
#: shared-bindings/pwmio/PWMOut.c
|
||||
msgid ""
|
||||
"PWM frequency not writable when variable_frequency is False on construction."
|
||||
msgstr ""
|
||||
"Frekuensi PWM tidak dapat ditulis ketika variabel_frequency Salah pada "
|
||||
"konstruksi."
|
||||
|
||||
#: ports/esp32s2/common-hal/displayio/ParallelBus.c
|
||||
#: ports/mimxrt10xx/common-hal/displayio/ParallelBus.c
|
||||
#: ports/stm/common-hal/displayio/ParallelBus.c
|
||||
msgid "ParallelBus not yet supported"
|
||||
msgstr ""
|
||||
msgstr "ParallelBus belum didukung"
|
||||
|
||||
#: py/moduerrno.c
|
||||
msgid "Permission denied"
|
||||
msgstr ""
|
||||
msgstr "Izin ditolak"
|
||||
|
||||
#: ports/atmel-samd/common-hal/analogio/AnalogIn.c
|
||||
#: ports/cxd56/common-hal/analogio/AnalogIn.c
|
||||
@ -1455,11 +1462,11 @@ msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/countio/Counter.c
|
||||
msgid "Pin must support hardware interrupts"
|
||||
msgstr ""
|
||||
msgstr "Pin harus mendukung interupsi perangkat keras"
|
||||
|
||||
#: ports/stm/common-hal/pulseio/PulseIn.c
|
||||
msgid "Pin number already reserved by EXTI"
|
||||
msgstr ""
|
||||
msgstr "Nomor pin sudah dipesan oleh EXTI"
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
#, c-format
|
||||
@ -1468,6 +1475,9 @@ msgid ""
|
||||
"bytes. If this cannot be avoided, pass allow_inefficient=True to the "
|
||||
"constructor"
|
||||
msgstr ""
|
||||
"Pinout menggunakan %d byte per elemen, yang mengonsumsi lebih dari %d byte "
|
||||
"ideal. Jika ini tidak dapat dihindari, berikan allow_inefficient=True ke "
|
||||
"konstruktor"
|
||||
|
||||
#: py/builtinhelp.c
|
||||
msgid "Plus any modules on the filesystem\n"
|
||||
@ -1494,7 +1504,7 @@ msgstr ""
|
||||
|
||||
#: shared-bindings/_bleio/Adapter.c
|
||||
msgid "Prefix buffer must be on the heap"
|
||||
msgstr ""
|
||||
msgstr "Buffer awalan harus ada di heap"
|
||||
|
||||
#: main.c
|
||||
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
|
||||
@ -1504,43 +1514,43 @@ msgstr ""
|
||||
|
||||
#: shared-bindings/digitalio/DigitalInOut.c
|
||||
msgid "Pull not used when direction is output."
|
||||
msgstr ""
|
||||
msgstr "Pull tidak digunakan saat arah output."
|
||||
|
||||
#: ports/stm/common-hal/os/__init__.c
|
||||
msgid "RNG DeInit Error"
|
||||
msgstr ""
|
||||
msgstr "Kesalahan DeInit RNG"
|
||||
|
||||
#: ports/stm/common-hal/os/__init__.c
|
||||
msgid "RNG Init Error"
|
||||
msgstr ""
|
||||
msgstr "Kesalahan Init RNG"
|
||||
|
||||
#: ports/esp32s2/common-hal/busio/UART.c
|
||||
#: ports/mimxrt10xx/common-hal/busio/UART.c
|
||||
msgid "RS485 inversion specified when not in RS485 mode"
|
||||
msgstr ""
|
||||
msgstr "Pembalikan RS485 ditentukan saat tidak dalam mode RS485"
|
||||
|
||||
#: ports/cxd56/common-hal/rtc/RTC.c ports/esp32s2/common-hal/rtc/RTC.c
|
||||
#: ports/mimxrt10xx/common-hal/rtc/RTC.c ports/nrf/common-hal/rtc/RTC.c
|
||||
msgid "RTC calibration is not supported on this board"
|
||||
msgstr ""
|
||||
msgstr "Kalibrasi RTC tidak didukung pada board ini"
|
||||
|
||||
#: shared-bindings/time/__init__.c
|
||||
msgid "RTC is not supported on this board"
|
||||
msgstr ""
|
||||
msgstr "RTC tidak didukung di board ini"
|
||||
|
||||
#: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c
|
||||
#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
|
||||
msgid "RTS/CTS/RS485 Not yet supported on this device"
|
||||
msgstr ""
|
||||
msgstr "RTS/CTS/RS485 Belum didukung pada perangkat ini"
|
||||
|
||||
#: ports/stm/common-hal/os/__init__.c
|
||||
msgid "Random number generation error"
|
||||
msgstr ""
|
||||
msgstr "Kesalahan pembuatan nomor acak"
|
||||
|
||||
#: shared-bindings/memorymonitor/AllocationSize.c
|
||||
#: shared-bindings/pulseio/PulseIn.c
|
||||
msgid "Read-only"
|
||||
msgstr ""
|
||||
msgstr "Baca-saja"
|
||||
|
||||
#: extmod/vfs_fat.c py/moduerrno.c
|
||||
msgid "Read-only filesystem"
|
||||
@ -1553,7 +1563,7 @@ msgstr "sistem file (filesystem) bersifat Read-only"
|
||||
|
||||
#: shared-bindings/displayio/EPaperDisplay.c
|
||||
msgid "Refresh too soon"
|
||||
msgstr ""
|
||||
msgstr "Segarkan terlalu cepat"
|
||||
|
||||
#: shared-bindings/canio/RemoteTransmissionRequest.c
|
||||
msgid "RemoteTransmissionRequests limited to 8 bytes"
|
||||
@ -1561,7 +1571,7 @@ msgstr ""
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
msgid "Requested AES mode is unsupported"
|
||||
msgstr ""
|
||||
msgstr "Mode AES yang diminta tidak didukung"
|
||||
|
||||
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
|
||||
msgid "Right channel unsupported"
|
||||
@ -1569,7 +1579,7 @@ msgstr "Channel Kanan tidak didukung"
|
||||
|
||||
#: shared-bindings/_pew/PewPew.c
|
||||
msgid "Row entry must be digitalio.DigitalInOut"
|
||||
msgstr ""
|
||||
msgstr "Entri baris harus digitalio.DigitalInOut"
|
||||
|
||||
#: main.c
|
||||
msgid "Running in safe mode! "
|
||||
|
@ -7,14 +7,15 @@ msgstr ""
|
||||
"Project-Id-Version: circuitpython-cn\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-09-29 20:14-0500\n"
|
||||
"PO-Revision-Date: 2019-04-13 10:10-0700\n"
|
||||
"Last-Translator: hexthat\n"
|
||||
"PO-Revision-Date: 2020-10-08 16:22+0000\n"
|
||||
"Last-Translator: hexthat <hexthat@gmail.com>\n"
|
||||
"Language-Team: Chinese Hanyu Pinyin\n"
|
||||
"Language: zh\n"
|
||||
"Language: zh_Latn_pinyin\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 4.3-dev\n"
|
||||
|
||||
#: main.c
|
||||
msgid ""
|
||||
@ -99,7 +100,7 @@ msgstr "%q bìxū shì chángdù wèi 2 de yuán zǔ"
|
||||
|
||||
#: shared-bindings/canio/Match.c
|
||||
msgid "%q out of range"
|
||||
msgstr ""
|
||||
msgstr "%q chāochū fànwéi"
|
||||
|
||||
#: ports/atmel-samd/common-hal/microcontroller/Pin.c
|
||||
msgid "%q pin invalid"
|
||||
@ -291,7 +292,7 @@ msgstr "Suǒyǒu I2C wàiwéi qì zhèngzài shǐyòng"
|
||||
|
||||
#: ports/atmel-samd/common-hal/canio/Listener.c
|
||||
msgid "All RX FIFOs in use"
|
||||
msgstr ""
|
||||
msgstr "Suǒyǒu shǐyòng zhōng de RX FIFO"
|
||||
|
||||
#: ports/esp32s2/common-hal/busio/SPI.c ports/nrf/common-hal/busio/SPI.c
|
||||
msgid "All SPI peripherals are in use"
|
||||
@ -330,11 +331,11 @@ msgstr "Suǒyǒu jìshí qì shǐyòng"
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||
msgid "Already advertising."
|
||||
msgstr "Mùqián zhèngzài guǎngbò"
|
||||
msgstr "Mùqián zhèngzài guǎngbò."
|
||||
|
||||
#: ports/atmel-samd/common-hal/canio/Listener.c
|
||||
msgid "Already have all-matches listener"
|
||||
msgstr ""
|
||||
msgstr "yǐ jù yǒu quán pǐ pèi zhēn tīng qì"
|
||||
|
||||
#: shared-module/memorymonitor/AllocationAlarm.c
|
||||
#: shared-module/memorymonitor/AllocationSize.c
|
||||
@ -343,7 +344,7 @@ msgstr "yǐ zài yùn xíng"
|
||||
|
||||
#: ports/esp32s2/common-hal/wifi/Radio.c
|
||||
msgid "Already scanning for wifi networks"
|
||||
msgstr ""
|
||||
msgstr "yǐ jīng sǎo miáo WIFI wǎng luò"
|
||||
|
||||
#: ports/cxd56/common-hal/analogio/AnalogIn.c
|
||||
msgid "AnalogIn not supported on given pin"
|
||||
@ -391,7 +392,7 @@ msgstr "MicroPython VM zài wèi yùnxíng shí chángshì fēnpèi duī."
|
||||
|
||||
#: shared-bindings/wifi/Radio.c
|
||||
msgid "Authentication failure"
|
||||
msgstr ""
|
||||
msgstr "shēn fèn yàn zhèng shī bài"
|
||||
|
||||
#: main.c
|
||||
msgid "Auto-reload is off.\n"
|
||||
@ -454,7 +455,7 @@ msgstr "Huǎnchōng qū dàxiǎo bù zhèngquè. Yīnggāi shì %d zì jié."
|
||||
#: shared-bindings/displayio/Display.c
|
||||
#: shared-bindings/framebufferio/FramebufferDisplay.c
|
||||
msgid "Buffer is not a bytearray."
|
||||
msgstr "Huǎnchōng qū bùshì bytearray"
|
||||
msgstr "Huǎnchōng qū bùshì bytearray."
|
||||
|
||||
#: ports/cxd56/common-hal/camera/Camera.c shared-bindings/displayio/Display.c
|
||||
#: shared-bindings/framebufferio/FramebufferDisplay.c
|
||||
@ -508,7 +509,7 @@ msgstr "CBC kuài bì xū shì 16 zì jié de bèi shù"
|
||||
|
||||
#: py/objtype.c
|
||||
msgid "Call super().__init__() before accessing native object."
|
||||
msgstr "Zài fǎngwèn běn jī wùjiàn zhīqián diàoyòng super().__init__()"
|
||||
msgstr "Zài fǎngwèn běn jī wùjiàn zhīqián diàoyòng super().__init__()."
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/Characteristic.c
|
||||
msgid "Can't set CCCD on local Characteristic"
|
||||
@ -516,7 +517,7 @@ msgstr "Wúfǎ jiāng CCCD shèzhì wéi běndì tèzhēng"
|
||||
|
||||
#: shared-bindings/_bleio/Adapter.c
|
||||
msgid "Cannot create a new Adapter; use _bleio.adapter;"
|
||||
msgstr ""
|
||||
msgstr "Wúfǎ chuàngjiàn xīn de shìpèiqì; shǐyòng_bleio.Adapter;"
|
||||
|
||||
#: shared-bindings/displayio/Bitmap.c
|
||||
#: shared-bindings/memorymonitor/AllocationSize.c
|
||||
@ -607,7 +608,7 @@ msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "CircuitPython was unable to allocate the heap.\n"
|
||||
msgstr ""
|
||||
msgstr "CircuitPython wúfǎ fēnpèi duī.\n"
|
||||
|
||||
#: shared-module/bitbangio/SPI.c
|
||||
msgid "Clock pin init failed."
|
||||
@ -646,7 +647,7 @@ msgstr "Sǔnhuài de yuánshǐ dàimǎ"
|
||||
|
||||
#: ports/cxd56/common-hal/camera/Camera.c
|
||||
msgid "Could not initialize Camera"
|
||||
msgstr ""
|
||||
msgstr "Wúfǎ chūshǐhuà xiàngjī"
|
||||
|
||||
#: ports/cxd56/common-hal/gnss/GNSS.c
|
||||
msgid "Could not initialize GNSS"
|
||||
@ -683,7 +684,7 @@ msgstr "Wúfǎ chóngqǐ PWM"
|
||||
|
||||
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
|
||||
msgid "Could not retrieve clock"
|
||||
msgstr ""
|
||||
msgstr "Wúfǎ huòqǔ shízhōng"
|
||||
|
||||
#: shared-bindings/_bleio/Adapter.c
|
||||
msgid "Could not set address"
|
||||
@ -777,7 +778,7 @@ msgstr "ECB yí cì zhǐ shǐ yòng 16 gè zì jié"
|
||||
|
||||
#: ports/esp32s2/common-hal/busio/SPI.c
|
||||
msgid "ESP-IDF memory allocation failed"
|
||||
msgstr ""
|
||||
msgstr "ESP-IDF nèicún fēnpèi shībài"
|
||||
|
||||
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
|
||||
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
|
||||
@ -804,7 +805,7 @@ msgstr "Yùqí de tèdiǎn"
|
||||
|
||||
#: shared-bindings/_bleio/Adapter.c
|
||||
msgid "Expected a DigitalInOut"
|
||||
msgstr ""
|
||||
msgstr "yù qī shù zì huà"
|
||||
|
||||
#: shared-bindings/_bleio/Characteristic.c
|
||||
msgid "Expected a Service"
|
||||
@ -812,7 +813,7 @@ msgstr "Yùqí fúwù"
|
||||
|
||||
#: shared-bindings/_bleio/Adapter.c
|
||||
msgid "Expected a UART"
|
||||
msgstr ""
|
||||
msgstr "qī dài UART"
|
||||
|
||||
#: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c
|
||||
#: shared-bindings/_bleio/Service.c
|
||||
@ -838,7 +839,7 @@ msgstr "FFT jǐn wéi ndarrays dìng yì"
|
||||
|
||||
#: ports/esp32s2/common-hal/socketpool/Socket.c
|
||||
msgid "Failed SSL handshake"
|
||||
msgstr ""
|
||||
msgstr "SSL wòshǒu shībài"
|
||||
|
||||
#: shared-bindings/ps2io/Ps2.c
|
||||
msgid "Failed sending command."
|
||||
@ -865,11 +866,11 @@ msgstr "Fēnpèi RX huǎnchōng qū%d zì jié shībài"
|
||||
|
||||
#: ports/esp32s2/common-hal/wifi/__init__.c
|
||||
msgid "Failed to allocate Wifi memory"
|
||||
msgstr ""
|
||||
msgstr "Wúfǎ fēnpèi Wifi nèicún"
|
||||
|
||||
#: ports/esp32s2/common-hal/wifi/ScannedNetworks.c
|
||||
msgid "Failed to allocate wifi scan memory"
|
||||
msgstr ""
|
||||
msgstr "Wúfǎ fēnpèi wifi sǎomiáo nèicún"
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||
msgid "Failed to connect: internal error"
|
||||
@ -881,7 +882,7 @@ msgstr "Liánjiē shībài: Chāoshí"
|
||||
|
||||
#: ports/esp32s2/common-hal/wifi/__init__.c
|
||||
msgid "Failed to init wifi"
|
||||
msgstr ""
|
||||
msgstr "Wúfǎ chūshǐhuà wifi"
|
||||
|
||||
#: shared-module/audiomp3/MP3Decoder.c
|
||||
msgid "Failed to parse MP3 file"
|
||||
@ -902,11 +903,11 @@ msgstr "Wénjiàn cúnzài"
|
||||
|
||||
#: ports/atmel-samd/common-hal/canio/Listener.c
|
||||
msgid "Filters too complex"
|
||||
msgstr ""
|
||||
msgstr "guò lǜ qì tài fù zá"
|
||||
|
||||
#: ports/cxd56/common-hal/camera/Camera.c
|
||||
msgid "Format not supported"
|
||||
msgstr ""
|
||||
msgstr "Bù zhīyuán géshì"
|
||||
|
||||
#: shared-module/framebufferio/FramebufferDisplay.c
|
||||
#, c-format
|
||||
@ -976,7 +977,7 @@ msgstr "Huǎnchōng qū dàxiǎo bù zhèngquè"
|
||||
|
||||
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
|
||||
msgid "Input taking too long"
|
||||
msgstr ""
|
||||
msgstr "Shūrù shíjiānguò zhǎng"
|
||||
|
||||
#: ports/esp32s2/common-hal/neopixel_write/__init__.c py/moduerrno.c
|
||||
msgid "Input/output error"
|
||||
@ -1023,7 +1024,7 @@ msgstr "Wúxiào de BMP wénjiàn"
|
||||
|
||||
#: shared-bindings/wifi/Radio.c
|
||||
msgid "Invalid BSSID"
|
||||
msgstr ""
|
||||
msgstr "Wúxiào de BSSID"
|
||||
|
||||
#: ports/stm/common-hal/analogio/AnalogOut.c
|
||||
msgid "Invalid DAC pin supplied"
|
||||
@ -1073,7 +1074,7 @@ msgstr "Géshì kuài dàxiǎo wúxiào"
|
||||
|
||||
#: ports/esp32s2/common-hal/pwmio/PWMOut.c
|
||||
msgid "Invalid frequency"
|
||||
msgstr ""
|
||||
msgstr "Wúxiào de pínlǜ"
|
||||
|
||||
#: ports/stm/common-hal/pwmio/PWMOut.c
|
||||
msgid "Invalid frequency supplied"
|
||||
@ -1196,7 +1197,7 @@ msgstr "Jìngxiàng shí de zuìdà X zhí wèi%d"
|
||||
|
||||
#: shared-bindings/canio/Message.c
|
||||
msgid "Messages limited to 8 bytes"
|
||||
msgstr ""
|
||||
msgstr "Yóujiàn xiànzhì wèi 8 gè zì jié"
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "MicroPython NLR jump failed. Likely memory corruption."
|
||||
@ -1308,11 +1309,11 @@ msgstr "Méiyǒu zhǎng zhěngshù zhīchí"
|
||||
|
||||
#: ports/esp32s2/common-hal/pwmio/PWMOut.c
|
||||
msgid "No more channels available"
|
||||
msgstr ""
|
||||
msgstr "Méiyǒu gèng duō kěyòng píndào"
|
||||
|
||||
#: ports/esp32s2/common-hal/pwmio/PWMOut.c
|
||||
msgid "No more timers available"
|
||||
msgstr ""
|
||||
msgstr "Méiyǒu gèng duō kěyòng de jìshí qì"
|
||||
|
||||
#: ports/stm/common-hal/pwmio/PWMOut.c
|
||||
msgid "No more timers available on this pin."
|
||||
@ -1320,7 +1321,7 @@ msgstr "Gāi yǐn jiǎo shàng méiyǒu kěyòng de dìngshí qì."
|
||||
|
||||
#: shared-bindings/wifi/Radio.c
|
||||
msgid "No network with that ssid"
|
||||
msgstr ""
|
||||
msgstr "Méiyǒu wǎngluò yǔ gāi ssid"
|
||||
|
||||
#: shared-module/touchio/TouchIn.c
|
||||
msgid "No pulldown on pin; 1Mohm recommended"
|
||||
@ -1344,7 +1345,7 @@ msgstr "Nordic ruǎn shèbèi gùzhàng shēngmíng."
|
||||
|
||||
#: shared-bindings/ipaddress/IPv4Address.c shared-bindings/ipaddress/__init__.c
|
||||
msgid "Not a valid IP string"
|
||||
msgstr ""
|
||||
msgstr "Wúxiào de IP zìfú chuàn"
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||
#: shared-bindings/_bleio/CharacteristicBuffer.c
|
||||
@ -1362,7 +1363,7 @@ msgstr "Méiyǒu yùnxíng yǐ bǎocún de dàimǎ.\n"
|
||||
|
||||
#: shared-bindings/_bleio/__init__.c
|
||||
msgid "Not settable"
|
||||
msgstr ""
|
||||
msgstr "bù kě shè zhì"
|
||||
|
||||
#: shared-bindings/util.c
|
||||
msgid ""
|
||||
@ -1380,11 +1381,11 @@ msgstr "Zhǐyǒu 8 huò 16 wèi dānwèi "
|
||||
|
||||
#: ports/esp32s2/common-hal/socketpool/SocketPool.c
|
||||
msgid "Only IPv4 SOCK_STREAM sockets supported"
|
||||
msgstr ""
|
||||
msgstr "Jǐn zhīchí IPv4 SOCK_STREAM tào jiē zì"
|
||||
|
||||
#: ports/esp32s2/common-hal/wifi/__init__.c
|
||||
msgid "Only IPv4 addresses supported"
|
||||
msgstr ""
|
||||
msgstr "Jǐn zhīchí IPv4 dìzhǐ"
|
||||
|
||||
#: shared-module/displayio/OnDiskBitmap.c
|
||||
#, c-format
|
||||
@ -1405,11 +1406,11 @@ msgstr ""
|
||||
|
||||
#: shared-bindings/ipaddress/__init__.c
|
||||
msgid "Only raw int supported for ip"
|
||||
msgstr ""
|
||||
msgstr "Ip jǐn zhīchí raw int"
|
||||
|
||||
#: ports/esp32s2/common-hal/socketpool/SocketPool.c
|
||||
msgid "Out of sockets"
|
||||
msgstr ""
|
||||
msgstr "tào jiē zì wài"
|
||||
|
||||
#: shared-bindings/audiobusio/PDMIn.c
|
||||
msgid "Oversample must be multiple of 8."
|
||||
@ -1479,7 +1480,7 @@ msgstr "Duōbiānxíng zhìshǎo xūyào 3 diǎn"
|
||||
msgid ""
|
||||
"Port does not accept PWM carrier. Pass a pin, frequency and duty cycle "
|
||||
"instead"
|
||||
msgstr ""
|
||||
msgstr "Duānkǒu bù jiēshòu PWM zàibō. Tōngguò yǐn jiǎo, pínlǜ hé zhàn kōng bǐ"
|
||||
|
||||
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
|
||||
#: ports/cxd56/common-hal/pulseio/PulseOut.c
|
||||
@ -1488,7 +1489,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Port does not accept pins or frequency. Construct and pass a PWMOut Carrier "
|
||||
"instead"
|
||||
msgstr ""
|
||||
msgstr "Duānkǒu bù jiēshòu yǐn jiǎo huò pínlǜ. Gòuzào bìng chuándì PWMOut zàibō"
|
||||
|
||||
#: shared-bindings/_bleio/Adapter.c
|
||||
msgid "Prefix buffer must be on the heap"
|
||||
@ -1552,7 +1553,7 @@ msgstr "Shuāxīn tài kuàile"
|
||||
|
||||
#: shared-bindings/canio/RemoteTransmissionRequest.c
|
||||
msgid "RemoteTransmissionRequests limited to 8 bytes"
|
||||
msgstr ""
|
||||
msgstr "RemoteTransmissionRequests xiànzhì wèi 8 gè zì jié"
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
msgid "Requested AES mode is unsupported"
|
||||
@ -1625,11 +1626,11 @@ msgstr "Xùliè huà yǐjīng shǐyòngguò"
|
||||
|
||||
#: shared-bindings/ssl/SSLContext.c
|
||||
msgid "Server side context cannot have hostname"
|
||||
msgstr ""
|
||||
msgstr "Fúwùqì duān shàngxiàwén bùnéng jùyǒu zhǔjī míng"
|
||||
|
||||
#: ports/cxd56/common-hal/camera/Camera.c
|
||||
msgid "Size not supported"
|
||||
msgstr ""
|
||||
msgstr "bù zhī chí dà xiǎo"
|
||||
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
msgid "Slice and value different lengths."
|
||||
@ -1644,7 +1645,7 @@ msgstr "Qiēpiàn bù shòu zhīchí"
|
||||
|
||||
#: ports/esp32s2/common-hal/socketpool/SocketPool.c
|
||||
msgid "SocketPool can only be used with wifi.radio"
|
||||
msgstr ""
|
||||
msgstr "SocketPool zhǐ néng yǔ wifi.Radio yīqǐ shǐyòng"
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
msgid "Source and destination buffers must be the same length"
|
||||
@ -1692,7 +1693,7 @@ msgstr ""
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
msgid "The length of rgb_pins must be 6, 12, 18, 24, or 30"
|
||||
msgstr ""
|
||||
msgstr "Rgb_pins de chángdù bìxū wèi 6,12,18,24 huò 30"
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
@ -1823,7 +1824,7 @@ msgstr "Wúfǎ fēnpèi huǎnchōng qū yòng yú qiānmíng zhuǎnhuàn"
|
||||
|
||||
#: ports/esp32s2/common-hal/busio/I2C.c
|
||||
msgid "Unable to create lock"
|
||||
msgstr ""
|
||||
msgstr "Wúfǎ chuàngjiàn suǒ"
|
||||
|
||||
#: shared-module/displayio/I2CDisplay.c
|
||||
#, c-format
|
||||
@ -1854,11 +1855,11 @@ msgstr "Yìwài de nrfx uuid lèixíng"
|
||||
#: ports/esp32s2/common-hal/socketpool/Socket.c
|
||||
#, c-format
|
||||
msgid "Unhandled ESP TLS error %d %d %x %d"
|
||||
msgstr ""
|
||||
msgstr "Wèi chǔlǐ de ESP TLS cuòwù %d %d %x %d"
|
||||
|
||||
#: shared-bindings/wifi/Radio.c
|
||||
msgid "Unknown failure"
|
||||
msgstr ""
|
||||
msgstr "Wèizhī gùzhàng"
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||
#, c-format
|
||||
@ -1946,7 +1947,7 @@ msgstr "WatchDogTimer dāngqián wèi yùnxíng"
|
||||
#: shared-bindings/watchdog/WatchDogTimer.c
|
||||
msgid "WatchDogTimer.mode cannot be changed once set to WatchDogMode.RESET"
|
||||
msgstr ""
|
||||
"Yīdàn shèzhì wèi WatchDogMode.RESET, zé bùnéng gēnggǎi WatchDogTimer.Mode."
|
||||
"Yīdàn shèzhì wèi WatchDogMode.RESET, zé bùnéng gēnggǎi WatchDogTimer.Mode"
|
||||
|
||||
#: shared-bindings/watchdog/WatchDogTimer.c
|
||||
msgid "WatchDogTimer.timeout must be greater than 0"
|
||||
@ -1967,13 +1968,14 @@ msgid ""
|
||||
msgstr ""
|
||||
"Huānyíng lái dào Adafruit CircuitPython%s!\n"
|
||||
"\n"
|
||||
"Qǐng fǎngwèn xuéxí. learn.Adafruit.com/category/circuitpython.\n"
|
||||
"Qǐng fǎngwèn learn.Adafruit.Com/category/circuitpython yǐ huòqǔ xiàngmù "
|
||||
"zhǐnán.\n"
|
||||
"\n"
|
||||
"Ruò yào liè chū nèizài de mókuài, qǐng qǐng zuò yǐxià `help(\"modules\")`.\n"
|
||||
"Yào liè chū nèizhì mókuài, qǐng zhíxíng `help(“modules”)`\n"
|
||||
|
||||
#: shared-bindings/wifi/Radio.c
|
||||
msgid "WiFi password must be between 8 and 63 characters"
|
||||
msgstr ""
|
||||
msgstr "WiFi mìmǎ bìxū jiè yú 8 dào 63 gè zìfú zhī jiān"
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/PacketBuffer.c
|
||||
msgid "Writes not supported on Characteristic"
|
||||
@ -2145,7 +2147,7 @@ msgstr "zì jié > 8 wèi"
|
||||
|
||||
#: py/objarray.c
|
||||
msgid "bytes length not a multiple of item size"
|
||||
msgstr ""
|
||||
msgstr "zì jié chángdù, bùshì xiàngmù dàxiǎo de bèishù"
|
||||
|
||||
#: py/objstr.c
|
||||
msgid "bytes value out of range"
|
||||
@ -2405,7 +2407,8 @@ msgstr "mòrèn 'except' bìxū shì zuìhòu yīgè"
|
||||
msgid ""
|
||||
"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8"
|
||||
msgstr ""
|
||||
"mùbiāo huǎnchōng qū bìxū shì zì yǎnlèi huò lèixíng 'B' wèi wèi shēndù = 8"
|
||||
"Duìyú bit_depth = 8, mùbiāo huǎnchōng qū bìxū shì zì jié shùzǔ huò lèixíng "
|
||||
"wèi 'B' de shùzǔ"
|
||||
|
||||
#: shared-bindings/audiobusio/PDMIn.c
|
||||
msgid "destination buffer must be an array of type 'H' for bit_depth = 16"
|
||||
@ -2463,11 +2466,11 @@ msgstr "lìwài bìxū láizì BaseException"
|
||||
|
||||
#: shared-bindings/canio/CAN.c
|
||||
msgid "expected '%q' but got '%q'"
|
||||
msgstr ""
|
||||
msgstr "yùqí wèi'%q'dàn dédàole'%q'"
|
||||
|
||||
#: shared-bindings/canio/CAN.c
|
||||
msgid "expected '%q' or '%q' but got '%q'"
|
||||
msgstr ""
|
||||
msgstr "yùqí wèi'%q'huò'%q', dàn huòdéle'%q'"
|
||||
|
||||
#: py/objstr.c
|
||||
msgid "expected ':' after format specifier"
|
||||
@ -2680,7 +2683,7 @@ msgstr "chūshǐ zhí bìxū shì kě diédài de"
|
||||
|
||||
#: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c
|
||||
msgid "initial_value length is wrong"
|
||||
msgstr ""
|
||||
msgstr "Initial_value chángdù cuòwù"
|
||||
|
||||
#: py/compile.c
|
||||
msgid "inline assembler must be a function"
|
||||
@ -2877,7 +2880,7 @@ msgstr "Dāng gùdìng chángdù wèi %s shí, zuìdà chángdù bìxū wèi 0-%
|
||||
|
||||
#: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c
|
||||
msgid "max_length must be > 0"
|
||||
msgstr ""
|
||||
msgstr "Max_length bìxū > 0"
|
||||
|
||||
#: py/runtime.c
|
||||
msgid "maximum recursion depth exceeded"
|
||||
@ -2937,9 +2940,8 @@ msgid "name reused for argument"
|
||||
msgstr "cān shǔ míngchēng bèi chóngxīn shǐyòng"
|
||||
|
||||
#: py/emitnative.c
|
||||
#, fuzzy
|
||||
msgid "native yield"
|
||||
msgstr "yuánshēng chǎnliàng"
|
||||
msgstr "yuán chǎn"
|
||||
|
||||
#: py/runtime.c
|
||||
#, c-format
|
||||
@ -3116,11 +3118,11 @@ msgstr "ord() yùqí zìfú, dàn chángdù zìfú chuàn %d"
|
||||
|
||||
#: shared-bindings/displayio/Bitmap.c
|
||||
msgid "out of range of source"
|
||||
msgstr ""
|
||||
msgstr "yuán fàn wéi wài"
|
||||
|
||||
#: shared-bindings/displayio/Bitmap.c
|
||||
msgid "out of range of target"
|
||||
msgstr ""
|
||||
msgstr "mù biāo fàn wéi wài"
|
||||
|
||||
#: py/objint_mpz.c
|
||||
msgid "overflow converting long int to machine word"
|
||||
@ -3129,7 +3131,7 @@ msgstr "chāo gāo zhuǎnhuàn zhǎng zhěng shùzì shí"
|
||||
#: py/modstruct.c
|
||||
#, c-format
|
||||
msgid "pack expected %d items for packing (got %d)"
|
||||
msgstr ""
|
||||
msgstr "bāo zhuāng yù qī de %d bāo zhuāng xiàng mù (dé dào %d)"
|
||||
|
||||
#: shared-bindings/_stage/Layer.c shared-bindings/_stage/Text.c
|
||||
msgid "palette must be 32 bytes long"
|
||||
@ -3169,7 +3171,7 @@ msgstr "duōbiānxíng zhī néng zài yīgè fù jí zhōng zhùcè"
|
||||
|
||||
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
|
||||
msgid "pop from an empty PulseIn"
|
||||
msgstr "cóng kōng de PulseIn dànchū dànchū"
|
||||
msgstr "cóng kōng mài chōng tán chū"
|
||||
|
||||
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
|
||||
#: ports/cxd56/common-hal/pulseio/PulseIn.c
|
||||
@ -3195,7 +3197,7 @@ msgstr "pow() yǒu 3 cānshù xūyào zhěngshù"
|
||||
#: ports/esp32s2/boards/muselab_nanoesp32_s2/mpconfigboard.h
|
||||
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
|
||||
msgid "pressing boot button at start up.\n"
|
||||
msgstr ""
|
||||
msgstr "Zài qǐdòng shí àn qǐdòng ànniǔ.\n"
|
||||
|
||||
#: ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
|
||||
@ -3203,7 +3205,7 @@ msgstr ""
|
||||
#: ports/atmel-samd/boards/escornabot_makech/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/meowmeow/mpconfigboard.h
|
||||
msgid "pressing both buttons at start up.\n"
|
||||
msgstr ""
|
||||
msgstr "zài qǐdòng shí tóngshí àn xià liǎng gè ànniǔ.\n"
|
||||
|
||||
#: extmod/modutimeq.c
|
||||
msgid "queue overflow"
|
||||
@ -3330,7 +3332,7 @@ msgstr "sosfilt xūyào diédài cānshù"
|
||||
|
||||
#: shared-bindings/displayio/Bitmap.c
|
||||
msgid "source palette too large"
|
||||
msgstr ""
|
||||
msgstr "yuán miànbǎn tài dà"
|
||||
|
||||
#: py/objstr.c
|
||||
msgid "start/end indices"
|
||||
@ -3571,7 +3573,7 @@ msgstr "kān mén gǒu chāoshí bìxū dàyú 0"
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
msgid "width must be greater than zero"
|
||||
msgstr ""
|
||||
msgstr "kuāndù bìxū dàyú líng"
|
||||
|
||||
#: shared-bindings/_bleio/Adapter.c
|
||||
msgid "window must be <= interval"
|
||||
|
40
main.c
40
main.c
@ -242,19 +242,24 @@ void cleanup_after_vm(supervisor_allocation* heap) {
|
||||
reset_status_led();
|
||||
}
|
||||
|
||||
void print_code_py_status_message(safe_mode_t safe_mode) {
|
||||
if (autoreload_is_enabled()) {
|
||||
serial_write_compressed(translate("Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.\n"));
|
||||
} else {
|
||||
serial_write_compressed(translate("Auto-reload is off.\n"));
|
||||
}
|
||||
if (safe_mode != NO_SAFE_MODE) {
|
||||
serial_write_compressed(translate("Running in safe mode! "));
|
||||
serial_write_compressed(translate("Not running saved code.\n"));
|
||||
}
|
||||
}
|
||||
|
||||
bool run_code_py(safe_mode_t safe_mode) {
|
||||
bool serial_connected_at_start = serial_connected();
|
||||
#if CIRCUITPY_AUTORELOAD_DELAY_MS > 0
|
||||
if (serial_connected_at_start) {
|
||||
serial_write("\n");
|
||||
if (autoreload_is_enabled()) {
|
||||
serial_write_compressed(translate("Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.\n"));
|
||||
} else if (safe_mode != NO_SAFE_MODE) {
|
||||
serial_write_compressed(translate("Running in safe mode! "));
|
||||
serial_write_compressed(translate("Auto-reload is off.\n"));
|
||||
} else if (!autoreload_is_enabled()) {
|
||||
serial_write_compressed(translate("Auto-reload is off.\n"));
|
||||
}
|
||||
print_code_py_status_message(safe_mode);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -266,10 +271,7 @@ bool run_code_py(safe_mode_t safe_mode) {
|
||||
|
||||
bool found_main = false;
|
||||
|
||||
if (safe_mode != NO_SAFE_MODE) {
|
||||
serial_write_compressed(translate("Running in safe mode! "));
|
||||
serial_write_compressed(translate("Not running saved code.\n"));
|
||||
} else {
|
||||
if (safe_mode == NO_SAFE_MODE) {
|
||||
new_status_color(MAIN_RUNNING);
|
||||
|
||||
static const char * const supported_filenames[] = STRING_LIST("code.txt", "code.py", "main.py", "main.txt");
|
||||
@ -322,16 +324,8 @@ bool run_code_py(safe_mode_t safe_mode) {
|
||||
}
|
||||
|
||||
if (!serial_connected_before_animation && serial_connected()) {
|
||||
if (serial_connected_at_start) {
|
||||
serial_write("\n\n");
|
||||
}
|
||||
|
||||
if (!serial_connected_at_start) {
|
||||
if (autoreload_is_enabled()) {
|
||||
serial_write_compressed(translate("Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.\n"));
|
||||
} else {
|
||||
serial_write_compressed(translate("Auto-reload is off.\n"));
|
||||
}
|
||||
print_code_py_status_message(safe_mode);
|
||||
}
|
||||
print_safe_mode_message(safe_mode);
|
||||
serial_write("\n");
|
||||
@ -486,8 +480,10 @@ int __attribute__((used)) main(void) {
|
||||
reset_devices();
|
||||
reset_board();
|
||||
|
||||
// Turn on autoreload by default but before boot.py in case it wants to change it.
|
||||
// If not in safe mode turn on autoreload by default but before boot.py in case it wants to change it.
|
||||
if (safe_mode == NO_SAFE_MODE) {
|
||||
autoreload_enable();
|
||||
}
|
||||
|
||||
// By default our internal flash is readonly to local python code and
|
||||
// writable over USB. Set it here so that boot.py can change it.
|
||||
|
@ -26,7 +26,7 @@
|
||||
|
||||
//Micropython setup
|
||||
|
||||
#define MICROPY_HW_BOARD_NAME "FeatherS2"
|
||||
#define MICROPY_HW_BOARD_NAME "FeatherS2 PreRelease"
|
||||
#define MICROPY_HW_MCU_NAME "ESP32S2"
|
||||
|
||||
#define CIRCUITPY_BOOT_BUTTON (&pin_GPIO0)
|
||||
|
@ -75,7 +75,7 @@ INC += \
|
||||
|
||||
# NDEBUG disables assert() statements. This reduces code size pretty dramatically, per tannewt.
|
||||
|
||||
CFLAGS += -Os -DNDEBUG
|
||||
CFLAGS += -Os -DNDEBUG -ffreestanding
|
||||
|
||||
# TinyUSB defines
|
||||
CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_MIMXRT10XX -DCFG_TUD_MIDI_RX_BUFSIZE=512 -DCFG_TUD_CDC_RX_BUFSIZE=512 -DCFG_TUD_MIDI_TX_BUFSIZE=512 -DCFG_TUD_CDC_TX_BUFSIZE=512 -DCFG_TUD_MSC_BUFSIZE=1024
|
||||
|
@ -33,6 +33,7 @@
|
||||
|
||||
#include "py/mpconfig.h"
|
||||
#include "fsl_common.h"
|
||||
#include "fsl_flexspi_nor_config.h"
|
||||
|
||||
// Initializes board related state once on start up.
|
||||
void board_init(void);
|
||||
@ -45,4 +46,11 @@ bool board_requests_safe_mode(void);
|
||||
// Reset the state of off MCU components such as neopixels.
|
||||
void reset_board(void);
|
||||
|
||||
#define SEQUENCE(first, second, third, fourth) first, second, third, fourth
|
||||
#define TWO_EMPTY_STEPS 0x00000000
|
||||
#define EMPTY_SEQUENCE SEQUENCE(TWO_EMPTY_STEPS, TWO_EMPTY_STEPS, TWO_EMPTY_STEPS, TWO_EMPTY_STEPS)
|
||||
|
||||
// FlexSPI configuration that stores command info.
|
||||
extern const flexspi_nor_config_t qspiflash_config;
|
||||
|
||||
#endif // MICROPY_INCLUDED_MIMXRT10XX_BOARDS_BOARD_H
|
||||
|
@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
#include "fsl_flexspi_nor_boot.h"
|
||||
#include "fsl_flexspi_nor_config.h"
|
||||
#include "boards/board.h"
|
||||
|
||||
|
||||
__attribute__((section(".boot_hdr.ivt")))
|
||||
@ -35,88 +35,135 @@ const BOOT_DATA_T boot_data = {
|
||||
0xFFFFFFFF /* empty - extra data word */
|
||||
};
|
||||
|
||||
// Config for W25Q32JV with QSPI routed.
|
||||
__attribute__((section(".boot_hdr.conf")))
|
||||
// Values copied from https://github.com/PaulStoffregen/cores/blob/ddb23fa5d97dac763bc06e11b9b41f026bd51f0a/teensy4/bootdata.c#L39
|
||||
const flexspi_nor_config_t qspiflash_config = {
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 1u,
|
||||
.csSetupTime = 2u,
|
||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz, // 03
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) |
|
||||
// FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||
// Read LUTs
|
||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
0,
|
||||
0,
|
||||
|
||||
0x24040405,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000406,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180420,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x081804D8,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180402,
|
||||
0x00002004,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000460,
|
||||
},
|
||||
},
|
||||
.pageSize = 256u,
|
||||
.sectorSize = 4u * 1024u,
|
||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||
.blockSize = 0x00010000,
|
||||
.isUniformBlockSize = false,
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 3u,
|
||||
.csSetupTime = 3u,
|
||||
|
||||
.busyOffset = 0u, // Status bit 0 indicates busy.
|
||||
.busyBitPolarity = 0u, // Busy when the bit is 1.
|
||||
|
||||
.deviceModeCfgEnable = 1u,
|
||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||
.deviceModeSeq = {
|
||||
.seqId = 4u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceModeArg = 0x02, // Bit pattern for setting Quad Enable.
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// The high 16 bits is command 1 and the low are command 0.
|
||||
// Within a command, the top 6 bits are the opcode, the next two are the number
|
||||
// of pads and then last byte is the operand. The operand's meaning changes
|
||||
// per opcode.
|
||||
|
||||
// Indices with ROM should always have the same function because the ROM
|
||||
// bootloader uses it.
|
||||
|
||||
// 0: ROM: Read LUTs
|
||||
// Quad version
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
|
||||
READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
// Single fast read version, good for debugging.
|
||||
// FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
|
||||
// RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
// FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
|
||||
// READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 1: ROM: Read status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
|
||||
READ_SDR, FLEXSPI_1PAD, 0x02),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 2: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 3: ROM: Write Enable
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0x00),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 4: Config: Write Status -2
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x31 /* the command to send */,
|
||||
WRITE_SDR, FLEXSPI_1PAD, 0x01 /* number of bytes to write */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 5: ROM: Erase Sector
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 6: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 7: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 8: Block Erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 9: ROM: Page program
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
|
||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 10: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 11: ROM: Chip erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 12: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 13: ROM: Read SFDP
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 14: ROM: Restore no cmd
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 15: ROM: Dummy
|
||||
EMPTY_SEQUENCE
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
#include "fsl_flexspi_nor_boot.h"
|
||||
#include "fsl_flexspi_nor_config.h"
|
||||
#include "boards/board.h"
|
||||
|
||||
|
||||
__attribute__((section(".boot_hdr.ivt")))
|
||||
@ -35,88 +35,135 @@ const BOOT_DATA_T boot_data = {
|
||||
0xFFFFFFFF /* empty - extra data word */
|
||||
};
|
||||
|
||||
// Config for W25Q64JV with QSPI routed.
|
||||
__attribute__((section(".boot_hdr.conf")))
|
||||
// Values copied from https://github.com/PaulStoffregen/cores/blob/ddb23fa5d97dac763bc06e11b9b41f026bd51f0a/teensy4/bootdata.c#L39
|
||||
const flexspi_nor_config_t qspiflash_config = {
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 1u,
|
||||
.csSetupTime = 2u,
|
||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz, // 03
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) |
|
||||
// FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||
// Read LUTs
|
||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
0,
|
||||
0,
|
||||
|
||||
0x24040405,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000406,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180420,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x081804D8,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180402,
|
||||
0x00002004,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000460,
|
||||
},
|
||||
},
|
||||
.pageSize = 256u,
|
||||
.sectorSize = 4u * 1024u,
|
||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||
.blockSize = 0x00010000,
|
||||
.isUniformBlockSize = false,
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 3u,
|
||||
.csSetupTime = 3u,
|
||||
|
||||
.busyOffset = 0u, // Status bit 0 indicates busy.
|
||||
.busyBitPolarity = 0u, // Busy when the bit is 1.
|
||||
|
||||
.deviceModeCfgEnable = 1u,
|
||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||
.deviceModeSeq = {
|
||||
.seqId = 4u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceModeArg = 0x02,
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// The high 16 bits is command 1 and the low are command 0.
|
||||
// Within a command, the top 6 bits are the opcode, the next two are the number
|
||||
// of pads and then last byte is the operand. The operand's meaning changes
|
||||
// per opcode.
|
||||
|
||||
// Indices with ROM should always have the same function because the ROM
|
||||
// bootloader uses it.
|
||||
|
||||
// 0: ROM: Read LUTs
|
||||
// Quad version
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
|
||||
READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
// Single fast read version, good for debugging.
|
||||
// FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
|
||||
// RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
// FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
|
||||
// READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 1: ROM: Read status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
|
||||
READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 2: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 3: ROM: Write Enable
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0x00),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 4: Config: Write Status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x31 /* the command to send */,
|
||||
WRITE_SDR, FLEXSPI_1PAD, 0x01),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 5: ROM: Erase Sector
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 6: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 7: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 8: Block Erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 9: ROM: Page program
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
|
||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 10: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 11: ROM: Chip erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 12: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 13: ROM: Read SFDP
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 14: ROM: Restore no cmd
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 15: ROM: Dummy
|
||||
EMPTY_SEQUENCE
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
#include "fsl_flexspi_nor_boot.h"
|
||||
#include "fsl_flexspi_nor_config.h"
|
||||
#include "boards/board.h"
|
||||
|
||||
|
||||
__attribute__((section(".boot_hdr.ivt")))
|
||||
@ -35,88 +35,135 @@ const BOOT_DATA_T boot_data = {
|
||||
0xFFFFFFFF /* empty - extra data word */
|
||||
};
|
||||
|
||||
// Config for W25Q64JV with QSPI routed.
|
||||
__attribute__((section(".boot_hdr.conf")))
|
||||
// Values copied from https://github.com/PaulStoffregen/cores/blob/ddb23fa5d97dac763bc06e11b9b41f026bd51f0a/teensy4/bootdata.c#L39
|
||||
const flexspi_nor_config_t qspiflash_config = {
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 1u,
|
||||
.csSetupTime = 2u,
|
||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz, // 03
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) |
|
||||
// FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||
// Read LUTs
|
||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
0,
|
||||
0,
|
||||
|
||||
0x24040405,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000406,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180420,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x081804D8,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180402,
|
||||
0x00002004,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000460,
|
||||
},
|
||||
},
|
||||
.pageSize = 256u,
|
||||
.sectorSize = 4u * 1024u,
|
||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||
.blockSize = 0x00010000,
|
||||
.isUniformBlockSize = false,
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 3u,
|
||||
.csSetupTime = 3u,
|
||||
|
||||
.busyOffset = 0u, // Status bit 0 indicates busy.
|
||||
.busyBitPolarity = 0u, // Busy when the bit is 1.
|
||||
|
||||
.deviceModeCfgEnable = 1u,
|
||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||
.deviceModeSeq = {
|
||||
.seqId = 4u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceModeArg = 0x02,
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_133MHz,
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// The high 16 bits is command 1 and the low are command 0.
|
||||
// Within a command, the top 6 bits are the opcode, the next two are the number
|
||||
// of pads and then last byte is the operand. The operand's meaning changes
|
||||
// per opcode.
|
||||
|
||||
// Indices with ROM should always have the same function because the ROM
|
||||
// bootloader uses it.
|
||||
|
||||
// 0: ROM: Read LUTs
|
||||
// Quad version
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
|
||||
READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
// Single fast read version, good for debugging.
|
||||
// FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
|
||||
// RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
// FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
|
||||
// READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 1: ROM: Read status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
|
||||
READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 2: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 3: ROM: Write Enable
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0x00),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 4: Config: Write Status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x31 /* the command to send */,
|
||||
WRITE_SDR, FLEXSPI_1PAD, 0x01),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 5: ROM: Erase Sector
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 6: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 7: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 8: Block Erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 9: ROM: Page program
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
|
||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 10: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 11: ROM: Chip erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 12: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 13: ROM: Read SFDP
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 14: ROM: Restore no cmd
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 15: ROM: Dummy
|
||||
EMPTY_SEQUENCE
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -6,7 +6,8 @@
|
||||
*/
|
||||
|
||||
#include "fsl_flexspi_nor_boot.h"
|
||||
#include "fsl_flexspi_nor_config.h"
|
||||
#include "boards/board.h"
|
||||
|
||||
|
||||
__attribute__((section(".boot_hdr.ivt")))
|
||||
/*************************************
|
||||
@ -34,88 +35,135 @@ const BOOT_DATA_T boot_data = {
|
||||
0xFFFFFFFF /* empty - extra data word */
|
||||
};
|
||||
|
||||
// Config for AT25SF128A with QSPI routed.
|
||||
__attribute__((section(".boot_hdr.conf")))
|
||||
// Values copied from https://github.com/PaulStoffregen/cores/blob/ddb23fa5d97dac763bc06e11b9b41f026bd51f0a/teensy4/bootdata.c#L39
|
||||
const flexspi_nor_config_t qspiflash_config = {
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 1u,
|
||||
.csSetupTime = 2u,
|
||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz, // 03
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) |
|
||||
// FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||
// Read LUTs
|
||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
0,
|
||||
0,
|
||||
|
||||
0x24040405,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000406,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180420,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x081804D8,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180402,
|
||||
0x00002004,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000460,
|
||||
},
|
||||
},
|
||||
.pageSize = 256u,
|
||||
.sectorSize = 4u * 1024u,
|
||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||
.blockSize = 0x00010000,
|
||||
.isUniformBlockSize = false,
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 3u,
|
||||
.csSetupTime = 3u,
|
||||
|
||||
.busyOffset = 0u, // Status bit 0 indicates busy.
|
||||
.busyBitPolarity = 0u, // Busy when the bit is 1.
|
||||
|
||||
.deviceModeCfgEnable = 1u,
|
||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||
.deviceModeSeq = {
|
||||
.seqId = 4u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceModeArg = 0x02,
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz,
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// The high 16 bits is command 1 and the low are command 0.
|
||||
// Within a command, the top 6 bits are the opcode, the next two are the number
|
||||
// of pads and then last byte is the operand. The operand's meaning changes
|
||||
// per opcode.
|
||||
|
||||
// Indices with ROM should always have the same function because the ROM
|
||||
// bootloader uses it.
|
||||
|
||||
// 0: ROM: Read LUTs
|
||||
// Quad version
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
|
||||
READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
// Single fast read version, good for debugging.
|
||||
// FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
|
||||
// RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
// FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
|
||||
// READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 1: ROM: Read status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
|
||||
READ_SDR, FLEXSPI_1PAD, 0x02),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 2: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 3: ROM: Write Enable
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0x00),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 4: Config: Write Status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x31 /* the command to send */,
|
||||
WRITE_SDR, FLEXSPI_1PAD, 0x01),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 5: ROM: Erase Sector
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 6: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 7: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 8: Block Erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 9: ROM: Page program
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
|
||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 10: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 11: ROM: Chip erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 12: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 13: ROM: Read SFDP
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 14: ROM: Restore no cmd
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 15: ROM: Dummy
|
||||
EMPTY_SEQUENCE
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
#include "fsl_flexspi_nor_boot.h"
|
||||
#include "fsl_flexspi_nor_config.h"
|
||||
#include "boards/board.h"
|
||||
|
||||
|
||||
__attribute__((section(".boot_hdr.ivt")))
|
||||
@ -35,92 +35,135 @@ const BOOT_DATA_T boot_data = {
|
||||
0xFFFFFFFF /* empty - extra data word */
|
||||
};
|
||||
|
||||
// Config for IS25LP064A with QSPI routed.
|
||||
__attribute__((section(".boot_hdr.conf")))
|
||||
// Values copied from https://github.com/PaulStoffregen/cores/blob/ddb23fa5d97dac763bc06e11b9b41f026bd51f0a/teensy4/bootdata.c#L39
|
||||
const flexspi_nor_config_t qspiflash_config = {
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
#ifdef BOARD_USING_SECONDARY_QSPI_PINMUX
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromInternally,
|
||||
#else
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
#endif
|
||||
.csHoldTime = 1u,
|
||||
.csSetupTime = 2u,
|
||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz, // 03
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) |
|
||||
// FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||
// Read LUTs
|
||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
0,
|
||||
0,
|
||||
|
||||
0x24040405,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000406,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180420,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x081804D8,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180402,
|
||||
0x00002004,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000460,
|
||||
},
|
||||
},
|
||||
.pageSize = 256u,
|
||||
.sectorSize = 4u * 1024u,
|
||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||
.blockSize = 0x00010000,
|
||||
.isUniformBlockSize = false,
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 3u,
|
||||
.csSetupTime = 3u,
|
||||
|
||||
.busyOffset = 0u, // Status bit 0 indicates busy.
|
||||
.busyBitPolarity = 0u, // Busy when the bit is 1.
|
||||
|
||||
.deviceModeCfgEnable = 1u,
|
||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||
.deviceModeSeq = {
|
||||
.seqId = 4u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceModeArg = 0x40,
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// The high 16 bits is command 1 and the low are command 0.
|
||||
// Within a command, the top 6 bits are the opcode, the next two are the number
|
||||
// of pads and then last byte is the operand. The operand's meaning changes
|
||||
// per opcode.
|
||||
|
||||
// Indices with ROM should always have the same function because the ROM
|
||||
// bootloader uses it.
|
||||
|
||||
// 0: ROM: Read LUTs
|
||||
// Quad version
|
||||
// SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
|
||||
// RADDR_SDR, FLEXSPI_4PAD, 24 bits to transmit ),
|
||||
// FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
|
||||
// READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
// Single fast read version, good for debugging.
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
|
||||
READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 1: ROM: Read status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
|
||||
READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 2: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 3: ROM: Write Enable
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0x00),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 4: Config: Write Status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01 /* the command to send */,
|
||||
WRITE_SDR, FLEXSPI_1PAD, 0x01),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 5: ROM: Erase Sector
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 6: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 7: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 8: Block Erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 9: ROM: Page program
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
|
||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 10: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 11: ROM: Chip erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 12: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 13: ROM: Read SFDP
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 14: ROM: Restore no cmd
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 15: ROM: Dummy
|
||||
EMPTY_SEQUENCE
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -6,10 +6,10 @@
|
||||
*/
|
||||
|
||||
#include "fsl_flexspi_nor_boot.h"
|
||||
#include "fsl_flexspi_nor_config.h"
|
||||
#include "boards/board.h"
|
||||
|
||||
|
||||
__attribute__((section(".boot_hdr.ivt")))
|
||||
|
||||
/*************************************
|
||||
* IVT Data
|
||||
*************************************/
|
||||
@ -35,88 +35,135 @@ const BOOT_DATA_T boot_data = {
|
||||
0xFFFFFFFF /* empty - extra data word */
|
||||
};
|
||||
|
||||
// Config for IS25WP064A with QSPI routed.
|
||||
__attribute__((section(".boot_hdr.conf")))
|
||||
// Values copied from https://github.com/PaulStoffregen/cores/blob/ddb23fa5d97dac763bc06e11b9b41f026bd51f0a/teensy4/bootdata.c#L39
|
||||
const flexspi_nor_config_t qspiflash_config = {
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 1u,
|
||||
.csSetupTime = 2u,
|
||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz, // 03
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) |
|
||||
// FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||
// Read LUTs
|
||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
0,
|
||||
0,
|
||||
|
||||
0x24040405,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000406,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180420,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x081804D8,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180402,
|
||||
0x00002004,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000460,
|
||||
},
|
||||
},
|
||||
.pageSize = 256u,
|
||||
.sectorSize = 4u * 1024u,
|
||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||
.blockSize = 0x00010000,
|
||||
.isUniformBlockSize = false,
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 3u,
|
||||
.csSetupTime = 3u,
|
||||
|
||||
.busyOffset = 0u, // Status bit 0 indicates busy.
|
||||
.busyBitPolarity = 0u, // Busy when the bit is 1.
|
||||
|
||||
.deviceModeCfgEnable = 1u,
|
||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||
.deviceModeSeq = {
|
||||
.seqId = 4u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceModeArg = 0x40,
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz,
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// The high 16 bits is command 1 and the low are command 0.
|
||||
// Within a command, the top 6 bits are the opcode, the next two are the number
|
||||
// of pads and then last byte is the operand. The operand's meaning changes
|
||||
// per opcode.
|
||||
|
||||
// Indices with ROM should always have the same function because the ROM
|
||||
// bootloader uses it.
|
||||
|
||||
// 0: ROM: Read LUTs
|
||||
// Quad version
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
|
||||
READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
// Single fast read version, good for debugging.
|
||||
// FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
|
||||
// RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
// FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
|
||||
// READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 1: ROM: Read status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
|
||||
READ_SDR, FLEXSPI_1PAD, 0x02),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 2: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 3: ROM: Write Enable
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0x00),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 4: Config: Write Status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01 /* the command to send */,
|
||||
WRITE_SDR, FLEXSPI_1PAD, 0x01),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 5: ROM: Erase Sector
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 6: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 7: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 8: Block Erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 9: ROM: Page program
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
|
||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 10: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 11: ROM: Chip erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 12: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 13: ROM: Read SFDP
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 14: ROM: Restore no cmd
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 15: ROM: Dummy
|
||||
EMPTY_SEQUENCE
|
||||
},
|
||||
},
|
||||
};
|
||||
|
52
ports/mimxrt10xx/boards/metro_m7_1011/board.c
Normal file
52
ports/mimxrt10xx/boards/metro_m7_1011/board.c
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019 Scott Shawcroft for Adafruit Industries
|
||||
* Copyright (c) 2019 Artur Pacholec
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "boards/board.h"
|
||||
#include "mpconfigboard.h"
|
||||
#include "shared-bindings/microcontroller/Pin.h"
|
||||
|
||||
void board_init(void) {
|
||||
// SWD Pins
|
||||
common_hal_never_reset_pin(&pin_GPIO_AD_13);//SWDIO
|
||||
common_hal_never_reset_pin(&pin_GPIO_AD_12);//SWCLK
|
||||
|
||||
// FLEX flash
|
||||
common_hal_never_reset_pin(&pin_GPIO_SD_12);
|
||||
common_hal_never_reset_pin(&pin_GPIO_SD_11);
|
||||
common_hal_never_reset_pin(&pin_GPIO_SD_10);
|
||||
common_hal_never_reset_pin(&pin_GPIO_SD_09);
|
||||
common_hal_never_reset_pin(&pin_GPIO_SD_08);
|
||||
common_hal_never_reset_pin(&pin_GPIO_SD_07);
|
||||
common_hal_never_reset_pin(&pin_GPIO_SD_06);
|
||||
}
|
||||
|
||||
bool board_requests_safe_mode(void) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void reset_board(void) {
|
||||
}
|
179
ports/mimxrt10xx/boards/metro_m7_1011/flash_config.c
Normal file
179
ports/mimxrt10xx/boards/metro_m7_1011/flash_config.c
Normal file
@ -0,0 +1,179 @@
|
||||
/*
|
||||
* Copyright 2017 NXP
|
||||
* All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include "fsl_flexspi_nor_boot.h"
|
||||
#include "boards/board.h"
|
||||
|
||||
|
||||
__attribute__((section(".boot_hdr.ivt")))
|
||||
/*************************************
|
||||
* IVT Data
|
||||
*************************************/
|
||||
const ivt image_vector_table = {
|
||||
IVT_HEADER, /* IVT Header */
|
||||
IMAGE_ENTRY_ADDRESS, /* Image Entry Function */
|
||||
IVT_RSVD, /* Reserved = 0 */
|
||||
(uint32_t)DCD_ADDRESS, /* Address where DCD information is stored */
|
||||
(uint32_t)BOOT_DATA_ADDRESS, /* Address where BOOT Data Structure is stored */
|
||||
(uint32_t)&image_vector_table, /* Pointer to IVT Self (absolute address */
|
||||
(uint32_t)CSF_ADDRESS, /* Address where CSF file is stored */
|
||||
IVT_RSVD /* Reserved = 0 */
|
||||
};
|
||||
|
||||
__attribute__((section(".boot_hdr.boot_data")))
|
||||
/*************************************
|
||||
* Boot Data
|
||||
*************************************/
|
||||
const BOOT_DATA_T boot_data = {
|
||||
FLASH_BASE, /* boot start location */
|
||||
FLASH_SIZE, /* size */
|
||||
PLUGIN_FLAG, /* Plugin flag*/
|
||||
0xFFFFFFFF /* empty - extra data word */
|
||||
};
|
||||
|
||||
// Config for W25Q16JV with QSPI routed.
|
||||
__attribute__((section(".boot_hdr.conf")))
|
||||
const flexspi_nor_config_t qspiflash_config = {
|
||||
.pageSize = 256u,
|
||||
.sectorSize = 4u * 1024u,
|
||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||
.blockSize = 0x00010000,
|
||||
.isUniformBlockSize = false,
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 3u,
|
||||
.csSetupTime = 3u,
|
||||
|
||||
.busyOffset = 0u, // Status bit 0 indicates busy.
|
||||
.busyBitPolarity = 0u, // Busy when the bit is 1.
|
||||
|
||||
.deviceModeCfgEnable = 1u,
|
||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||
.deviceModeSeq = {
|
||||
.seqId = 4u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceModeArg = 0x0200,
|
||||
.configCmdEnable = 1u,
|
||||
.configModeType[0] = kDeviceConfigCmdType_Generic,
|
||||
.configCmdSeqs[0] = {
|
||||
.seqId = 2u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz,
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// The high 16 bits is command 1 and the low are command 0.
|
||||
// Within a command, the top 6 bits are the opcode, the next two are the number
|
||||
// of pads and then last byte is the operand. The operand's meaning changes
|
||||
// per opcode.
|
||||
|
||||
// Indices with ROM should always have the same function because the ROM
|
||||
// bootloader uses it.
|
||||
|
||||
// 0: ROM: Read LUTs
|
||||
// Quad version
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
|
||||
READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
// Single fast read version, good for debugging.
|
||||
// FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
|
||||
// RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
// FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
|
||||
// READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 1: ROM: Read status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
|
||||
READ_SDR, FLEXSPI_1PAD, 0x02),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 2: Empty
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35 /* the command to send */,
|
||||
DUMMY_SDR, FLEXSPI_1PAD, 8),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 3: ROM: Write Enable
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0x00),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 4: Config: Write Status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01 /* the command to send */,
|
||||
WRITE_SDR, FLEXSPI_1PAD, 0x02),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 5: ROM: Erase Sector
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 6: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 7: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 8: Block Erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 9: ROM: Page program
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
|
||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 10: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 11: ROM: Chip erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 12: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 13: ROM: Read SFDP
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 14: ROM: Restore no cmd
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 15: ROM: Dummy
|
||||
EMPTY_SEQUENCE
|
||||
},
|
||||
},
|
||||
};
|
20
ports/mimxrt10xx/boards/metro_m7_1011/mpconfigboard.h
Normal file
20
ports/mimxrt10xx/boards/metro_m7_1011/mpconfigboard.h
Normal file
@ -0,0 +1,20 @@
|
||||
#define MICROPY_HW_BOARD_NAME "Metro MIMXRT1011"
|
||||
#define MICROPY_HW_MCU_NAME "IMXRT1011DAE5A"
|
||||
|
||||
#define MICROPY_HW_NEOPIXEL (&pin_GPIO_00)
|
||||
|
||||
// If you change this, then make sure to update the linker scripts as well to
|
||||
// make sure you don't overwrite code
|
||||
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
|
||||
|
||||
#define BOARD_FLASH_SIZE (2 * 1024 * 1024)
|
||||
|
||||
#define DEFAULT_I2C_BUS_SCL (&pin_GPIO_02)
|
||||
#define DEFAULT_I2C_BUS_SDA (&pin_GPIO_01)
|
||||
|
||||
#define DEFAULT_SPI_BUS_SCK (&pin_GPIO_AD_06)
|
||||
#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO_AD_04)
|
||||
#define DEFAULT_SPI_BUS_MISO (&pin_GPIO_AD_03)
|
||||
|
||||
#define DEFAULT_UART_BUS_RX (&pin_GPIO_09)
|
||||
#define DEFAULT_UART_BUS_TX (&pin_GPIO_10)
|
12
ports/mimxrt10xx/boards/metro_m7_1011/mpconfigboard.mk
Normal file
12
ports/mimxrt10xx/boards/metro_m7_1011/mpconfigboard.mk
Normal file
@ -0,0 +1,12 @@
|
||||
USB_VID = 0x239A
|
||||
USB_PID = 0x80E2
|
||||
USB_PRODUCT = "Metro M7 1011"
|
||||
USB_MANUFACTURER = "Adafruit"
|
||||
|
||||
CHIP_VARIANT = MIMXRT1011DAE5A
|
||||
CHIP_FAMILY = MIMXRT1011
|
||||
FLASH = W25Q16JV
|
||||
|
||||
# Include these Python libraries in the firmware
|
||||
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ESP32SPI
|
||||
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Requests
|
59
ports/mimxrt10xx/boards/metro_m7_1011/pins.c
Normal file
59
ports/mimxrt10xx/boards/metro_m7_1011/pins.c
Normal file
@ -0,0 +1,59 @@
|
||||
#include "shared-bindings/board/__init__.h"
|
||||
|
||||
#include "boards/board.h"
|
||||
|
||||
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
|
||||
// Analog
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO_AD_02) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO_AD_01) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO_AD_00) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO_AD_05) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO_AD_10) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO_AD_08) },
|
||||
|
||||
// Digital
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO_09) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO_09) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO_10) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO_10) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO_13) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_GPIO_12) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO_SD_00) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO_SD_01) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO_SD_02) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO_11) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO_08) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO_07) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO_06) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO_05) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO_04) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_D13),MP_ROM_PTR(&pin_GPIO_03) },
|
||||
|
||||
// ESP control
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_CS), MP_ROM_PTR(&pin_GPIO_AD_14) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_GPIO0), MP_ROM_PTR(&pin_GPIO_SD_05) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_BUSY), MP_ROM_PTR(&pin_GPIO_AD_11) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RESET), MP_ROM_PTR(&pin_GPIO_AD_07) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_TX), MP_ROM_PTR(&pin_GPIO_09) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RX), MP_ROM_PTR(&pin_GPIO_10) },
|
||||
|
||||
// SPI
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO_AD_06) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO_AD_03) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO_AD_04) },
|
||||
|
||||
// UART
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO_10) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO_09) },
|
||||
|
||||
// I2C
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO_01) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO_02) },
|
||||
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO_00) },
|
||||
|
||||
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
|
||||
};
|
||||
MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);
|
@ -6,12 +6,8 @@
|
||||
*/
|
||||
|
||||
#include "fsl_flexspi_nor_boot.h"
|
||||
#include "fsl_flexspi_nor_config.h"
|
||||
#include "boards/board.h"
|
||||
|
||||
/* Component ID definition, used by tools. */
|
||||
#ifndef FSL_COMPONENT_ID
|
||||
#define FSL_COMPONENT_ID "platform.drivers.xip_device"
|
||||
#endif
|
||||
|
||||
__attribute__((section(".boot_hdr.ivt")))
|
||||
/*************************************
|
||||
@ -39,88 +35,145 @@ const BOOT_DATA_T boot_data = {
|
||||
0xFFFFFFFF /* empty - extra data word */
|
||||
};
|
||||
|
||||
// Config for W25Q16JV with QSPI routed.
|
||||
__attribute__((section(".boot_hdr.conf")))
|
||||
// Values copied from https://github.com/PaulStoffregen/cores/blob/ddb23fa5d97dac763bc06e11b9b41f026bd51f0a/teensy4/bootdata.c#L39
|
||||
const flexspi_nor_config_t qspiflash_config = {
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 1u,
|
||||
.csSetupTime = 2u,
|
||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz, // 03
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) |
|
||||
// FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||
// Read LUTs
|
||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
0,
|
||||
0,
|
||||
|
||||
0x24040405,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000406,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180420,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x081804D8,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180402,
|
||||
0x00002004,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000460,
|
||||
},
|
||||
},
|
||||
.pageSize = 256u,
|
||||
.sectorSize = 4u * 1024u,
|
||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||
.blockSize = 0x00010000,
|
||||
.isUniformBlockSize = false,
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 3u,
|
||||
.csSetupTime = 3u,
|
||||
|
||||
.busyOffset = 0u, // Status bit 0 indicates busy.
|
||||
.busyBitPolarity = 0u, // Busy when the bit is 1.
|
||||
|
||||
.deviceModeCfgEnable = 1u,
|
||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||
.deviceModeSeq = {
|
||||
.seqId = 4u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceModeArg = 0x0200,
|
||||
.configCmdEnable = 1u,
|
||||
.configModeType[0] = kDeviceConfigCmdType_Generic,
|
||||
.configCmdSeqs[0] = {
|
||||
.seqId = 2u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz,
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// The high 16 bits is command 1 and the low are command 0.
|
||||
// Within a command, the top 6 bits are the opcode, the next two are the number
|
||||
// of pads and then last byte is the operand. The operand's meaning changes
|
||||
// per opcode.
|
||||
|
||||
// Indices with ROM should always have the same function because the ROM
|
||||
// bootloader uses it.
|
||||
|
||||
// 0: ROM: Read LUTs
|
||||
// Quad version
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
|
||||
READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
// Single fast read version, good for debugging.
|
||||
// FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
|
||||
// RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
// FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
|
||||
// READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 1: ROM: Read status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
|
||||
READ_SDR, FLEXSPI_1PAD, 0x02),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 2: Empty
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35 /* the command to send */,
|
||||
DUMMY_SDR, FLEXSPI_1PAD, 8),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 3: ROM: Write Enable
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0x00),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 4: Config: Write Status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01 /* the command to send */,
|
||||
WRITE_SDR, FLEXSPI_1PAD, 0x02),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 5: ROM: Erase Sector
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 6: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 7: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 8: Block Erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 9: ROM: Page program
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
|
||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 10: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 11: ROM: Chip erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 12: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 13: ROM: Read SFDP
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 14: ROM: Restore no cmd
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 15: ROM: Dummy
|
||||
EMPTY_SEQUENCE
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -6,12 +6,8 @@
|
||||
*/
|
||||
|
||||
#include "fsl_flexspi_nor_boot.h"
|
||||
#include "fsl_flexspi_nor_config.h"
|
||||
#include "boards/board.h"
|
||||
|
||||
/* Component ID definition, used by tools. */
|
||||
#ifndef FSL_COMPONENT_ID
|
||||
#define FSL_COMPONENT_ID "platform.drivers.xip_device"
|
||||
#endif
|
||||
|
||||
__attribute__((section(".boot_hdr.ivt")))
|
||||
/*************************************
|
||||
@ -39,88 +35,135 @@ const BOOT_DATA_T boot_data = {
|
||||
0xFFFFFFFF /* empty - extra data word */
|
||||
};
|
||||
|
||||
// Config for W25Q64JV with QSPI routed.
|
||||
__attribute__((section(".boot_hdr.conf")))
|
||||
// Values copied from https://github.com/PaulStoffregen/cores/blob/ddb23fa5d97dac763bc06e11b9b41f026bd51f0a/teensy4/bootdata.c#L39
|
||||
const flexspi_nor_config_t qspiflash_config = {
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 1u,
|
||||
.csSetupTime = 2u,
|
||||
// Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz, // 03
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) |
|
||||
// FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
|
||||
// Read LUTs
|
||||
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
0,
|
||||
0,
|
||||
|
||||
0x24040405,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000406,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180420,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x081804D8,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x08180402,
|
||||
0x00002004,
|
||||
0,
|
||||
0,
|
||||
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
0x00000460,
|
||||
},
|
||||
},
|
||||
.pageSize = 256u,
|
||||
.sectorSize = 4u * 1024u,
|
||||
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
||||
.blockSize = 0x00010000,
|
||||
.isUniformBlockSize = false,
|
||||
.memConfig =
|
||||
{
|
||||
.tag = FLEXSPI_CFG_BLK_TAG,
|
||||
.version = FLEXSPI_CFG_BLK_VERSION,
|
||||
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
|
||||
.csHoldTime = 3u,
|
||||
.csSetupTime = 3u,
|
||||
|
||||
.busyOffset = 0u, // Status bit 0 indicates busy.
|
||||
.busyBitPolarity = 0u, // Busy when the bit is 1.
|
||||
|
||||
.deviceModeCfgEnable = 1u,
|
||||
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
||||
.deviceModeSeq = {
|
||||
.seqId = 4u,
|
||||
.seqNum = 1u,
|
||||
},
|
||||
.deviceModeArg = 0x02,
|
||||
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
||||
.sflashPadType = kSerialFlash_4Pads,
|
||||
.serialClkFreq = kFlexSpiSerialClk_60MHz,
|
||||
.sflashA1Size = FLASH_SIZE,
|
||||
.lookupTable =
|
||||
{
|
||||
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
|
||||
// The high 16 bits is command 1 and the low are command 0.
|
||||
// Within a command, the top 6 bits are the opcode, the next two are the number
|
||||
// of pads and then last byte is the operand. The operand's meaning changes
|
||||
// per opcode.
|
||||
|
||||
// Indices with ROM should always have the same function because the ROM
|
||||
// bootloader uses it.
|
||||
|
||||
// 0: ROM: Read LUTs
|
||||
// Quad version
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
|
||||
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
|
||||
READ_SDR, FLEXSPI_4PAD, 0x04),
|
||||
// Single fast read version, good for debugging.
|
||||
// FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
|
||||
// RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
// FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
|
||||
// READ_SDR, FLEXSPI_1PAD, 0x04),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 1: ROM: Read status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
|
||||
READ_SDR, FLEXSPI_1PAD, 0x01),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 2: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 3: ROM: Write Enable
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0x00),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 4: Config: Write Status
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x31 /* the command to send */,
|
||||
WRITE_SDR, FLEXSPI_1PAD, 0x01),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 5: ROM: Erase Sector
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 6: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 7: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 8: Block Erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 9: ROM: Page program
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
|
||||
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
|
||||
|
||||
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 10: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 11: ROM: Chip erase
|
||||
SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
|
||||
STOP, FLEXSPI_1PAD, 0),
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS,
|
||||
TWO_EMPTY_STEPS),
|
||||
|
||||
// 12: Empty
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 13: ROM: Read SFDP
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 14: ROM: Restore no cmd
|
||||
EMPTY_SEQUENCE,
|
||||
|
||||
// 15: ROM: Dummy
|
||||
EMPTY_SEQUENCE
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -62,7 +62,6 @@ SECTIONS
|
||||
|
||||
KEEP(*(.isr_vector)) /* Startup code */
|
||||
*(EXCLUDE_FILE(
|
||||
*flexspi_nor_flash_ops.o
|
||||
*fsl_flexspi.o
|
||||
) .text*) /* .text* sections (code) */
|
||||
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
|
||||
@ -84,7 +83,6 @@ SECTIONS
|
||||
{
|
||||
. = ALIGN(4);
|
||||
*(.data*) /* .data* sections */
|
||||
*flexspi_nor_flash_ops.o(.text*)
|
||||
*fsl_flexspi.o(.text*)
|
||||
. = ALIGN(4);
|
||||
} > OCRAM AT> FLASH_FIRMWARE
|
||||
@ -110,7 +108,6 @@ SECTIONS
|
||||
.itcm :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
|
||||
*(.itcm.*)
|
||||
|
||||
. = ALIGN(4);
|
||||
|
@ -9,23 +9,10 @@
|
||||
|
||||
#include "fsl_flexspi.h"
|
||||
#include "internal_flash.h"
|
||||
#include "boards/board.h"
|
||||
#include "supervisor/linker.h"
|
||||
|
||||
#define FLASH_QUAD_ENABLE 0x02
|
||||
#define FLASH_BUSY_STATUS_POL 1
|
||||
#define FLASH_BUSY_STATUS_OFFSET 0
|
||||
|
||||
static inline void flexspi_clock_init(void)
|
||||
{
|
||||
/* Switch to PLL2 for XIP to avoid hardfault during re-initialize clock. */
|
||||
CLOCK_InitSysPfd(kCLOCK_Pfd2, 24); /* Set PLL2 PFD2 clock 396MHZ. */
|
||||
CLOCK_SetMux(kCLOCK_FlexspiMux, 0x2); /* Choose PLL2 PFD2 clock as flexspi source clock. */
|
||||
CLOCK_SetDiv(kCLOCK_FlexspiDiv, 2); /* flexspi clock 133M. */
|
||||
}
|
||||
|
||||
extern flexspi_device_config_t deviceconfig;
|
||||
extern const uint32_t customLUT[CUSTOM_LUT_LENGTH];
|
||||
|
||||
status_t flexspi_nor_write_enable(FLEXSPI_Type *base, uint32_t baseAddr)
|
||||
status_t PLACE_IN_ITCM(flexspi_nor_write_enable)(FLEXSPI_Type *base, uint32_t baseAddr)
|
||||
{
|
||||
flexspi_transfer_t flashXfer;
|
||||
status_t status;
|
||||
@ -35,14 +22,14 @@ status_t flexspi_nor_write_enable(FLEXSPI_Type *base, uint32_t baseAddr)
|
||||
flashXfer.port = kFLEXSPI_PortA1;
|
||||
flashXfer.cmdType = kFLEXSPI_Command;
|
||||
flashXfer.SeqNumber = 1;
|
||||
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_WRITEENABLE;
|
||||
flashXfer.seqIndex = ROM_INDEX_WRITEENABLE;
|
||||
|
||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
status_t flexspi_nor_wait_bus_busy(FLEXSPI_Type *base)
|
||||
status_t PLACE_IN_ITCM(flexspi_nor_wait_bus_busy)(FLEXSPI_Type *base)
|
||||
{
|
||||
/* Wait status ready. */
|
||||
bool isBusy;
|
||||
@ -54,7 +41,7 @@ status_t flexspi_nor_wait_bus_busy(FLEXSPI_Type *base)
|
||||
flashXfer.port = kFLEXSPI_PortA1;
|
||||
flashXfer.cmdType = kFLEXSPI_Read;
|
||||
flashXfer.SeqNumber = 1;
|
||||
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_READSTATUSREG;
|
||||
flashXfer.seqIndex = ROM_INDEX_READSTATUSREG;
|
||||
flashXfer.data = &readValue;
|
||||
flashXfer.dataSize = 1;
|
||||
|
||||
@ -66,72 +53,15 @@ status_t flexspi_nor_wait_bus_busy(FLEXSPI_Type *base)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
if (FLASH_BUSY_STATUS_POL)
|
||||
{
|
||||
if (readValue & (1U << FLASH_BUSY_STATUS_OFFSET))
|
||||
{
|
||||
isBusy = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
isBusy = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (readValue & (1U << FLASH_BUSY_STATUS_OFFSET))
|
||||
{
|
||||
isBusy = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
isBusy = true;
|
||||
}
|
||||
}
|
||||
|
||||
size_t busyBit = readValue & (1U << qspiflash_config.memConfig.busyOffset);
|
||||
isBusy = (qspiflash_config.memConfig.busyBitPolarity == 0 && busyBit != 0) ||
|
||||
(qspiflash_config.memConfig.busyBitPolarity == 1 && busyBit == 0);
|
||||
} while (isBusy);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base)
|
||||
{
|
||||
flexspi_transfer_t flashXfer;
|
||||
status_t status;
|
||||
uint32_t writeValue = FLASH_QUAD_ENABLE;
|
||||
|
||||
/* Write enable */
|
||||
status = flexspi_nor_write_enable(base, 0);
|
||||
|
||||
if (status != kStatus_Success)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Enable quad mode. */
|
||||
flashXfer.deviceAddress = 0;
|
||||
flashXfer.port = kFLEXSPI_PortA1;
|
||||
flashXfer.cmdType = kFLEXSPI_Write;
|
||||
flashXfer.SeqNumber = 1;
|
||||
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG;
|
||||
flashXfer.data = &writeValue;
|
||||
flashXfer.dataSize = 1;
|
||||
|
||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||
if (status != kStatus_Success)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
status = flexspi_nor_wait_bus_busy(base);
|
||||
|
||||
/* Do software reset. */
|
||||
FLEXSPI_SoftwareReset(base);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address)
|
||||
status_t PLACE_IN_ITCM(flexspi_nor_flash_erase_sector)(FLEXSPI_Type *base, uint32_t address)
|
||||
{
|
||||
status_t status;
|
||||
flexspi_transfer_t flashXfer;
|
||||
@ -141,7 +71,7 @@ status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address)
|
||||
flashXfer.port = kFLEXSPI_PortA1;
|
||||
flashXfer.cmdType = kFLEXSPI_Command;
|
||||
flashXfer.SeqNumber = 1;
|
||||
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_WRITEENABLE;
|
||||
flashXfer.seqIndex = ROM_INDEX_WRITEENABLE;
|
||||
|
||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||
|
||||
@ -154,7 +84,7 @@ status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address)
|
||||
flashXfer.port = kFLEXSPI_PortA1;
|
||||
flashXfer.cmdType = kFLEXSPI_Command;
|
||||
flashXfer.SeqNumber = 1;
|
||||
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_ERASESECTOR;
|
||||
flashXfer.seqIndex = ROM_INDEX_ERASESECTOR;
|
||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||
|
||||
if (status != kStatus_Success)
|
||||
@ -170,7 +100,7 @@ status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address)
|
||||
return status;
|
||||
}
|
||||
|
||||
status_t flexspi_nor_flash_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src, uint32_t length)
|
||||
status_t PLACE_IN_ITCM(flexspi_nor_flash_page_program)(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src)
|
||||
{
|
||||
status_t status;
|
||||
flexspi_transfer_t flashXfer;
|
||||
@ -188,48 +118,7 @@ status_t flexspi_nor_flash_program(FLEXSPI_Type *base, uint32_t dstAddr, const u
|
||||
flashXfer.port = kFLEXSPI_PortA1;
|
||||
flashXfer.cmdType = kFLEXSPI_Write;
|
||||
flashXfer.SeqNumber = 1;
|
||||
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD;
|
||||
flashXfer.data = (uint32_t *)src;
|
||||
flashXfer.dataSize = length;
|
||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||
|
||||
if (status != kStatus_Success)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
status = flexspi_nor_wait_bus_busy(base);
|
||||
|
||||
/* Do software reset. */
|
||||
#if defined(FSL_FEATURE_SOC_OTFAD_COUNT)
|
||||
base->AHBCR |= FLEXSPI_AHBCR_CLRAHBRXBUF_MASK | FLEXSPI_AHBCR_CLRAHBTXBUF_MASK;
|
||||
base->AHBCR &= ~(FLEXSPI_AHBCR_CLRAHBRXBUF_MASK | FLEXSPI_AHBCR_CLRAHBTXBUF_MASK);
|
||||
#else
|
||||
FLEXSPI_SoftwareReset(base);
|
||||
#endif
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src)
|
||||
{
|
||||
status_t status;
|
||||
flexspi_transfer_t flashXfer;
|
||||
|
||||
/* Write enable */
|
||||
status = flexspi_nor_write_enable(base, dstAddr);
|
||||
|
||||
if (status != kStatus_Success)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Prepare page program command */
|
||||
flashXfer.deviceAddress = dstAddr;
|
||||
flashXfer.port = kFLEXSPI_PortA1;
|
||||
flashXfer.cmdType = kFLEXSPI_Write;
|
||||
flashXfer.SeqNumber = 1;
|
||||
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD;
|
||||
flashXfer.seqIndex = ROM_INDEX_PAGEPROGRAM;
|
||||
flashXfer.data = (uint32_t *)src;
|
||||
flashXfer.dataSize = FLASH_PAGE_SIZE;
|
||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||
@ -251,92 +140,3 @@ status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, co
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId)
|
||||
{
|
||||
uint32_t temp;
|
||||
flexspi_transfer_t flashXfer;
|
||||
flashXfer.deviceAddress = 0;
|
||||
flashXfer.port = kFLEXSPI_PortA1;
|
||||
flashXfer.cmdType = kFLEXSPI_Read;
|
||||
flashXfer.SeqNumber = 1;
|
||||
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_READID;
|
||||
flashXfer.data = &temp;
|
||||
flashXfer.dataSize = 1;
|
||||
|
||||
status_t status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||
|
||||
*vendorId = temp;
|
||||
|
||||
/* Do software reset. */
|
||||
#if defined(FSL_FEATURE_SOC_OTFAD_COUNT)
|
||||
base->AHBCR |= FLEXSPI_AHBCR_CLRAHBRXBUF_MASK | FLEXSPI_AHBCR_CLRAHBTXBUF_MASK;
|
||||
base->AHBCR &= ~(FLEXSPI_AHBCR_CLRAHBRXBUF_MASK | FLEXSPI_AHBCR_CLRAHBTXBUF_MASK);
|
||||
#else
|
||||
FLEXSPI_SoftwareReset(base);
|
||||
#endif
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
status_t flexspi_nor_erase_chip(FLEXSPI_Type *base)
|
||||
{
|
||||
status_t status;
|
||||
flexspi_transfer_t flashXfer;
|
||||
|
||||
/* Write enable */
|
||||
status = flexspi_nor_write_enable(base, 0);
|
||||
|
||||
if (status != kStatus_Success)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
flashXfer.deviceAddress = 0;
|
||||
flashXfer.port = kFLEXSPI_PortA1;
|
||||
flashXfer.cmdType = kFLEXSPI_Command;
|
||||
flashXfer.SeqNumber = 1;
|
||||
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_ERASECHIP;
|
||||
|
||||
status = FLEXSPI_TransferBlocking(base, &flashXfer);
|
||||
|
||||
if (status != kStatus_Success)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
status = flexspi_nor_wait_bus_busy(base);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void flexspi_nor_flash_init(FLEXSPI_Type *base)
|
||||
{
|
||||
flexspi_config_t config;
|
||||
|
||||
flexspi_clock_init();
|
||||
|
||||
/*Get FLEXSPI default settings and configure the flexspi. */
|
||||
FLEXSPI_GetDefaultConfig(&config);
|
||||
|
||||
/*Set AHB buffer size for reading data through AHB bus. */
|
||||
config.ahbConfig.enableAHBPrefetch = true;
|
||||
config.ahbConfig.enableAHBBufferable = true;
|
||||
config.ahbConfig.enableReadAddressOpt = true;
|
||||
config.ahbConfig.enableAHBCachable = true;
|
||||
#ifdef BOARD_USING_SECONDARY_QSPI_PINMUX
|
||||
config.rxSampleClock = kFLEXSPI_ReadSampleClkLoopbackInternally;
|
||||
#else
|
||||
config.rxSampleClock = kFLEXSPI_ReadSampleClkLoopbackFromDqsPad;
|
||||
#endif
|
||||
FLEXSPI_Init(base, &config);
|
||||
|
||||
/* Configure flash settings according to serial flash feature. */
|
||||
FLEXSPI_SetFlashConfig(base, &deviceconfig, kFLEXSPI_PortA1);
|
||||
|
||||
/* Update LUT table. */
|
||||
FLEXSPI_UpdateLUT(base, 0, customLUT, CUSTOM_LUT_LENGTH);
|
||||
|
||||
/* Do software reset. */
|
||||
FLEXSPI_SoftwareReset(base);
|
||||
}
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "boards/board.h"
|
||||
#include "extmod/vfs.h"
|
||||
#include "extmod/vfs_fat.h"
|
||||
#include "py/mphal.h"
|
||||
@ -50,125 +51,14 @@ extern uint32_t __fatfs_flash_length[];
|
||||
|
||||
uint8_t _flash_cache[SECTOR_SIZE] __attribute__((aligned(4)));
|
||||
uint32_t _flash_page_addr = NO_CACHE;
|
||||
static bool init_done = false;
|
||||
|
||||
flexspi_device_config_t deviceconfig = {
|
||||
.flexspiRootClk = 133000000,
|
||||
.flashSize = (BOARD_FLASH_SIZE / 1024),
|
||||
.CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle,
|
||||
.CSInterval = 2,
|
||||
.CSHoldTime = 3,
|
||||
.CSSetupTime = 3,
|
||||
.dataValidTime = 0,
|
||||
.columnspace = 0,
|
||||
.enableWordAddress = 0,
|
||||
.AWRSeqIndex = 0,
|
||||
.AWRSeqNumber = 0,
|
||||
.ARDSeqIndex = NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD,
|
||||
.ARDSeqNumber = 1,
|
||||
.AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,
|
||||
.AHBWriteWaitInterval = 0,
|
||||
};
|
||||
|
||||
const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
|
||||
/* Normal read mode -SDR */
|
||||
/* Normal read mode -SDR */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x03, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL + 1] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
|
||||
|
||||
/* Fast read mode - SDR */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x0B, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST + 1] = FLEXSPI_LUT_SEQ(
|
||||
kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_1PAD, 0x08, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),
|
||||
|
||||
/* Fast read quad mode - SDR */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xEB, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 0x18),
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD + 1] = FLEXSPI_LUT_SEQ(
|
||||
kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 0x06, kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04),
|
||||
|
||||
/* Read extend parameters */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_READSTATUS] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x81, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),
|
||||
|
||||
/* Write Enable */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x06, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
|
||||
|
||||
/* Erase Sector */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x20, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
|
||||
|
||||
/* Page Program - single mode */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x02, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE + 1] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
|
||||
|
||||
/* Page Program - quad mode */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x32, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
|
||||
|
||||
/* Read ID */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_READID] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x9F, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),
|
||||
|
||||
/* Enable Quad mode */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x31, kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04),
|
||||
|
||||
/* Read status register */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x05, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),
|
||||
|
||||
/* Erase whole chip */
|
||||
[4 * NOR_CMD_LUT_SEQ_IDX_ERASECHIP] =
|
||||
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xC7, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
|
||||
};
|
||||
|
||||
extern status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address);
|
||||
extern status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src);
|
||||
extern status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId);
|
||||
extern status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base);
|
||||
extern status_t flexspi_nor_erase_chip(FLEXSPI_Type *base);
|
||||
extern void flexspi_nor_flash_init(FLEXSPI_Type *base);
|
||||
|
||||
void supervisor_flash_init(void) {
|
||||
if (init_done)
|
||||
return;
|
||||
|
||||
SCB_DisableDCache();
|
||||
|
||||
status_t status;
|
||||
uint8_t vendorID = 0;
|
||||
|
||||
flexspi_nor_flash_init(FLEXSPI);
|
||||
|
||||
/* Get vendor ID. */
|
||||
status = flexspi_nor_get_vendor_id(FLEXSPI, &vendorID);
|
||||
if (status != kStatus_Success) {
|
||||
printf("flexspi_nor_get_vendor_id fail %ld\r\n", status);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Enter quad mode. */
|
||||
__disable_irq();
|
||||
status = flexspi_nor_enable_quad_mode(FLEXSPI);
|
||||
if (status != kStatus_Success)
|
||||
{
|
||||
printf("flexspi_nor_enable_quad_mode fail %ld\r\n", status);
|
||||
return;
|
||||
}
|
||||
__enable_irq();
|
||||
|
||||
SCB_EnableDCache();
|
||||
|
||||
init_done = true;
|
||||
void PLACE_IN_ITCM(supervisor_flash_init)(void) {
|
||||
// Update the LUT to make sure all entries are available.
|
||||
FLEXSPI_UpdateLUT(FLEXSPI, 0, (const uint32_t*) &qspiflash_config.memConfig.lookupTable, 64);
|
||||
}
|
||||
|
||||
static inline uint32_t lba2addr(uint32_t block) {
|
||||
@ -183,7 +73,7 @@ uint32_t supervisor_flash_get_block_count(void) {
|
||||
return CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE / FILESYSTEM_BLOCK_SIZE;
|
||||
}
|
||||
|
||||
void port_internal_flash_flush(void) {
|
||||
void PLACE_IN_ITCM(port_internal_flash_flush)(void) {
|
||||
if (_flash_page_addr == NO_CACHE) return;
|
||||
status_t status;
|
||||
|
||||
@ -211,6 +101,7 @@ void port_internal_flash_flush(void) {
|
||||
|
||||
DCACHE_CleanInvalidateByRange(_flash_page_addr, SECTOR_SIZE);
|
||||
}
|
||||
_flash_page_addr = NO_CACHE;
|
||||
}
|
||||
|
||||
mp_uint_t supervisor_flash_read_blocks(uint8_t *dest, uint32_t block, uint32_t num_blocks) {
|
||||
|
@ -34,20 +34,11 @@
|
||||
#define INTERNAL_FLASH_SYSTICK_MASK (0x1ff) // 512ms
|
||||
#define INTERNAL_FLASH_IDLE_TICK(tick) (((tick) & INTERNAL_FLASH_SYSTICK_MASK) == 2)
|
||||
|
||||
#define CUSTOM_LUT_LENGTH 60
|
||||
#define FLASH_PAGE_SIZE 256
|
||||
|
||||
#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL 7
|
||||
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST 13
|
||||
#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD 0
|
||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS 1
|
||||
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE 2
|
||||
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 3
|
||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE 6
|
||||
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD 4
|
||||
#define NOR_CMD_LUT_SEQ_IDX_READID 8
|
||||
#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG 9
|
||||
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG 12
|
||||
#define NOR_CMD_LUT_SEQ_IDX_ERASECHIP 5
|
||||
#define ROM_INDEX_WRITEENABLE 3
|
||||
#define ROM_INDEX_ERASESECTOR 5
|
||||
#define ROM_INDEX_PAGEPROGRAM 9
|
||||
#define ROM_INDEX_READSTATUSREG 1
|
||||
|
||||
#endif // MICROPY_INCLUDED_MIMXRT10XX_INTERNAL_FLASH_H
|
||||
|
@ -72,7 +72,8 @@
|
||||
#define NO_EXECUTION 1
|
||||
#define EXECUTION 0
|
||||
|
||||
// Shareable if the memory system manages coherency.
|
||||
// Shareable if the memory system manages coherency. This means shared between memory bus masters,
|
||||
// not just CPUs.
|
||||
#define NOT_SHAREABLE 0
|
||||
#define SHAREABLE 1
|
||||
|
||||
@ -207,9 +208,11 @@ __attribute__((used, naked)) void Reset_Handler(void) {
|
||||
MPU->RBAR = ARM_MPU_RBAR(13, 0x20000000U);
|
||||
MPU->RASR = ARM_MPU_RASR(EXECUTION, ARM_MPU_AP_FULL, NORMAL, NOT_SHAREABLE, CACHEABLE, BUFFERABLE, NO_SUBREGIONS, ARM_MPU_REGION_SIZE_32KB);
|
||||
|
||||
// This is OCRAM.
|
||||
// This is OCRAM. We mark it as shareable so that it isn't cached. This makes USB work at the
|
||||
// cost of 1/4 speed OCRAM accesses. It will leave more room for caching data from the flash
|
||||
// too which might be a net win.
|
||||
MPU->RBAR = ARM_MPU_RBAR(14, 0x20200000U);
|
||||
MPU->RASR = ARM_MPU_RASR(EXECUTION, ARM_MPU_AP_FULL, NORMAL, NOT_SHAREABLE, CACHEABLE, BUFFERABLE, NO_SUBREGIONS, ARM_MPU_REGION_SIZE_512KB);
|
||||
MPU->RASR = ARM_MPU_RASR(EXECUTION, ARM_MPU_AP_FULL, NORMAL, SHAREABLE, CACHEABLE, BUFFERABLE, NO_SUBREGIONS, ARM_MPU_REGION_SIZE_512KB);
|
||||
|
||||
// We steal 64k from FlexRAM for ITCM and DTCM so disable those memory regions here.
|
||||
MPU->RBAR = ARM_MPU_RBAR(15, 0x20280000U);
|
||||
@ -322,19 +325,22 @@ void reset_cpu(void) {
|
||||
reset();
|
||||
}
|
||||
|
||||
supervisor_allocation* port_fixed_stack(void) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
extern uint32_t _ld_heap_start, _ld_heap_end, _ld_stack_top, _ld_stack_bottom;
|
||||
uint32_t *port_stack_get_limit(void) {
|
||||
return &_ld_heap_start;
|
||||
return &_ld_stack_bottom;
|
||||
}
|
||||
|
||||
uint32_t *port_stack_get_top(void) {
|
||||
return &_ld_stack_top;
|
||||
}
|
||||
|
||||
supervisor_allocation _fixed_stack;
|
||||
supervisor_allocation* port_fixed_stack(void) {
|
||||
_fixed_stack.ptr = port_stack_get_limit();
|
||||
_fixed_stack.length = (port_stack_get_top() - port_stack_get_limit()) * sizeof(uint32_t);
|
||||
return &_fixed_stack;
|
||||
}
|
||||
|
||||
uint32_t *port_heap_get_bottom(void) {
|
||||
return &_ld_heap_start;
|
||||
}
|
||||
|
@ -50,10 +50,6 @@ void init_usb_hardware(void) {
|
||||
phytx &= ~(USBPHY_TX_D_CAL_MASK | USBPHY_TX_TXCAL45DM_MASK | USBPHY_TX_TXCAL45DP_MASK);
|
||||
phytx |= USBPHY_TX_D_CAL(0x0C) | USBPHY_TX_TXCAL45DP(0x06) | USBPHY_TX_TXCAL45DM(0x06);
|
||||
usb_phy->TX = phytx;
|
||||
|
||||
// Temporarily disable the data cache until we can sort out all of the spots in TinyUSB that
|
||||
// need the cache invalidated or cleaned.
|
||||
SCB_DisableDCache();
|
||||
}
|
||||
|
||||
void USB_OTG1_IRQHandler(void) {
|
||||
|
@ -50,7 +50,7 @@ void check_nrf_error(uint32_t err_code) {
|
||||
mp_raise_msg(&mp_type_TimeoutError, NULL);
|
||||
return;
|
||||
case BLE_ERROR_INVALID_CONN_HANDLE:
|
||||
mp_raise_bleio_ConnectionError(translate("Not connected"));
|
||||
mp_raise_ConnectionError(translate("Not connected"));
|
||||
return;
|
||||
default:
|
||||
mp_raise_bleio_BluetoothError(translate("Unknown soft device error: %04x"), err_code);
|
||||
@ -115,7 +115,7 @@ bleio_adapter_obj_t common_hal_bleio_adapter_obj = {
|
||||
|
||||
void common_hal_bleio_check_connected(uint16_t conn_handle) {
|
||||
if (conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||
mp_raise_bleio_ConnectionError(translate("Not connected"));
|
||||
mp_raise_ConnectionError(translate("Not connected"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@
|
||||
|
||||
STATIC void raise_error_if_not_connected(bleio_characteristic_buffer_obj_t *self) {
|
||||
if (!common_hal_bleio_characteristic_buffer_connected(self)) {
|
||||
mp_raise_bleio_ConnectionError(translate("Not connected"));
|
||||
mp_raise_ConnectionError(translate("Not connected"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -63,7 +63,7 @@
|
||||
|
||||
void bleio_connection_ensure_connected(bleio_connection_obj_t *self) {
|
||||
if (!common_hal_bleio_connection_get_connected(self)) {
|
||||
mp_raise_bleio_ConnectionError(translate("Connection has been disconnected and can no longer be used. Create a new connection."));
|
||||
mp_raise_ConnectionError(translate("Connection has been disconnected and can no longer be used. Create a new connection."));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -161,7 +161,7 @@ STATIC mp_obj_t bleio_packet_buffer_write(mp_uint_t n_args, const mp_obj_t *pos_
|
||||
// gatts write events, which may not have been sent yet.
|
||||
//
|
||||
// IDEAL:
|
||||
// mp_raise_bleio_ConnectionError(translate("Not connected"));
|
||||
// mp_raise_ConnectionError(translate("Not connected"));
|
||||
// TEMPORARY:
|
||||
num_bytes_written = 0;
|
||||
}
|
||||
|
@ -63,7 +63,6 @@
|
||||
//| """Catchall exception for Bluetooth related errors."""
|
||||
//| ...
|
||||
MP_DEFINE_BLEIO_EXCEPTION(BluetoothError, Exception)
|
||||
|
||||
NORETURN void mp_raise_bleio_BluetoothError(const compressed_string_t* fmt, ...) {
|
||||
va_list argptr;
|
||||
va_start(argptr,fmt);
|
||||
@ -71,18 +70,6 @@ NORETURN void mp_raise_bleio_BluetoothError(const compressed_string_t* fmt, ...)
|
||||
va_end(argptr);
|
||||
nlr_raise(exception);
|
||||
}
|
||||
//| class ConnectionError(BluetoothError):
|
||||
//| """Raised when a connection is unavailable."""
|
||||
//| ...
|
||||
//|
|
||||
MP_DEFINE_BLEIO_EXCEPTION(ConnectionError, bleio_BluetoothError)
|
||||
NORETURN void mp_raise_bleio_ConnectionError(const compressed_string_t* fmt, ...) {
|
||||
va_list argptr;
|
||||
va_start(argptr,fmt);
|
||||
mp_obj_t exception = mp_obj_new_exception_msg_vlist(&mp_type_bleio_ConnectionError, fmt, argptr);
|
||||
va_end(argptr);
|
||||
nlr_raise(exception);
|
||||
}
|
||||
|
||||
//| class RoleError(BluetoothError):
|
||||
//| """Raised when a resource is used as the mismatched role. For example, if a local CCCD is
|
||||
@ -93,6 +80,7 @@ MP_DEFINE_BLEIO_EXCEPTION(RoleError, bleio_BluetoothError)
|
||||
NORETURN void mp_raise_bleio_RoleError(const compressed_string_t* msg) {
|
||||
mp_raise_msg(&mp_type_bleio_RoleError, msg);
|
||||
}
|
||||
|
||||
//| class SecurityError(BluetoothError):
|
||||
//| """Raised when a security related error occurs."""
|
||||
//| ...
|
||||
@ -183,7 +171,6 @@ STATIC const mp_rom_map_elem_t bleio_module_globals_table[] = {
|
||||
|
||||
// Errors
|
||||
{ MP_ROM_QSTR(MP_QSTR_BluetoothError), OBJ_FROM_PTR(&mp_type_bleio_BluetoothError) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_ConnectionError), OBJ_FROM_PTR(&mp_type_bleio_ConnectionError) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_RoleError), OBJ_FROM_PTR(&mp_type_bleio_RoleError) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_SecurityError), OBJ_FROM_PTR(&mp_type_bleio_SecurityError) },
|
||||
|
||||
|
@ -51,14 +51,12 @@ const mp_obj_type_t mp_type_bleio_ ## exc_name = { \
|
||||
};
|
||||
|
||||
extern const mp_obj_type_t mp_type_bleio_BluetoothError;
|
||||
extern const mp_obj_type_t mp_type_bleio_ConnectionError;
|
||||
extern const mp_obj_type_t mp_type_bleio_RoleError;
|
||||
extern const mp_obj_type_t mp_type_bleio_SecurityError;
|
||||
|
||||
extern mp_obj_t bleio_set_adapter(mp_obj_t adapter_obj);
|
||||
|
||||
NORETURN void mp_raise_bleio_BluetoothError(const compressed_string_t* msg, ...);
|
||||
NORETURN void mp_raise_bleio_ConnectionError(const compressed_string_t* msg, ...);
|
||||
NORETURN void mp_raise_bleio_RoleError(const compressed_string_t* msg);
|
||||
NORETURN void mp_raise_bleio_SecurityError(const compressed_string_t* msg, ...);
|
||||
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include "py/gc.h"
|
||||
#include "py/mpconfig.h"
|
||||
#include "supervisor/background_callback.h"
|
||||
#include "supervisor/linker.h"
|
||||
#include "supervisor/shared/tick.h"
|
||||
#include "shared-bindings/microcontroller/__init__.h"
|
||||
|
||||
@ -63,7 +64,7 @@ void background_callback_add(background_callback_t *cb, background_callback_fun
|
||||
}
|
||||
|
||||
static bool in_background_callback;
|
||||
void background_callback_run_all() {
|
||||
void PLACE_IN_ITCM(background_callback_run_all)() {
|
||||
if (!callback_head) {
|
||||
return;
|
||||
}
|
||||
|
@ -105,13 +105,19 @@ void filesystem_init(bool create_allowed, bool force_create) {
|
||||
|
||||
// set label
|
||||
#ifdef CIRCUITPY_DRIVE_LABEL
|
||||
f_setlabel(&vfs_fat->fatfs, CIRCUITPY_DRIVE_LABEL);
|
||||
res = f_setlabel(&vfs_fat->fatfs, CIRCUITPY_DRIVE_LABEL);
|
||||
#else
|
||||
f_setlabel(&vfs_fat->fatfs, "CIRCUITPY");
|
||||
res = f_setlabel(&vfs_fat->fatfs, "CIRCUITPY");
|
||||
#endif
|
||||
if (res != FR_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
// inhibit file indexing on MacOS
|
||||
f_mkdir(&vfs_fat->fatfs, "/.fseventsd");
|
||||
res = f_mkdir(&vfs_fat->fatfs, "/.fseventsd");
|
||||
if (res != FR_OK) {
|
||||
return;
|
||||
}
|
||||
make_empty_file(&vfs_fat->fatfs, "/.metadata_never_index");
|
||||
make_empty_file(&vfs_fat->fatfs, "/.Trashes");
|
||||
make_empty_file(&vfs_fat->fatfs, "/.fseventsd/no_log");
|
||||
@ -119,7 +125,10 @@ void filesystem_init(bool create_allowed, bool force_create) {
|
||||
make_sample_code_file(&vfs_fat->fatfs);
|
||||
|
||||
// create empty lib directory
|
||||
f_mkdir(&vfs_fat->fatfs, "/lib");
|
||||
res = f_mkdir(&vfs_fat->fatfs, "/lib");
|
||||
if (res != FR_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
// and ensure everything is flushed
|
||||
supervisor_flash_flush();
|
||||
|
@ -88,9 +88,6 @@ static void build_partition(uint8_t *buf, int boot, int type, uint32_t start_blo
|
||||
|
||||
mp_uint_t flash_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blocks) {
|
||||
if (block_num == 0) {
|
||||
if (num_blocks > 1) {
|
||||
return 1; // error
|
||||
}
|
||||
// fake the MBR so we can decide on our own partition table
|
||||
|
||||
for (int i = 0; i < 446; i++) {
|
||||
@ -104,9 +101,13 @@ mp_uint_t flash_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_bloc
|
||||
|
||||
dest[510] = 0x55;
|
||||
dest[511] = 0xaa;
|
||||
|
||||
return 0; // ok
|
||||
|
||||
if (num_blocks > 1) {
|
||||
dest += 512;
|
||||
num_blocks -= 1;
|
||||
// Fall through and do a read from flash.
|
||||
} else {
|
||||
return 0; // Done and ok.
|
||||
}
|
||||
}
|
||||
return supervisor_flash_read_blocks(dest, block_num - PART1_START_BLOCK, num_blocks);
|
||||
}
|
||||
@ -159,16 +160,37 @@ STATIC mp_obj_t supervisor_flash_obj_writeblocks(mp_obj_t self, mp_obj_t block_n
|
||||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_3(supervisor_flash_obj_writeblocks_obj, supervisor_flash_obj_writeblocks);
|
||||
|
||||
bool flash_ioctl(size_t cmd, mp_int_t* out_value) {
|
||||
*out_value = 0;
|
||||
switch (cmd) {
|
||||
case BP_IOCTL_INIT:
|
||||
supervisor_flash_init();
|
||||
break;
|
||||
case BP_IOCTL_DEINIT:
|
||||
supervisor_flash_flush();
|
||||
break; // TODO properly
|
||||
case BP_IOCTL_SYNC:
|
||||
supervisor_flash_flush();
|
||||
break;
|
||||
case BP_IOCTL_SEC_COUNT:
|
||||
*out_value = flash_get_block_count();
|
||||
break;
|
||||
case BP_IOCTL_SEC_SIZE:
|
||||
*out_value = supervisor_flash_get_block_size();
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
STATIC mp_obj_t supervisor_flash_obj_ioctl(mp_obj_t self, mp_obj_t cmd_in, mp_obj_t arg_in) {
|
||||
mp_int_t cmd = mp_obj_get_int(cmd_in);
|
||||
switch (cmd) {
|
||||
case BP_IOCTL_INIT: supervisor_flash_init(); return MP_OBJ_NEW_SMALL_INT(0);
|
||||
case BP_IOCTL_DEINIT: supervisor_flash_flush(); return MP_OBJ_NEW_SMALL_INT(0); // TODO properly
|
||||
case BP_IOCTL_SYNC: supervisor_flash_flush(); return MP_OBJ_NEW_SMALL_INT(0);
|
||||
case BP_IOCTL_SEC_COUNT: return MP_OBJ_NEW_SMALL_INT(flash_get_block_count());
|
||||
case BP_IOCTL_SEC_SIZE: return MP_OBJ_NEW_SMALL_INT(supervisor_flash_get_block_size());
|
||||
default: return mp_const_none;
|
||||
mp_int_t out_value;
|
||||
if (flash_ioctl(cmd, &out_value)) {
|
||||
return MP_OBJ_NEW_SMALL_INT(out_value);
|
||||
}
|
||||
return mp_const_none;
|
||||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_3(supervisor_flash_obj_ioctl_obj, supervisor_flash_obj_ioctl);
|
||||
|
||||
@ -200,4 +222,5 @@ void supervisor_flash_init_vfs(fs_user_mount_t *vfs) {
|
||||
vfs->writeblocks[2] = (mp_obj_t)flash_write_blocks; // native version
|
||||
vfs->u.ioctl[0] = (mp_obj_t)&supervisor_flash_obj_ioctl_obj;
|
||||
vfs->u.ioctl[1] = (mp_obj_t)&supervisor_flash_obj;
|
||||
vfs->u.ioctl[2] = (mp_obj_t)flash_ioctl; // native version
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user