From 217c3a59a0fd96a9bce3e2bd5ca58e83fd090664 Mon Sep 17 00:00:00 2001 From: Kevin Townsend Date: Wed, 3 Aug 2011 21:25:40 +0200 Subject: [PATCH] Updated to v0.95 --- ChangeLog.txt | 21 ++++- Makefile | 2 +- build/codelite/LPC1343 Workspace.tags | Bin 141312 -> 316416 bytes .../LPC1343 Workspace.workspace.session | 16 ++-- build/codelite/LPC1343_CodeBase.project | 51 +++++------ build/crossworks/LPC1343_CodeBase.hzp | 26 +++--- build/crossworks/LPC1343_CodeBase.hzs | 16 ++-- core/cpu/cpu.c | 27 ++++-- core/usbcdc/usbcore.c | 7 +- drivers/lcd/tft/drawing.c | 4 +- drivers/lcd/tft/hw/ILI9325.c | 19 +++++ drivers/lcd/tft/hw/ILI9328.c | 19 +++++ drivers/lcd/tft/touchscreen.c | 3 +- drivers/rtc/isl12022m/isl12022m.c | 2 - lpc134x.h | 80 +++++++++--------- projectconfig.h | 2 +- tools/dotfactory/OutputConfigs.xml | 2 +- 17 files changed, 182 insertions(+), 115 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 96d9ba5..f638087 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,6 +1,23 @@ -v0.9.3 - Ongoing -================ +v0.9.5 - 3 August 2011 +====================== +- Redid the font rendering code to use DotFactory + generated fonts, and update to the latest binary + in the /tools folder. All fonts have been + re-rendered to accomodate the updated code. +- Updated clock values in cpu.c for PLL to match FCCO + range of 156-320MHz +- Changed SCB_PLLCTRL_MULT_* to SCB_PLLCTRL_MSEL_* in + lpc111x.h to match usermanual +- Changed SCB_PLLCTRL_DIV_* SCB_PLLCTRL_PSEL_* in + lpc111x.h to match usermanual +- Added inline version of key functions in ili9328.c, + which increases the code size ~1.3KB but more than + doubles the drawing speed for most drawing functions + by avoiding branch operations and pushing and popping + the stack multiple times. Inline methods can be + toggled with 'ILI9238_USE_INLINE_METHODS'. +- Fixed IOCON_SWDIO_PIO1_3_FUNC_CT32B1_MAT2 in lpc134x.h - Added drawCornerFilled() to drawing.c and LCD CLI - Fixed a nasty bug with 'gpioInterruptEvent' in the gpioSetInterrupt function (core/gpio/gpio.c) diff --git a/Makefile b/Makefile index ef0296a..0da6100 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ VPATH += drivers/lcd/tft/dialogues OBJS += drawing.o touchscreen.o bmp.o alphanumeric.o OBJS += dejavusans9.o dejavusansbold9.o dejavusanscondensed9.o OBJS += dejavusansmono8.o dejavusansmonobold8.o -OBJS += veramono9.o veramonobold9.o veramono11.o veramonobold11.o +OBJS += verdana9.o verdana14.o verdanabold14.o # LCD Driver (Only one can be included at a time!) OBJS += ILI9328.o diff --git a/build/codelite/LPC1343 Workspace.tags b/build/codelite/LPC1343 Workspace.tags index 0006aac5ccacf1b4a025f475f276f9f5aab5ae3f..9773273c5af3851afa44800710b68982850575a2 100644 GIT binary patch literal 316416 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ℑe6_jA%d1n&Zo$A!iH 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 - + - - - - - - - - + + - - + + diff --git a/build/codelite/LPC1343_CodeBase.project b/build/codelite/LPC1343_CodeBase.project index b5f9df1..1deddee 100644 --- a/build/codelite/LPC1343_CodeBase.project +++ b/build/codelite/LPC1343_CodeBase.project @@ -162,6 +162,10 @@ + + + + @@ -175,14 +179,12 @@ - - - - - - - - + + + + + + @@ -283,36 +285,38 @@ + + + + + + + + + - + - + # Make sure that we are using SWD monitor interface SWD - # Set monitor to little endian monitor endian little - # Set monitor speed monitor speed 1000 - # Reset device monitor reset - # Set device ID to LPC1343 monitor flash device = LPC1343 - # Enable flash download monitor flash download = 1 - # Transfer the firmware to the device load "../../firmware.elf" - # Initializing PC and stack pointer monitor reg r13 = (0x00000000) monitor reg pc = (0x00000004) @@ -337,12 +341,12 @@ monitor reg pc = (0x00000004) - + - + @@ -365,14 +369,5 @@ monitor reg pc = (0x00000004) - - - - - - - - - diff --git a/build/crossworks/LPC1343_CodeBase.hzp b/build/crossworks/LPC1343_CodeBase.hzp index 4085d03..36f5af9 100644 --- a/build/crossworks/LPC1343_CodeBase.hzp +++ b/build/crossworks/LPC1343_CodeBase.hzp @@ -219,23 +219,29 @@ - + + - + + - + + - + + + + + + - - - - - + + + @@ -379,5 +385,5 @@ diff --git a/core/cpu/cpu.c b/core/cpu/cpu.c index 4c674f2..10080fc 100644 --- a/core/cpu/cpu.c +++ b/core/cpu/cpu.c @@ -102,24 +102,39 @@ void cpuPllSetup (cpuMultiplier_t multiplier) // Set clock speed switch (multiplier) { + // Fclkout = M * Fclkin = FCCO / (2 * P) + // FCCO should be in the range of 156-320MHz + // (see Table 58 of the LPC1343 usermanual for examples) case CPU_MULTIPLIER_2: - SCB_PLLCTRL = (SCB_PLLCTRL_MULT_2 | (1 << SCB_PLLCTRL_DIV_BIT)); + // Fclkout = 24.0MHz + // FCCO = 2 * 4 * 24 = 192MHz + SCB_PLLCTRL = (SCB_PLLCTRL_MSEL_2 | SCB_PLLCTRL_PSEL_4); break; case CPU_MULTIPLIER_3: - SCB_PLLCTRL = (SCB_PLLCTRL_MULT_3 | (1 << SCB_PLLCTRL_DIV_BIT)); + // Fclkout = 36.0MHz + // FCCO = 2 * 4 * 36 = 288MHz + SCB_PLLCTRL = (SCB_PLLCTRL_MSEL_3 | SCB_PLLCTRL_PSEL_4); break; case CPU_MULTIPLIER_4: - SCB_PLLCTRL = (SCB_PLLCTRL_MULT_4 | (1 << SCB_PLLCTRL_DIV_BIT)); + // Fclkout = 48.0MHz + // FCCO = 2 * 2 * 48 = 192MHz + SCB_PLLCTRL = (SCB_PLLCTRL_MSEL_4 | SCB_PLLCTRL_PSEL_2); break; case CPU_MULTIPLIER_5: - SCB_PLLCTRL = (SCB_PLLCTRL_MULT_5 | (1 << SCB_PLLCTRL_DIV_BIT)); + // Fclkout = 60.0MHz + // FCCO = 2 * 2 * 60 = 240MHz + SCB_PLLCTRL = (SCB_PLLCTRL_MSEL_5 | SCB_PLLCTRL_PSEL_2); break; case CPU_MULTIPLIER_6: - SCB_PLLCTRL = (SCB_PLLCTRL_MULT_6 | (1 << SCB_PLLCTRL_DIV_BIT)); + // Fclkout = 72.0MHz + // FCCO = 2 * 2 * 72 = 288MHz + SCB_PLLCTRL = (SCB_PLLCTRL_MSEL_6 | SCB_PLLCTRL_PSEL_2); break; case CPU_MULTIPLIER_1: default: - SCB_PLLCTRL = (SCB_PLLCTRL_MULT_1 | (1 << SCB_PLLCTRL_DIV_BIT)); + // Fclkout = 12.0MHz + // FCCO = 2 * 8 * 12 = 192MHz + SCB_PLLCTRL = (SCB_PLLCTRL_MSEL_1 | SCB_PLLCTRL_PSEL_8); break; } diff --git a/core/usbcdc/usbcore.c b/core/usbcdc/usbcore.c index fe33aba..0544f6d 100644 --- a/core/usbcdc/usbcore.c +++ b/core/usbcdc/usbcore.c @@ -169,6 +169,7 @@ void USB_StatusOutStage (void) { static inline uint32_t USB_ReqGetStatus (void) { uint32_t n, m; + uint16_t* ep0 = (uint16_t __attribute__((packed)) *)EP0Buf; switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_DEVICE: @@ -176,7 +177,8 @@ static inline uint32_t USB_ReqGetStatus (void) { break; case REQUEST_TO_INTERFACE: if ((USB_Configuration != 0) && (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) { - *((uint16_t __attribute__((packed)) *)EP0Buf) = 0; + //*((uint16_t __attribute__((packed)) *)EP0Buf) = 0; + *ep0 = 0; EP0Data.pData = EP0Buf; } else { return (FALSE); @@ -186,7 +188,8 @@ static inline uint32_t USB_ReqGetStatus (void) { n = SetupPacket.wIndex.WB.L & 0x8F; m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); if (((USB_Configuration != 0) || ((n & 0x0F) == 0)) && (USB_EndPointMask & m)) { - *((uint16_t __attribute__((packed)) *)EP0Buf) = (USB_EndPointHalt & m) ? 1 : 0; + // *((uint16_t __attribute__((packed)) *)EP0Buf) = (USB_EndPointHalt & m) ? 1 : 0; + *ep0 = (USB_EndPointHalt & m) ? 1 : 0; EP0Data.pData = EP0Buf; } else { return (FALSE); diff --git a/drivers/lcd/tft/drawing.c b/drivers/lcd/tft/drawing.c index f7b2ab5..fe8956a 100644 --- a/drivers/lcd/tft/drawing.c +++ b/drivers/lcd/tft/drawing.c @@ -73,9 +73,7 @@ void drawSwap(uint32_t a, uint32_t b) /**************************************************************************/ void drawCharBitmap(const uint16_t xPixel, const uint16_t yPixel, uint16_t color, const uint8_t *glyph, uint8_t cols, uint8_t rows) { - uint16_t verticalPage, horizBit, currentY, currentX; - uint16_t indexIntoGlyph; - + uint16_t currentY, currentX, indexIntoGlyph; uint16_t _row, _col, _colPages; // set initial current y diff --git a/drivers/lcd/tft/hw/ILI9325.c b/drivers/lcd/tft/hw/ILI9325.c index 8b0e64a..1e75eca 100644 --- a/drivers/lcd/tft/hw/ILI9325.c +++ b/drivers/lcd/tft/hw/ILI9325.c @@ -50,6 +50,9 @@ #include "core/systick/systick.h" #include "drivers/lcd/tft/touchscreen.h" +// Uncomment this to use faster inline methods, but requires more flash +// #define ILI9235_USE_INLINE_METHODS (1) + static lcdOrientation_t lcdOrientation = LCD_ORIENTATION_PORTRAIT; static lcdProperties_t ili9325Properties = { 240, 320, TRUE, TRUE, TRUE }; @@ -62,6 +65,7 @@ static lcdProperties_t ili9325Properties = { 240, 320, TRUE, TRUE, TRUE }; @brief Causes a brief delay (10 ticks per unit) */ /**************************************************************************/ +#if !defined ILI9235_USE_INLINE_METHODS void ili9325Delay(unsigned int t) { unsigned char t1; @@ -71,12 +75,16 @@ void ili9325Delay(unsigned int t) __asm("nop"); } } +#else +static inline uint32_t ili9325Delay(unsigned int t) { unsigned char t1; while(t--) for ( t1=10; t1 > 0; t1-- ) { __asm("nop"); } } +#endif /**************************************************************************/ /*! @brief Writes the supplied 16-bit command using an 8-bit interface */ /**************************************************************************/ +#if !defined ILI9238_USE_INLINE_METHODS void ili9325WriteCmd(uint16_t command) { // Compiled with -Os on GCC 4.4 this works out to 25 cycles @@ -94,12 +102,16 @@ void ili9325WriteCmd(uint16_t command) CLR_WR; SET_WR_CS; // Saves 7 commands compared to "SET_WR; SET_CS;" } +#else +static inline void ili9325WriteCmd(uint16_t command) { CLR_CS_CD_SET_RD_WR; ILI9325_GPIO2DATA_DATA = (command >> (8 - ILI9325_DATA_OFFSET)); CLR_WR; SET_WR; ILI9325_GPIO2DATA_DATA = command << ILI9325_DATA_OFFSET; CLR_WR; SET_WR_CS; } +#endif /**************************************************************************/ /*! @brief Writes the supplied 16-bit data using an 8-bit interface */ /**************************************************************************/ +#if !defined ILI9238_USE_INLINE_METHODS void ili9325WriteData(uint16_t data) { CLR_CS_SET_CD_RD_WR; // Saves 18 commands compared to SET_CD; SET_RD; SET_WR; CLR_CS" @@ -110,6 +122,9 @@ void ili9325WriteData(uint16_t data) CLR_WR; SET_WR_CS; // Saves 7 commands compared to "SET_WR, SET_CS;" } +#else +static inline void ili9325WriteData(uint16_t data) { CLR_CS_SET_CD_RD_WR; ILI9325_GPIO2DATA_DATA = (data >> (8 - ILI9325_DATA_OFFSET)); CLR_WR; SET_WR; ILI9325_GPIO2DATA_DATA = data << ILI9325_DATA_OFFSET; CLR_WR; SET_WR_CS; } +#endif /**************************************************************************/ /*! @@ -191,6 +206,7 @@ uint16_t ili9325Type(void) @brief Sets the cursor to the specified X/Y position */ /**************************************************************************/ +#if !defined ILI9238_USE_INLINE_METHODS void ili9325SetCursor(uint16_t x, uint16_t y) { uint16_t al, ah; @@ -209,6 +225,9 @@ void ili9325SetCursor(uint16_t x, uint16_t y) ili9325Command(ILI9325_COMMANDS_HORIZONTALGRAMADDRESSSET, al); ili9325Command(ILI9325_COMMANDS_VERTICALGRAMADDRESSSET, ah); } +#else +static inline void ili9325SetCursor(uint16_t x, uint16_t y) { uint16_t al, ah; if (lcdOrientation == LCD_ORIENTATION_LANDSCAPE) { al = y; ah = x; } else { al = x; ah = y; }; ili9325WriteCmd(ILI9325_COMMANDS_HORIZONTALGRAMADDRESSSET); ili9325WriteData(al); ili9325WriteCmd(ILI9325_COMMANDS_VERTICALGRAMADDRESSSET); ili9325WriteData(ah); } +#endif /**************************************************************************/ /*! diff --git a/drivers/lcd/tft/hw/ILI9328.c b/drivers/lcd/tft/hw/ILI9328.c index 347d410..aba75c2 100644 --- a/drivers/lcd/tft/hw/ILI9328.c +++ b/drivers/lcd/tft/hw/ILI9328.c @@ -43,6 +43,9 @@ #include "core/systick/systick.h" #include "drivers/lcd/tft/touchscreen.h" +// Uncomment this to use faster inline methods, but requires more flash +#define ILI9238_USE_INLINE_METHODS (1) + static volatile lcdOrientation_t lcdOrientation = LCD_ORIENTATION_PORTRAIT; static lcdProperties_t ili9328Properties = { 240, 320, TRUE, TRUE, TRUE }; @@ -55,6 +58,7 @@ static lcdProperties_t ili9328Properties = { 240, 320, TRUE, TRUE, TRUE }; @brief Causes a brief delay (10 ticks per unit) */ /**************************************************************************/ +#if !defined ILI9238_USE_INLINE_METHODS void ili9328Delay(unsigned int t) { unsigned char t1; @@ -64,12 +68,16 @@ void ili9328Delay(unsigned int t) __asm("nop"); } } +#else +static inline void ili9328Delay(unsigned int t) { unsigned char t1; while(t--) for ( t1=10; t1 > 0; t1-- ) { __asm("nop"); } } +#endif /**************************************************************************/ /*! @brief Writes the supplied 16-bit command using an 8-bit interface */ /**************************************************************************/ +#if !defined ILI9238_USE_INLINE_METHODS void ili9328WriteCmd(uint16_t command) { // Compiled with -Os on GCC 4.4 this works out to 25 cycles @@ -87,12 +95,16 @@ void ili9328WriteCmd(uint16_t command) CLR_WR; SET_WR_CS; // Saves 7 commands compared to "SET_WR; SET_CS;" } +#else +static inline void ili9328WriteCmd(uint16_t command) { CLR_CS_CD_SET_RD_WR; ILI9328_GPIO2DATA_DATA = (command >> (8 - ILI9328_DATA_OFFSET)); CLR_WR; SET_WR; ILI9328_GPIO2DATA_DATA = command << ILI9328_DATA_OFFSET; CLR_WR; SET_WR_CS; } +#endif /**************************************************************************/ /*! @brief Writes the supplied 16-bit data using an 8-bit interface */ /**************************************************************************/ +#if !defined ILI9238_USE_INLINE_METHODS void ili9328WriteData(uint16_t data) { CLR_CS_SET_CD_RD_WR; // Saves 18 commands compared to SET_CD; SET_RD; SET_WR; CLR_CS" @@ -103,6 +115,9 @@ void ili9328WriteData(uint16_t data) CLR_WR; SET_WR_CS; // Saves 7 commands compared to "SET_WR, SET_CS;" } +#else +static inline void ili9328WriteData(uint16_t data) { CLR_CS_SET_CD_RD_WR; ILI9328_GPIO2DATA_DATA = (data >> (8 - ILI9328_DATA_OFFSET)); CLR_WR; SET_WR; ILI9328_GPIO2DATA_DATA = data << ILI9328_DATA_OFFSET; CLR_WR; SET_WR_CS; } +#endif /**************************************************************************/ /*! @@ -184,6 +199,7 @@ uint16_t ili9328Type(void) @brief Sets the cursor to the specified X/Y position */ /**************************************************************************/ +#if !defined ILI9238_USE_INLINE_METHODS void ili9328SetCursor(uint16_t x, uint16_t y) { uint16_t al, ah; @@ -202,6 +218,9 @@ void ili9328SetCursor(uint16_t x, uint16_t y) ili9328Command(ILI9328_COMMANDS_HORIZONTALGRAMADDRESSSET, al); ili9328Command(ILI9328_COMMANDS_VERTICALGRAMADDRESSSET, ah); } +#else +static inline void ili9328SetCursor(uint16_t x, uint16_t y) { uint16_t al, ah; if (lcdOrientation == LCD_ORIENTATION_LANDSCAPE) { al = y; ah = x; } else { al = x; ah = y; }; ili9328WriteCmd(ILI9328_COMMANDS_HORIZONTALGRAMADDRESSSET); ili9328WriteData(al); ili9328WriteCmd(ILI9328_COMMANDS_VERTICALGRAMADDRESSSET); ili9328WriteData(ah); } +#endif /**************************************************************************/ /*! diff --git a/drivers/lcd/tft/touchscreen.c b/drivers/lcd/tft/touchscreen.c index 20e9a19..4d4a2cd 100644 --- a/drivers/lcd/tft/touchscreen.c +++ b/drivers/lcd/tft/touchscreen.c @@ -213,7 +213,7 @@ tsTouchData_t tsRenderCalibrationScreen(uint16_t x, uint16_t y, uint16_t radius) @note This is based on the public domain touch screen calibration code written by Carlos E. Vidales (copyright (c) 2001). - For more inforormation, see the following app notes: + For more information, see the following app notes: - AN2173 - Touch Screen Control and Calibration Svyatoslav Paliy, Cypress Microsystems @@ -262,7 +262,6 @@ int setCalibrationMatrix( tsPoint_t * displayPtr, tsPoint_t * screenPtr, tsMatri eepromWriteS32(CFG_EEPROM_TOUCHSCREEN_CAL_DN, matrixPtr->Dn); eepromWriteS32(CFG_EEPROM_TOUCHSCREEN_CAL_EN, matrixPtr->En); eepromWriteS32(CFG_EEPROM_TOUCHSCREEN_CAL_FN, matrixPtr->Fn); - eepromWriteS32(CFG_EEPROM_TOUCHSCREEN_CAL_FN, matrixPtr->Fn); eepromWriteS32(CFG_EEPROM_TOUCHSCREEN_CAL_DIVIDER, matrixPtr->Divider); eepromWriteU8(CFG_EEPROM_TOUCHSCREEN_CALIBRATED, 1); } diff --git a/drivers/rtc/isl12022m/isl12022m.c b/drivers/rtc/isl12022m/isl12022m.c index ed2d0f8..fbb2275 100644 --- a/drivers/rtc/isl12022m/isl12022m.c +++ b/drivers/rtc/isl12022m/isl12022m.c @@ -46,8 +46,6 @@ extern volatile uint8_t I2CMasterBuffer[I2C_BUFSIZE]; extern volatile uint8_t I2CSlaveBuffer[I2C_BUFSIZE]; extern volatile uint32_t I2CReadLength, I2CWriteLength; -uint8_t monthday[12]={31,28,31,30,31,30,31,31,30,31,30,31}; - static bool _isl12022mInitialised = false; /**************************************************************************/ diff --git a/lpc134x.h b/lpc134x.h index 9da8fcb..cb41088 100644 --- a/lpc134x.h +++ b/lpc134x.h @@ -232,45 +232,45 @@ subsystem. Note that the USB subsystem has its own dedicated PLL. The PLL can produce a clock up to the maximum allowed for the CPU, which is 72 MHz. */ -#define SCB_PLLCTRL_MULT_1 ((unsigned int) 0x00000000) -#define SCB_PLLCTRL_MULT_2 ((unsigned int) 0x00000001) -#define SCB_PLLCTRL_MULT_3 ((unsigned int) 0x00000002) -#define SCB_PLLCTRL_MULT_4 ((unsigned int) 0x00000003) -#define SCB_PLLCTRL_MULT_5 ((unsigned int) 0x00000004) -#define SCB_PLLCTRL_MULT_6 ((unsigned int) 0x00000005) -#define SCB_PLLCTRL_MULT_7 ((unsigned int) 0x00000006) -#define SCB_PLLCTRL_MULT_8 ((unsigned int) 0x00000007) -#define SCB_PLLCTRL_MULT_9 ((unsigned int) 0x00000008) -#define SCB_PLLCTRL_MULT_10 ((unsigned int) 0x00000009) -#define SCB_PLLCTRL_MULT_11 ((unsigned int) 0x0000000A) -#define SCB_PLLCTRL_MULT_12 ((unsigned int) 0x0000000B) -#define SCB_PLLCTRL_MULT_13 ((unsigned int) 0x0000000C) -#define SCB_PLLCTRL_MULT_14 ((unsigned int) 0x0000000D) -#define SCB_PLLCTRL_MULT_15 ((unsigned int) 0x0000000E) -#define SCB_PLLCTRL_MULT_16 ((unsigned int) 0x0000000F) -#define SCB_PLLCTRL_MULT_17 ((unsigned int) 0x00000010) -#define SCB_PLLCTRL_MULT_18 ((unsigned int) 0x00000011) -#define SCB_PLLCTRL_MULT_19 ((unsigned int) 0x00000012) -#define SCB_PLLCTRL_MULT_20 ((unsigned int) 0x00000013) -#define SCB_PLLCTRL_MULT_21 ((unsigned int) 0x00000014) -#define SCB_PLLCTRL_MULT_22 ((unsigned int) 0x00000015) -#define SCB_PLLCTRL_MULT_23 ((unsigned int) 0x00000016) -#define SCB_PLLCTRL_MULT_24 ((unsigned int) 0x00000017) -#define SCB_PLLCTRL_MULT_25 ((unsigned int) 0x00000018) -#define SCB_PLLCTRL_MULT_26 ((unsigned int) 0x00000019) -#define SCB_PLLCTRL_MULT_27 ((unsigned int) 0x0000001A) -#define SCB_PLLCTRL_MULT_28 ((unsigned int) 0x0000001B) -#define SCB_PLLCTRL_MULT_29 ((unsigned int) 0x0000001C) -#define SCB_PLLCTRL_MULT_30 ((unsigned int) 0x0000001D) -#define SCB_PLLCTRL_MULT_31 ((unsigned int) 0x0000001E) -#define SCB_PLLCTRL_MULT_32 ((unsigned int) 0x0000001F) -#define SCB_PLLCTRL_MULT_MASK ((unsigned int) 0x0000001F) -#define SCB_PLLCTRL_DIV_2 ((unsigned int) 0x00000000) -#define SCB_PLLCTRL_DIV_4 ((unsigned int) 0x00000020) -#define SCB_PLLCTRL_DIV_8 ((unsigned int) 0x00000040) -#define SCB_PLLCTRL_DIV_16 ((unsigned int) 0x00000060) -#define SCB_PLLCTRL_DIV_BIT (5) -#define SCB_PLLCTRL_DIV_MASK ((unsigned int) 0x00000060) +#define SCB_PLLCTRL_MSEL_1 ((unsigned int) 0x00000000) +#define SCB_PLLCTRL_MSEL_2 ((unsigned int) 0x00000001) +#define SCB_PLLCTRL_MSEL_3 ((unsigned int) 0x00000002) +#define SCB_PLLCTRL_MSEL_4 ((unsigned int) 0x00000003) +#define SCB_PLLCTRL_MSEL_5 ((unsigned int) 0x00000004) +#define SCB_PLLCTRL_MSEL_6 ((unsigned int) 0x00000005) +#define SCB_PLLCTRL_MSEL_7 ((unsigned int) 0x00000006) +#define SCB_PLLCTRL_MSEL_8 ((unsigned int) 0x00000007) +#define SCB_PLLCTRL_MSEL_9 ((unsigned int) 0x00000008) +#define SCB_PLLCTRL_MSEL_10 ((unsigned int) 0x00000009) +#define SCB_PLLCTRL_MSEL_11 ((unsigned int) 0x0000000A) +#define SCB_PLLCTRL_MSEL_12 ((unsigned int) 0x0000000B) +#define SCB_PLLCTRL_MSEL_13 ((unsigned int) 0x0000000C) +#define SCB_PLLCTRL_MSEL_14 ((unsigned int) 0x0000000D) +#define SCB_PLLCTRL_MSEL_15 ((unsigned int) 0x0000000E) +#define SCB_PLLCTRL_MSEL_16 ((unsigned int) 0x0000000F) +#define SCB_PLLCTRL_MSEL_17 ((unsigned int) 0x00000010) +#define SCB_PLLCTRL_MSEL_18 ((unsigned int) 0x00000011) +#define SCB_PLLCTRL_MSEL_19 ((unsigned int) 0x00000012) +#define SCB_PLLCTRL_MSEL_20 ((unsigned int) 0x00000013) +#define SCB_PLLCTRL_MSEL_21 ((unsigned int) 0x00000014) +#define SCB_PLLCTRL_MSEL_22 ((unsigned int) 0x00000015) +#define SCB_PLLCTRL_MSEL_23 ((unsigned int) 0x00000016) +#define SCB_PLLCTRL_MSEL_24 ((unsigned int) 0x00000017) +#define SCB_PLLCTRL_MSEL_25 ((unsigned int) 0x00000018) +#define SCB_PLLCTRL_MSEL_26 ((unsigned int) 0x00000019) +#define SCB_PLLCTRL_MSEL_27 ((unsigned int) 0x0000001A) +#define SCB_PLLCTRL_MSEL_28 ((unsigned int) 0x0000001B) +#define SCB_PLLCTRL_MSEL_29 ((unsigned int) 0x0000001C) +#define SCB_PLLCTRL_MSEL_30 ((unsigned int) 0x0000001D) +#define SCB_PLLCTRL_MSEL_31 ((unsigned int) 0x0000001E) +#define SCB_PLLCTRL_MSEL_32 ((unsigned int) 0x0000001F) +#define SCB_PLLCTRL_MSEL_MASK ((unsigned int) 0x0000001F) +#define SCB_PLLCTRL_PSEL_2 ((unsigned int) 0x00000000) +#define SCB_PLLCTRL_PSEL_4 ((unsigned int) 0x00000020) +#define SCB_PLLCTRL_PSEL_8 ((unsigned int) 0x00000040) +#define SCB_PLLCTRL_PSEL_16 ((unsigned int) 0x00000060) +#define SCB_PLLCTRL_PSEL_BIT (5) +#define SCB_PLLCTRL_PSEL_MASK ((unsigned int) 0x00000060) #define SCB_PLLCTRL_DIRECT_MASK ((unsigned int) 0x00000080) // Direct CCO clock output control #define SCB_PLLCTRL_BYPASS_MASK ((unsigned int) 0x00000100) // Input clock bypass control #define SCB_PLLCTRL_MASK ((unsigned int) 0x000001FF) @@ -1797,7 +1797,7 @@ #define IOCON_SWDIO_PIO1_3_FUNC_SWDIO ((unsigned int) 0x00000000) #define IOCON_SWDIO_PIO1_3_FUNC_GPIO ((unsigned int) 0x00000001) #define IOCON_SWDIO_PIO1_3_FUNC_AD4 ((unsigned int) 0x00000002) -#define IOCON_SWDIO_PIO1_3_FUNC_CT32B1_MAT2 ((unsigned int) 0x00000004) +#define IOCON_SWDIO_PIO1_3_FUNC_CT32B1_MAT2 ((unsigned int) 0x00000003) #define IOCON_SWDIO_PIO1_3_HYS_MASK ((unsigned int) 0x00000020) #define IOCON_SWDIO_PIO1_3_HYS_DISABLE ((unsigned int) 0x00000000) #define IOCON_SWDIO_PIO1_3_HYS_ENABLE ((unsigned int) 0x00000020) diff --git a/projectconfig.h b/projectconfig.h index 1252ef0..edee264 100644 --- a/projectconfig.h +++ b/projectconfig.h @@ -129,7 +129,7 @@ -----------------------------------------------------------------------*/ #define CFG_FIRMWARE_VERSION_MAJOR (0) #define CFG_FIRMWARE_VERSION_MINOR (9) - #define CFG_FIRMWARE_VERSION_REVISION (3) + #define CFG_FIRMWARE_VERSION_REVISION (5) /*=========================================================================*/ diff --git a/tools/dotfactory/OutputConfigs.xml b/tools/dotfactory/OutputConfigs.xml index a8160a8..727deee 100644 --- a/tools/dotfactory/OutputConfigs.xml +++ b/tools/dotfactory/OutputConfigs.xml @@ -24,7 +24,7 @@ DisplayInBytes DisplayInBits true - 8 + 5 const uint8_t {0}Bitmaps const FONT_CHAR_INFO {0}Descriptors const FONT_INFO {0}FontInfo -- 2.20.1