| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| #include <assert.h> |
| |
| #include "os/mynewt.h" |
| |
| #include <bsp/bsp.h> |
| #include <hal/hal_bsp.h> |
| #include <mcu/mips_bsp.h> |
| #include <mcu/mips_hal.h> |
| #include <mcu/pic32mz_periph.h> |
| #include <string.h> |
| #include <xc.h> |
| |
| #if MYNEWT_VAL(SPIFLASH) |
| #include <spiflash/spiflash.h> |
| #endif |
| |
| #if MYNEWT_VAL(BOOT_LOADER) || MYNEWT_VAL(MCU_NO_BOOTLOADER_BUILD) |
| /* JTAG on, WDT off */ |
| #pragma config FDMTEN=0, FSOSCEN=0, DMTCNT=1 |
| #pragma config DEBUG=ON |
| #pragma config JTAGEN=OFF |
| #pragma config FSLEEP=OFF |
| #pragma config TRCEN=OFF |
| #pragma config ICESEL=ICS_PGx2 |
| |
| #if MYNEWT_VAL(CLOCK_FREQ) == 8000000 |
| #pragma config POSCMOD = OFF |
| #pragma config FNOSC = FRCDIV |
| #pragma config FPLLICLK=0 |
| #else |
| #pragma config POSCMOD = EC |
| #if MYNEWT_VAL(CLOCK_FREQ) == 24000000 |
| #pragma config FNOSC = POSC |
| /* 24MHz posc input -> 50mhz*/ |
| #pragma config FPLLICLK=0 |
| #elif MYNEWT_VAL(CLOCK_FREQ) == 50000000 |
| #pragma config FNOSC = SPLL |
| /* 24MHz posc input to pll, div by 3 -> 8, multiply by 50 -> 400, div by 8 -> 50mhz*/ |
| #pragma config FPLLICLK=0, FPLLIDIV=DIV_3, FPLLRNG=RANGE_5_10_MHZ, FPLLMULT=MUL_50, FPLLODIV=DIV_8 |
| #elif MYNEWT_VAL(CLOCK_FREQ) == 100000000 |
| #pragma config FNOSC = SPLL |
| /* 24MHz posc input to pll, div by 3, multiply by 50, div by 4 -> 100mhz*/ |
| #pragma config FPLLICLK=0, FPLLIDIV=DIV_3, FPLLRNG=RANGE_5_10_MHZ, FPLLMULT=MUL_50, FPLLODIV=DIV_4 |
| #elif MYNEWT_VAL(CLOCK_FREQ) == 200000000 |
| #pragma config FNOSC = SPLL |
| /* 24MHz posc input to pll, div by 3, multiply by 50, div by 2 -> 200mhz*/ |
| #pragma config FPLLICLK=0, FPLLIDIV=DIV_3, FPLLRNG=RANGE_5_10_MHZ, FPLLMULT=MUL_50, FPLLODIV=DIV_2 |
| #else |
| #error Clock requency not supported |
| #endif |
| #endif |
| /* USB off */ |
| #pragma config FUSBIDIO=0 |
| /* |
| * Watchdog in non-window mode, watchdog disabled during flash programming, |
| * period: 32s |
| */ |
| #pragma config WINDIS=1, WDTSPGM=1, WDTPS=15 |
| |
| #endif |
| |
| #if MYNEWT_VAL(SPIFLASH) |
| #if MYNEWT_VAL(BUS_DRIVER_PRESENT) |
| struct bus_spi_node_cfg flash_spi_cfg = { |
| .node_cfg.bus_name = MYNEWT_VAL(BSP_FLASH_SPI_BUS), |
| .pin_cs = MYNEWT_VAL(SPIFLASH_SPI_CS_PIN), |
| .mode = BUS_SPI_MODE_3, |
| .data_order = HAL_SPI_MSB_FIRST, |
| .freq = MYNEWT_VAL(SPIFLASH_BAUDRATE), |
| }; |
| #endif |
| #endif |
| |
| static const struct hal_flash *flash_devs[] = { |
| [0] = &pic32mz_flash_dev, |
| #if MYNEWT_VAL(SPIFLASH) |
| [1] = &spiflash_dev.hal, |
| #endif |
| }; |
| |
| const struct hal_flash * |
| hal_bsp_flash_dev(uint8_t id) |
| { |
| if (id >= ARRAY_SIZE(flash_devs)) { |
| return NULL; |
| } |
| |
| return flash_devs[id]; |
| } |
| |
| void |
| hal_bsp_init(void) |
| { |
| pic32mz_periph_create(); |
| #if MYNEWT_VAL(SPIFLASH) && MYNEWT_VAL(BUS_DRIVER_PRESENT) |
| rc = spiflash_create_spi_dev(&spiflash_dev.dev, |
| MYNEWT_VAL(BSP_FLASH_SPI_NAME), &flash_spi_cfg); |
| assert(rc == 0); |
| #endif |
| } |
| |
| void |
| hal_bsp_deinit(void) |
| { |
| IEC0 = 0; |
| IEC1 = 0; |
| IEC2 = 0; |
| IEC3 = 0; |
| IEC4 = 0; |
| IEC5 = 0; |
| IEC6 = 0; |
| IFS0 = 0; |
| IFS1 = 0; |
| IFS2 = 0; |
| IFS3 = 0; |
| IFS4 = 0; |
| IFS5 = 0; |
| IFS6 = 0; |
| } |
| |
| int |
| hal_bsp_hw_id_len(void) |
| { |
| return sizeof(DEVID); |
| } |
| |
| int |
| hal_bsp_hw_id(uint8_t *id, int max_len) |
| { |
| if (max_len > sizeof(DEVID)) { |
| max_len = sizeof(DEVID); |
| } |
| |
| memcpy(id, (const void *)&DEVID, max_len); |
| return max_len; |
| } |