/***************************************************************************** Function: void MPFSInit(void) Summary: Initializes the MPFS module. Description: Sets all MPFS handles to closed, and initializes access to the EEPROM if necessary. Precondition: None Parameters: None Returns: None Remarks: This function is called only one during lifetime of the application. ***************************************************************************/ void MPFSInit(void) { BYTE i; for(i = 1; i <= MAX_MPFS_HANDLES; i++) { MPFSStubs[i].addr = MPFS_INVALID; } #if defined(MPFS_USE_EEPROM) // Initialize the EEPROM access routines. XEEInit(); lastRead = MPFS_INVALID; #endif #if defined(MPFS_USE_SPI_FLASH) // Initialize SPI Flash access routines. #if (GRAPHICS_PICTAIL_VERSION == 3) SST25Init(); #else SST39Init(); #endif #endif // Validate the image and load numFiles _Validate(); isMPFSLocked = FALSE; }
int main(void) { GOL_MSG msg; // GOL message structure to interact with GOL Nop(); #if defined(PIC24FJ256DA210_DEV_BOARD) _ANSG8 = 0; /* S1 */ _ANSE9 = 0; /* S2 */ _ANSB5 = 0; /* S3 */ #else ///////////////////////////////////////////////////////////////////////////// // ADC Explorer 16 Development Board Errata (work around 2) // RB15 should be output ///////////////////////////////////////////////////////////////////////////// #ifndef MULTI_MEDIA_BOARD_DM00123 LATBbits.LATB15 = 0; TRISBbits.TRISB15 = 0; #endif #endif ///////////////////////////////////////////////////////////////////////////// #if defined(__dsPIC33F__) || defined(__PIC24H__) // Configure Oscillator to operate the device at 40Mhz // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2 // Fosc= 8M*40(2*2)=80Mhz for 8M input clock PLLFBD = 38; // M=40 CLKDIVbits.PLLPOST = 0; // N1=2 CLKDIVbits.PLLPRE = 0; // N2=2 OSCTUN = 0; // Tune FRC oscillator, if FRC is used // Disable Watch Dog Timer RCONbits.SWDTEN = 0; // Clock switching to incorporate PLL __builtin_write_OSCCONH(0x03); // Initiate Clock Switch to Primary // Oscillator with PLL (NOSC=0b011) __builtin_write_OSCCONL(0x01); // Start clock switching while(OSCCONbits.COSC != 0b011); // Wait for Clock switch to occur // Wait for PLL to lock while(OSCCONbits.LOCK != 1) { }; // Set PMD0 pin functionality to digital AD1PCFGL = AD1PCFGL | 0x1000; #elif defined(__PIC32MX__) INTEnableSystemMultiVectoredInt(); SYSTEMConfigPerformance(GetSystemClock()); #ifdef MULTI_MEDIA_BOARD_DM00123 CPLDInitialize(); CPLDSetGraphicsConfiguration(GRAPHICS_HW_CONFIG); CPLDSetSPIFlashConfiguration(SPI_FLASH_CHANNEL); #endif // #ifdef MULTI_MEDIA_BOARD_DM00123 #endif // #if defined(__dsPIC33F__) || defined(__PIC24H__) GOLInit(); // initialize graphics library & // create default style scheme for GOL #if defined (GFX_PICTAIL_V1) || defined (GFX_PICTAIL_V2) EEPROMInit(); // initialize Exp.16 EEPROM SPI BeepInit(); #else #if defined (USE_SST25VF016) SST25Init(); // initialize GFX3 SST25 flash SPI #endif #endif TouchInit(); // initialize touch screen HardwareButtonInit(); // Initialize the hardware buttons // create default style scheme for GOL TickInit(); // initialize tick counter (for random number generation) // create default style scheme for GOL #if defined(__dsPIC33FJ128GP804__) || defined(__PIC24HJ128GP504__) // If S3 button on Explorer 16 board is pressed calibrate touch screen TRISAbits.TRISA9 = 1; if(PORTAbits.RA9 == 0) { TRISAbits.TRISA9 = 0; TouchCalibration(); TouchStoreCalibration(); } TRISAbits.TRISA9 = 0; #else /** * Force a touchscreen calibration by pressing the switch * Explorer 16 + GFX PICTail - S3 (8 bit PMP) * Explorer 16 + GFX PICTail - S5 (16 bit PMP) * Starter Kit + GFX PICTail - S0 (8 bit PMP) * Multimedia Expansion Board - Fire Button * DA210 Developement Board - S1 * NOTE: Starter Kit + GFX PICTail will switches are shared * with the 16 bit PMP data bus. **/ if(GetHWButtonTouchCal() == HW_BUTTON_PRESS) { TouchCalibration(); TouchStoreCalibration(); } #endif // If it's a new board (EEPROM_VERSION byte is not programed) calibrate touch screen #if defined (GFX_PICTAIL_V1) || defined (GFX_PICTAIL_V2) if(GRAPHICS_LIBRARY_VERSION != EEPROMReadWord(ADDRESS_VERSION)) { TouchCalibration(); TouchStoreCalibration(); } #else #if defined (USE_SST25VF016) if(GRAPHICS_LIBRARY_VERSION != SST25ReadWord(ADDRESS_VERSION)) { TouchCalibration(); TouchStoreCalibration(); } #elif defined (USE_SST39LF400) WORD tempArray[12], tempWord = 0x1234; SST39LF400Init(tempArray); tempWord = SST39LF400ReadWord(ADDRESS_VERSION); SST39LF400DeInit(tempArray); if(GRAPHICS_LIBRARY_VERSION != tempWord) { TouchCalibration(); TouchStoreCalibration(); } #endif #endif // Load touch screen calibration parameters from memory TouchLoadCalibration(); GDDDemoCreateFirstScreen(); while(1) { if(GOLDraw()) // Draw GOL object { TouchGetMsg(&msg); // Get message from touch screen #if (NUM_GDD_SCREENS > 1) // GDD Readme: // The following line of code allows a GDD user to touch the touchscreen // to cycle through different static screens for viewing. This is useful as a // quick way to view how each screen looks on the physical target hardware. // This line of code should eventually be commented out for actual development. // Also note that widget/object names can be found in GDD_Screens.h if(msg.uiEvent == EVENT_RELEASE) GDDDemoNextScreen(); #endif GOLMsg(&msg); // Process message } }//end while }
/***************************************** * void InitializeHardware(void) *****************************************/ void InitializeHardware(void) { #if defined(__dsPIC33F__) || defined(__PIC24H__) // Configure Oscillator to operate the device at 40Mhz // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2 // Fosc= 8M*40(2*2)=80Mhz for 8M input clock PLLFBD = 38; // M=40 CLKDIVbits.PLLPOST = 0; // N1=2 CLKDIVbits.PLLPRE = 0; // N2=2 OSCTUN = 0; // Tune FRC oscillator, if FRC is used // Disable Watch Dog Timer RCONbits.SWDTEN = 0; // Clock switching to incorporate PLL __builtin_write_OSCCONH(0x03); // Initiate Clock Switch to Primary // Oscillator with PLL (NOSC=0b011) __builtin_write_OSCCONL(0x01); // Start clock switching while(OSCCONbits.COSC != 0b011); // Wait for Clock switch to occur // Wait for PLL to lock while(OSCCONbits.LOCK != 1) { }; #elif defined(__PIC32MX__) SYSTEMConfig(GetSystemClock(), SYS_CFG_ALL); #ifdef MEB_BOARD CPLDInitialize(); CPLDSetGraphicsConfiguration(GRAPHICS_HW_CONFIG); CPLDSetSPIFlashConfiguration(SPI_FLASH_CHANNEL); #endif #endif #if defined(__dsPIC33FJ128GP804__) || defined(__PIC24HJ128GP504__) AD1PCFGL = 0xffff; #endif #if defined (__PIC24FJ256GB210__) // Map UART2 __builtin_write_OSCCONL(OSCCON & 0xbf); // Configure Input Functions (Table 10-2)) // Assign U2RX To Pin RP10 RPINR19bits.U2RXR = 10; // Assign U2CTS To Pin RP32 RPINR19bits.U2CTSR = 32; // Configure Output Functions (Table 10-4) // Assign U2TX To Pin RP17 RPOR8bits.RP17R = 5; // Assign U2RTS To Pin RP31 RPOR15bits.RP31R = 6; __builtin_write_OSCCONL (OSCCON | 0x40); #endif #if ( USE_SPI_CHANNEL == 1 ) #if defined (__PIC24FJ256GB210__) __builtin_write_OSCCONL(OSCCON & 0xbf); // unlock PPS // Configure SPI1 PPS pins (ENC28J60/ENCX24J600/MRF24WB0M or other PICtail Plus cards) RPOR0bits.RP0R = 8; // Assign RP0 to SCK1 (output) RPOR7bits.RP15R = 7; // Assign RP15 to SDO1 (output) //RPOR6bits.RP13R = 9; // Assign RP15 to SDO1 (output) RPINR20bits.SDI1R = 23; // Assign RP23 to SDI1 (input) __builtin_write_OSCCONL(OSCCON | 0x40); // lock PP #endif #endif ///////////////////////////////////////////////////////////////////////////// // ADC Explorer 16 Development Board Errata (work around 2) // RB15 should be output ///////////////////////////////////////////////////////////////////////////// #ifndef MEB_BOARD LATBbits.LATB15 = 0; TRISBbits.TRISB15 = 0; #endif #if defined (EXPLORER_16) /************************************************************************ * For Explorer 16 RD12 is connected to EEPROM chip select. * To prevent a conflict between this EEPROM and SST25 flash * the chip select of the EEPROM SPI should be pulled up. ************************************************************************/ // Set IOs directions for EEPROM SPI MCHP25LC256_CS_LAT = 1; // set initial CS value to 1 (not asserted) MCHP25LC256_CS_TRIS = 0; // set CS pin to output #endif // #if defined (EXPLORER_16) //The following are PIC device specific settings for the SPI channel //used. //Set IOs directions for SST25 SPI #if defined (USE_SST25VF064) SST25_CS_LAT = 1; SST25_CS_TRIS = 0; #ifndef __PIC32MX__ SST25_SCK_TRIS = 0; SST25_SDO_TRIS = 0; SST25_SDI_TRIS = 1; #if defined(__PIC24FJ256GB210__) || defined(__dsPIC33E__) || defined(__PIC24E__) SST25_SDI_ANS = 0; #endif #endif #endif // set the peripheral pin select for the SPI channel used #if defined(__PIC24FJ256GB110__) || defined(__PIC24FJ256GA110__) || defined (__PIC24FJ256GB210__) __builtin_write_OSCCONL(OSCCON & 0xbf); // unlock PPS RPOR10bits.RP21R = 11; // assign RP21 for SCK2 RPOR9bits.RP19R = 10; // assign RP19 for SDO2 RPINR22bits.SDI2R = 26; // assign RP26 for SDI2 __builtin_write_OSCCONL(OSCCON | 0x40); // lock PPS #endif #if defined (USE_SST25VF064) SST25Init((DRV_SPI_INIT_DATA *)&SPI_Init_Data); #endif }
///////////////////////////////////////////////////////////////////////////// // Function: InitializeBoard() // Input: none // Output: none // Overview: Initializes the hardware components including the PIC device // used. ///////////////////////////////////////////////////////////////////////////// void InitializeBoard(void) { ///////////////////////////////////////////////////////////////////////////// // ADC Explorer 16 Development Board Errata (work around 2) // RB15 should be output ///////////////////////////////////////////////////////////////////////////// LATBbits.LATB15 = 0; TRISBbits.TRISB15 = 0; #if defined(__dsPIC33F__) || defined(__PIC24H__) // Configure Oscillator to operate the device at 40Mhz // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2 // Fosc= 8M*40(2*2)=80Mhz for 8M input clock PLLFBD = 38; // M=40 CLKDIVbits.PLLPOST = 0; // N1=2 CLKDIVbits.PLLPRE = 0; // N2=2 OSCTUN = 0; // Tune FRC oscillator, if FRC is used // Disable Watch Dog Timer RCONbits.SWDTEN = 0; // Clock switching to incorporate PLL __builtin_write_OSCCONH(0x03); // Initiate Clock Switch to Primary // Oscillator with PLL (NOSC=0b011) __builtin_write_OSCCONL(0x01); // Start clock switching while(OSCCONbits.COSC != 0b011); // Wait for Clock switch to occur // Wait for PLL to lock while(OSCCONbits.LOCK != 1) { }; // Set PMD0 pin functionality to digital AD1PCFGL = AD1PCFGL | 0x1000; #if defined(__dsPIC33FJ128GP804__) || defined(__PIC24HJ128GP504__) AD1PCFGLbits.PCFG6 = 1; AD1PCFGLbits.PCFG7 = 1; AD1PCFGLbits.PCFG8 = 1; #endif #elif defined(__PIC32MX__) INTEnableSystemMultiVectoredInt(); SYSTEMConfigPerformance(GetSystemClock()); #endif // #if defined(__dsPIC33F__) || defined(__PIC24H__) #if defined (EXPLORER_16) /************************************************************************ * For Explorer 16 RD12 is connected to EEPROM chip select. * To prevent a conflict between this EEPROM and SST25 flash * the chip select of the EEPROM SPI should be pulled up. ************************************************************************/ // Set IOs directions for EEPROM SPI MCHP25LC256_CS_LAT = 1; // set initial CS value to 1 (not asserted) MCHP25LC256_CS_TRIS = 0; // set CS pin to output #endif // #if defined (EXPLORER_16) //The following are PIC device specific settings for the SPI channel //used. //Set IOs directions for SST25 SPI SST25_CS_LAT = 1; SST25_CS_TRIS = 0; #ifndef __PIC32MX__ SST25_SCK_TRIS = 0; SST25_SDO_TRIS = 0; SST25_SDI_TRIS = 1; #if defined(__PIC24FJ256GB210__) SST25_SDI_ANS = 0; #endif #endif // set the peripheral pin select for the PSI channel used #if defined(__dsPIC33FJ128GP804__) || defined(__PIC24HJ128GP504__) AD1PCFGL = 0xFFFF; RPOR9bits.RP18R = 11; // assign RP18 for SCK2 RPOR8bits.RP16R = 10; // assign RP16 for SDO2 RPINR22bits.SDI2R = 17; // assign RP17 for SDI2 #elif defined(__PIC24FJ256GB110__) || defined(__PIC24FJ256GA110__) || defined (__PIC24FJ256GB210__) __builtin_write_OSCCONL(OSCCON & 0xbf); // unlock PPS RPOR10bits.RP21R = 11; // assign RP21 for SCK2 RPOR9bits.RP19R = 10; // assign RP19 for SDO2 RPINR22bits.SDI2R = 26; // assign RP26 for SDI2 __builtin_write_OSCCONL(OSCCON | 0x40); // lock PPS #elif defined(__PIC24FJ256DA210__) __builtin_write_OSCCONL(OSCCON & 0xbf); // unlock PPS #if (SST25_SPI_CHANNEL == 1) RPOR1bits.RP2R = 8; // assign RP2 for SCK1 RPOR0bits.RP1R = 7; // assign RP1 for SDO1 RPINR20bits.SDI1R = 0; // assign RP0 for SDI1 #elif (SST25_SPI_CHANNEL == 2) RPOR1bits.RP2R = 11; // assign RP2 for SCK2 RPOR0bits.RP1R = 10; // assign RP1 for SDO2 RPINR22bits.SDI2R = 0; // assign RP0 for SDI2 #endif __builtin_write_OSCCONL(OSCCON | 0x40); // lock PPS #endif ///////////////////////////////////////////////////////////////////////////// // DRIVER SPECIFIC INITIALIZATION DATA ///////////////////////////////////////////////////////////////////////////// GOLInit(); // Initialize graphics library and create default style scheme for GOL // initialize GFX3 SST25 flash SPI SST25Init((void*) &SPI_Init_Data); TickInit(); #if defined(SPI_CHANNEL_1_ENABLE) && defined(__PIC32MX__) //SPI1 shares pins with the PMP CS. Not recommended for use SPI1TouchInit(); /**** * AR1020 Touch Screen Controller * * Because the AR1020 needs to use the SPI channel to retrieve data and * SPI channel 1 shares the PMP CS pin, this combination is not supported. * The user will receive a compile time error to avoid run time errors * with this combination. ****/ #ifdef USE_TOUCHSCREEN_AR1020 #error "The combination of AR1020 touch screen controller and SPI 1 channel is not supported. Please use SPI channel 2 with the AR1020 controller, or resistive touch." #endif #else // initialize the components for Resistive Touch Screen TouchInit(NVMWrite, NVMRead, NVMSectorErase, TOUCH_INIT_VALUES); #endif HardwareButtonInit(); // Initialize the hardware buttons }