OpenOCD makefile integration and Charger IC initialization fixes. (#258)
* Makefile: start openocd from gdb, boot no boot version. * bq25896: reset before readout. Cleanup.
This commit is contained in:
		
							parent
							
								
									884dba647a
								
							
						
					
					
						commit
						228055e4eb
					
				| @ -5,7 +5,7 @@ FW_ADDRESS		= 0x08008000 | |||||||
| OS_OFFSET		= 0x00008000 | OS_OFFSET		= 0x00008000 | ||||||
| FLASH_ADDRESS	= 0x08000000 | FLASH_ADDRESS	= 0x08000000 | ||||||
| 
 | 
 | ||||||
| DEBUG_AGENT		= openocd -f interface/stlink.cfg -c "transport select hla_swd" -f target/stm32l4x.cfg -c "init" -c "adapter speed 4000" | OPENOCD_OPTS	= -f interface/stlink.cfg -c "transport select hla_swd" -f target/stm32l4x.cfg -c "init" -c "adapter speed 4000" | ||||||
| BOOT_CFLAGS		= -DBOOT_ADDRESS=$(BOOT_ADDRESS) -DFW_ADDRESS=$(FW_ADDRESS) -DOS_OFFSET=$(OS_OFFSET) | BOOT_CFLAGS		= -DBOOT_ADDRESS=$(BOOT_ADDRESS) -DFW_ADDRESS=$(FW_ADDRESS) -DOS_OFFSET=$(OS_OFFSET) | ||||||
| MCU_FLAGS		= -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard | MCU_FLAGS		= -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ FW_ADDRESS		= 0x08008000 | |||||||
| OS_OFFSET		= 0x00008000 | OS_OFFSET		= 0x00008000 | ||||||
| FLASH_ADDRESS	= 0x08000000 | FLASH_ADDRESS	= 0x08000000 | ||||||
| 
 | 
 | ||||||
| DEBUG_AGENT		= openocd -f interface/stlink.cfg -c "transport select hla_swd" -f target/stm32wbx.cfg -c "init" -c "adapter speed 4000" | OPENOCD_OPTS	= -f interface/stlink.cfg -c "transport select hla_swd" -f target/stm32wbx.cfg -c "init" -c "adapter speed 4000" | ||||||
| BOOT_CFLAGS		= -DBOOT_ADDRESS=$(BOOT_ADDRESS) -DFW_ADDRESS=$(FW_ADDRESS) -DOS_OFFSET=$(OS_OFFSET) | BOOT_CFLAGS		= -DBOOT_ADDRESS=$(BOOT_ADDRESS) -DFW_ADDRESS=$(FW_ADDRESS) -DOS_OFFSET=$(OS_OFFSET) | ||||||
| MCU_FLAGS		= -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard | MCU_FLAGS		= -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| TOOLCHAIN = arm | TOOLCHAIN = arm | ||||||
| 
 | 
 | ||||||
| DEBUG_AGENT		= openocd -f interface/stlink.cfg -c "transport select hla_swd" -f target/stm32l4x.cfg -c "init" -c "adapter speed 4000" | OPENOCD_OPTS	= -f interface/stlink.cfg -c "transport select hla_swd" -f target/stm32l4x.cfg -c "init" -c "adapter speed 4000" | ||||||
| 
 | 
 | ||||||
| BOOT_ADDRESS	= 0x08000000 | BOOT_ADDRESS	= 0x08000000 | ||||||
| FW_ADDRESS		= 0x08008000 | FW_ADDRESS		= 0x08008000 | ||||||
|  | |||||||
| @ -55,7 +55,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */ | |||||||
| /* Specify the memory areas */ | /* Specify the memory areas */ | ||||||
| MEMORY | MEMORY | ||||||
| { | { | ||||||
| FLASH (rx)                 : ORIGIN = 0x08008000, LENGTH = 480K | FLASH (rx)                 : ORIGIN = 0x08000000, LENGTH = 512K | ||||||
| RAM1 (xrw)                 : ORIGIN = 0x20000004, LENGTH = 0x2FFFC | RAM1 (xrw)                 : ORIGIN = 0x20000004, LENGTH = 0x2FFFC | ||||||
| RAM_SHARED (xrw)           : ORIGIN = 0x20030000, LENGTH = 10K | RAM_SHARED (xrw)           : ORIGIN = 0x20030000, LENGTH = 10K | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										187
									
								
								firmware/targets/f3/stm32wb55xx_flash_cm4_boot.ld
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								firmware/targets/f3/stm32wb55xx_flash_cm4_boot.ld
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,187 @@ | |||||||
|  | /** | ||||||
|  | ***************************************************************************** | ||||||
|  | ** | ||||||
|  | **  File        : stm32wb55xx_flash_cm4.ld | ||||||
|  | ** | ||||||
|  | **  Abstract    : System Workbench Minimal System calls file | ||||||
|  | ** | ||||||
|  | ** 		          For more information about which c-functions | ||||||
|  | **                need which of these lowlevel functions | ||||||
|  | **                please consult the Newlib libc-manual | ||||||
|  | ** | ||||||
|  | **  Environment : System Workbench for MCU | ||||||
|  | ** | ||||||
|  | **  Distribution: The file is distributed “as is,” without any warranty | ||||||
|  | **                of any kind. | ||||||
|  | ** | ||||||
|  | ***************************************************************************** | ||||||
|  | ** | ||||||
|  | ** <h2><center>© COPYRIGHT(c) 2019 Ac6</center></h2> | ||||||
|  | ** | ||||||
|  | ** Redistribution and use in source and binary forms, with or without modification, | ||||||
|  | ** are permitted provided that the following conditions are met: | ||||||
|  | **   1. Redistributions of source code must retain the above copyright notice, | ||||||
|  | **      this list of conditions and the following disclaimer. | ||||||
|  | **   2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | **      this list of conditions and the following disclaimer in the documentation | ||||||
|  | **      and/or other materials provided with the distribution. | ||||||
|  | **   3. Neither the name of Ac6 nor the names of its contributors | ||||||
|  | **      may be used to endorse or promote products derived from this software | ||||||
|  | **      without specific prior written permission. | ||||||
|  | ** | ||||||
|  | ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  | ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  | ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  | ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||||
|  | ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||||
|  | ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||||
|  | ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||||
|  | ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | ** | ||||||
|  | ***************************************************************************** | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /* Entry Point */ | ||||||
|  | ENTRY(Reset_Handler) | ||||||
|  | 
 | ||||||
|  | /* Highest address of the user mode stack */ | ||||||
|  | _estack = 0x20030000;    /* end of RAM */ | ||||||
|  | /* Generate a link error if heap and stack don't fit into RAM */ | ||||||
|  | _Min_Heap_Size = 0x200;      /* required amount of heap  */ | ||||||
|  | _Min_Stack_Size = 0x400; /* required amount of stack */ | ||||||
|  | 
 | ||||||
|  | /* Specify the memory areas */ | ||||||
|  | MEMORY | ||||||
|  | { | ||||||
|  | FLASH (rx)                 : ORIGIN = 0x08008000, LENGTH = 480K | ||||||
|  | RAM1 (xrw)                 : ORIGIN = 0x20000004, LENGTH = 0x2FFFC | ||||||
|  | RAM_SHARED (xrw)           : ORIGIN = 0x20030000, LENGTH = 10K | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Define output sections */ | ||||||
|  | SECTIONS | ||||||
|  | { | ||||||
|  |   /* The startup code goes first into FLASH */ | ||||||
|  |   .isr_vector : | ||||||
|  |   { | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     KEEP(*(.isr_vector)) /* Startup code */ | ||||||
|  |     . = ALIGN(4); | ||||||
|  |   } >FLASH | ||||||
|  | 
 | ||||||
|  |   /* The program code and other data goes into FLASH */ | ||||||
|  |   .text : | ||||||
|  |   { | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     *(.text)           /* .text sections (code) */ | ||||||
|  |     *(.text*)          /* .text* sections (code) */ | ||||||
|  |     *(.glue_7)         /* glue arm to thumb code */ | ||||||
|  |     *(.glue_7t)        /* glue thumb to arm code */ | ||||||
|  |     *(.eh_frame) | ||||||
|  | 
 | ||||||
|  |     KEEP (*(.init)) | ||||||
|  |     KEEP (*(.fini)) | ||||||
|  | 
 | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     _etext = .;        /* define a global symbols at end of code */ | ||||||
|  |   } >FLASH | ||||||
|  | 
 | ||||||
|  |   /* Constant data goes into FLASH */ | ||||||
|  |   .rodata : | ||||||
|  |   { | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     *(.rodata)         /* .rodata sections (constants, strings, etc.) */ | ||||||
|  |     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */ | ||||||
|  |     . = ALIGN(4); | ||||||
|  |   } >FLASH | ||||||
|  | 
 | ||||||
|  |   .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH | ||||||
|  |   .ARM : { | ||||||
|  |     __exidx_start = .; | ||||||
|  |     *(.ARM.exidx*) | ||||||
|  |     __exidx_end = .; | ||||||
|  |   } >FLASH | ||||||
|  | 
 | ||||||
|  |   .preinit_array     : | ||||||
|  |   { | ||||||
|  |     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||||
|  |     KEEP (*(.preinit_array*)) | ||||||
|  |     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||||
|  |   } >FLASH | ||||||
|  |   .init_array : | ||||||
|  |   { | ||||||
|  |     PROVIDE_HIDDEN (__init_array_start = .); | ||||||
|  |     KEEP (*(SORT(.init_array.*))) | ||||||
|  |     KEEP (*(.init_array*)) | ||||||
|  |     PROVIDE_HIDDEN (__init_array_end = .); | ||||||
|  |   } >FLASH | ||||||
|  |   .fini_array : | ||||||
|  |   { | ||||||
|  |     PROVIDE_HIDDEN (__fini_array_start = .); | ||||||
|  |     KEEP (*(SORT(.fini_array.*))) | ||||||
|  |     KEEP (*(.fini_array*)) | ||||||
|  |     PROVIDE_HIDDEN (__fini_array_end = .); | ||||||
|  |   } >FLASH | ||||||
|  | 
 | ||||||
|  |   /* used by the startup to initialize data */ | ||||||
|  |   _sidata = LOADADDR(.data); | ||||||
|  | 
 | ||||||
|  |   /* Initialized data sections goes into RAM, load LMA copy after code */ | ||||||
|  |   .data :  | ||||||
|  |   { | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     _sdata = .;        /* create a global symbol at data start */ | ||||||
|  |     *(.data)           /* .data sections */ | ||||||
|  |     *(.data*)          /* .data* sections */ | ||||||
|  | 
 | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     _edata = .;        /* define a global symbol at data end */ | ||||||
|  |   } >RAM1 AT> FLASH | ||||||
|  | 
 | ||||||
|  |    | ||||||
|  |   /* Uninitialized data section */ | ||||||
|  |   . = ALIGN(4); | ||||||
|  |   .bss : | ||||||
|  |   { | ||||||
|  |     /* This is used by the startup in order to initialize the .bss secion */ | ||||||
|  |     _sbss = .;         /* define a global symbol at bss start */ | ||||||
|  |     __bss_start__ = _sbss; | ||||||
|  |     *(.bss) | ||||||
|  |     *(.bss*) | ||||||
|  |     *(COMMON) | ||||||
|  | 
 | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     _ebss = .;         /* define a global symbol at bss end */ | ||||||
|  |     __bss_end__ = _ebss; | ||||||
|  |   } >RAM1 | ||||||
|  | 
 | ||||||
|  |   /* User_heap_stack section, used to check that there is enough RAM left */ | ||||||
|  |   ._user_heap_stack : | ||||||
|  |   { | ||||||
|  |     . = ALIGN(8); | ||||||
|  |     PROVIDE ( end = . ); | ||||||
|  |     PROVIDE ( _end = . ); | ||||||
|  |     . = . + _Min_Heap_Size; | ||||||
|  |     . = . + _Min_Stack_Size; | ||||||
|  |     . = ALIGN(8); | ||||||
|  |   } >RAM1 | ||||||
|  | 
 | ||||||
|  |    | ||||||
|  | 
 | ||||||
|  |   /* Remove information from the standard libraries */ | ||||||
|  |   /DISCARD/ : | ||||||
|  |   { | ||||||
|  |     libc.a ( * ) | ||||||
|  |     libm.a ( * ) | ||||||
|  |     libgcc.a ( * ) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   .ARM.attributes 0       : { *(.ARM.attributes) } | ||||||
|  |    MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED | ||||||
|  |    MB_MEM1 (NOLOAD)       : { *(MB_MEM1) } >RAM_SHARED | ||||||
|  |    MB_MEM2 (NOLOAD)       : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| @ -1,6 +1,6 @@ | |||||||
| TOOLCHAIN = arm | TOOLCHAIN = arm | ||||||
| 
 | 
 | ||||||
| DEBUG_AGENT		= openocd -f interface/stlink.cfg -c "transport select hla_swd" -f target/stm32wbx.cfg -c "init" -c "adapter speed 4000" | OPENOCD_OPTS	= -f interface/stlink.cfg -c "transport select hla_swd" -f target/stm32wbx.cfg -c "init" -c "adapter speed 4000" | ||||||
| 
 | 
 | ||||||
| BOOT_ADDRESS	= 0x08000000 | BOOT_ADDRESS	= 0x08000000 | ||||||
| FW_ADDRESS		= 0x08008000 | FW_ADDRESS		= 0x08008000 | ||||||
| @ -94,7 +94,7 @@ CFLAGS			+= \ | |||||||
| ifeq ($(NO_BOOTLOADER), 1) | ifeq ($(NO_BOOTLOADER), 1) | ||||||
| LDFLAGS			+= -T$(MXPROJECT_DIR)/stm32wb55xx_flash_cm4_no_boot.ld | LDFLAGS			+= -T$(MXPROJECT_DIR)/stm32wb55xx_flash_cm4_no_boot.ld | ||||||
| else | else | ||||||
| LDFLAGS			+= -T$(MXPROJECT_DIR)/stm32wb55xx_flash_cm4.ld | LDFLAGS			+= -T$(MXPROJECT_DIR)/stm32wb55xx_flash_cm4_boot.ld | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
| CFLAGS += \
 | CFLAGS += \
 | ||||||
|  | |||||||
| @ -61,14 +61,20 @@ typedef struct { | |||||||
| static bq25896_regs_t bq25896_regs; | static bq25896_regs_t bq25896_regs; | ||||||
| 
 | 
 | ||||||
| void bq25896_init() { | void bq25896_init() { | ||||||
|     bq25896_read(0x00, (uint8_t*)&bq25896_regs, sizeof(bq25896_regs)); |  | ||||||
| 
 |  | ||||||
|     bq25896_regs.r09.BATFET_DIS = 0; |  | ||||||
|     bq25896_write_reg(0x09, (uint8_t*)&bq25896_regs.r09); |  | ||||||
| 
 |  | ||||||
|     bq25896_regs.r14.REG_RST = 1; |     bq25896_regs.r14.REG_RST = 1; | ||||||
|     bq25896_write_reg(0x14, (uint8_t*)&bq25896_regs.r14); |     bq25896_write_reg(0x14, (uint8_t*)&bq25896_regs.r14); | ||||||
| 
 | 
 | ||||||
|  |     // Readout all registers
 | ||||||
|  |     bq25896_read(0x00, (uint8_t*)&bq25896_regs, sizeof(bq25896_regs)); | ||||||
|  | 
 | ||||||
|  |     // Poll ADC forever
 | ||||||
|  |     bq25896_regs.r02.CONV_START = 1; | ||||||
|  |     bq25896_regs.r02.CONV_RATE = 1; | ||||||
|  |     bq25896_write_reg(0x02, (uint8_t*)&bq25896_regs.r02); | ||||||
|  | 
 | ||||||
|  |     bq25896_regs.r07.WATCHDOG = WatchdogDisable; | ||||||
|  |     bq25896_write_reg(0x07, (uint8_t*)&bq25896_regs.r07); | ||||||
|  | 
 | ||||||
|     bq25896_read(0x00, (uint8_t*)&bq25896_regs, sizeof(bq25896_regs)); |     bq25896_read(0x00, (uint8_t*)&bq25896_regs, sizeof(bq25896_regs)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -78,6 +84,7 @@ void bq25896_poweroff() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool bq25896_is_charging() { | bool bq25896_is_charging() { | ||||||
|  |     bq25896_read(0x00, (uint8_t*)&bq25896_regs, sizeof(bq25896_regs)); | ||||||
|     bq25896_read_reg(0x0B, (uint8_t*)&bq25896_regs.r0B); |     bq25896_read_reg(0x0B, (uint8_t*)&bq25896_regs.r0B); | ||||||
|     return bq25896_regs.r0B.CHRG_STAT != ChrgStatNo; |     return bq25896_regs.r0B.CHRG_STAT != ChrgStatNo; | ||||||
| } | } | ||||||
| @ -92,16 +99,7 @@ void bq25896_disable_otg() { | |||||||
|     bq25896_write_reg(0x03, (uint8_t*)&bq25896_regs.r03); |     bq25896_write_reg(0x03, (uint8_t*)&bq25896_regs.r03); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void bq25896_adc_sample() { |  | ||||||
|     bq25896_regs.r02.CONV_START = 1; |  | ||||||
|     bq25896_write_reg(0x02, (uint8_t*)&bq25896_regs.r02); |  | ||||||
|     while(bq25896_regs.r02.CONV_START == 1) { |  | ||||||
|         bq25896_read_reg(0x02, (uint8_t*)&bq25896_regs.r02); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| uint16_t bq25896_get_vbus_voltage() { | uint16_t bq25896_get_vbus_voltage() { | ||||||
|     bq25896_adc_sample(); |  | ||||||
|     bq25896_read_reg(0x11, (uint8_t*)&bq25896_regs.r11); |     bq25896_read_reg(0x11, (uint8_t*)&bq25896_regs.r11); | ||||||
|     if (bq25896_regs.r11.VBUS_GD) { |     if (bq25896_regs.r11.VBUS_GD) { | ||||||
|         return (uint16_t)bq25896_regs.r11.VBUSV * 100 + 2600; |         return (uint16_t)bq25896_regs.r11.VBUSV * 100 + 2600; | ||||||
| @ -111,25 +109,21 @@ uint16_t bq25896_get_vbus_voltage() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| uint16_t bq25896_get_vsys_voltage() { | uint16_t bq25896_get_vsys_voltage() { | ||||||
|     bq25896_adc_sample(); |  | ||||||
|     bq25896_read_reg(0x0F, (uint8_t*)&bq25896_regs.r0F); |     bq25896_read_reg(0x0F, (uint8_t*)&bq25896_regs.r0F); | ||||||
|     return (uint16_t)bq25896_regs.r0F.SYSV * 20 + 2304; |     return (uint16_t)bq25896_regs.r0F.SYSV * 20 + 2304; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| uint16_t bq25896_get_vbat_voltage() { | uint16_t bq25896_get_vbat_voltage() { | ||||||
|     bq25896_adc_sample(); |  | ||||||
|     bq25896_read_reg(0x0E, (uint8_t*)&bq25896_regs.r0E); |     bq25896_read_reg(0x0E, (uint8_t*)&bq25896_regs.r0E); | ||||||
|     return (uint16_t)bq25896_regs.r0E.BATV * 20 + 2304; |     return (uint16_t)bq25896_regs.r0E.BATV * 20 + 2304; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| uint16_t bq25896_get_vbat_current() { | uint16_t bq25896_get_vbat_current() { | ||||||
|     bq25896_adc_sample(); |  | ||||||
|     bq25896_read_reg(0x12, (uint8_t*)&bq25896_regs.r12); |     bq25896_read_reg(0x12, (uint8_t*)&bq25896_regs.r12); | ||||||
|     return (uint16_t)bq25896_regs.r12.ICHGR * 50; |     return (uint16_t)bq25896_regs.r12.ICHGR * 50; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| uint32_t bq25896_get_ntc_mpct() { | uint32_t bq25896_get_ntc_mpct() { | ||||||
|     bq25896_adc_sample(); |  | ||||||
|     bq25896_read_reg(0x10, (uint8_t*)&bq25896_regs.r10); |     bq25896_read_reg(0x10, (uint8_t*)&bq25896_regs.r10); | ||||||
|     return (uint32_t)bq25896_regs.r10.TSPCT * 465+21000; |     return (uint32_t)bq25896_regs.r10.TSPCT * 465+21000; | ||||||
| } | } | ||||||
|  | |||||||
| @ -9,12 +9,6 @@ | |||||||
| 
 | 
 | ||||||
| #define BQ25896_ADDRESS 0xD6 | #define BQ25896_ADDRESS 0xD6 | ||||||
| 
 | 
 | ||||||
| typedef struct { |  | ||||||
|     uint8_t IINLIM:6;       // Input Current Limit, mA, offset: +100mA
 |  | ||||||
|     bool EN_ILIM:1;         // Enable ILIM Pin
 |  | ||||||
|     bool EN_HIZ:1;          // Enable HIZ Mode
 |  | ||||||
| } REG00; |  | ||||||
| 
 |  | ||||||
| #define IILIM_1600          (1<<5) | #define IILIM_1600          (1<<5) | ||||||
| #define IILIM_800           (1<<4) | #define IILIM_800           (1<<4) | ||||||
| #define IILIM_400           (1<<3) | #define IILIM_400           (1<<3) | ||||||
| @ -23,10 +17,11 @@ typedef struct { | |||||||
| #define IILIM_50            (1<<0) | #define IILIM_50            (1<<0) | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t VINDPM_OS:5;    // Input Voltage Limit Offset, mV
 |     uint8_t IINLIM:6;       // Input Current Limit, mA, offset: +100mA
 | ||||||
|     bool BCOLD:1;           // Boost Mode Cold Temperature Monitor Threshold
 |     bool EN_ILIM:1;         // Enable ILIM Pin
 | ||||||
|     uint8_t BHOT:2;         // Boost Mode Hot Temperature Monitor Threshold
 |     bool EN_HIZ:1;          // Enable HIZ Mode
 | ||||||
| } REG01; | } REG00; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| #define VINDPM_OS_1600      (1<<4) | #define VINDPM_OS_1600      (1<<4) | ||||||
| #define VINDPM_OS_800       (1<<3) | #define VINDPM_OS_800       (1<<3) | ||||||
| @ -34,6 +29,19 @@ typedef struct { | |||||||
| #define VINDPM_OS_200       (1<<1) | #define VINDPM_OS_200       (1<<1) | ||||||
| #define VINDPM_OS_100       (1<<0) | #define VINDPM_OS_100       (1<<0) | ||||||
| 
 | 
 | ||||||
|  | typedef enum { | ||||||
|  |     Bhot34 = 0b00,         // – VBHOT1 Threshold (34.75%) (default)
 | ||||||
|  |     Bhot37 = 0b01,         // – VBHOT0 Threshold (Typ. 37.75%)
 | ||||||
|  |     Bhot31 = 0b10,         // – VBHOT2 Threshold (Typ. 31.25%)
 | ||||||
|  |     BhotDisable = 0b11,    // – Disable boost mode thermal protection
 | ||||||
|  | } Bhot; | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  |     uint8_t VINDPM_OS:5;    // Input Voltage Limit Offset, mV
 | ||||||
|  |     bool BCOLD:1;           // Boost Mode Cold Temperature Monitor Threshold
 | ||||||
|  |     Bhot BHOT:2;            // Boost Mode Hot Temperature Monitor Threshold
 | ||||||
|  | } REG01; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     bool AUTO_DPDM_EN:1;    // Automatic Input Detection Enable
 |     bool AUTO_DPDM_EN:1;    // Automatic Input Detection Enable
 | ||||||
| @ -46,6 +54,10 @@ typedef struct { | |||||||
| } REG02; | } REG02; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | #define SYS_MIN_400         (1<<2) | ||||||
|  | #define SYS_MIN_200         (1<<1) | ||||||
|  | #define SYS_MIN_100         (1<<0) | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     bool MIN_VBAT_SEL:1;    // Minimum Battery Voltage (falling) to exit boost mode
 |     bool MIN_VBAT_SEL:1;    // Minimum Battery Voltage (falling) to exit boost mode
 | ||||||
|     uint8_t SYS_MIN:3;      // Minimum System Voltage Limit, mV, offset: +3000mV
 |     uint8_t SYS_MIN:3;      // Minimum System Voltage Limit, mV, offset: +3000mV
 | ||||||
| @ -55,14 +67,6 @@ typedef struct { | |||||||
|     bool BAT_LOADEN:1;      // Battery Load (IBATLOAD) Enable
 |     bool BAT_LOADEN:1;      // Battery Load (IBATLOAD) Enable
 | ||||||
| } REG03; | } REG03; | ||||||
| 
 | 
 | ||||||
| #define SYS_MIN_400         (1<<2) |  | ||||||
| #define SYS_MIN_200         (1<<1) |  | ||||||
| #define SYS_MIN_100         (1<<0) |  | ||||||
| 
 |  | ||||||
| typedef struct { |  | ||||||
|     uint8_t ICHG:7;         // Fast Charge Current Limit, mA
 |  | ||||||
|     bool EN_PUMPX:1;        // Current pulse control Enable
 |  | ||||||
| } REG04; |  | ||||||
| 
 | 
 | ||||||
| #define ICHG_4096           (1<<6) | #define ICHG_4096           (1<<6) | ||||||
| #define ICHG_2048           (1<<5) | #define ICHG_2048           (1<<5) | ||||||
| @ -73,9 +77,10 @@ typedef struct { | |||||||
| #define ICHG_64             (1<<0) | #define ICHG_64             (1<<0) | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t ITERM:4;        // Termination Current Limit, offset: +64mA
 |     uint8_t ICHG:7;         // Fast Charge Current Limit, mA
 | ||||||
|     uint8_t IPRECHG:4;      // Precharge Current Limit, offset: +64mA
 |     bool EN_PUMPX:1;        // Current pulse control Enable
 | ||||||
| } REG05; | } REG04; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| #define IPRETERM_512        (1<<3) | #define IPRETERM_512        (1<<3) | ||||||
| #define IPRETERM_256        (1<<2) | #define IPRETERM_256        (1<<2) | ||||||
| @ -83,10 +88,10 @@ typedef struct { | |||||||
| #define IPRETERM_64         (1<<0) | #define IPRETERM_64         (1<<0) | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     bool VRECHG:1;          // Battery Recharge Threshold Offset
 |     uint8_t ITERM:4;        // Termination Current Limit, offset: +64mA
 | ||||||
|     bool BATLOWV:1;         // Battery Precharge to Fast Charge Threshold
 |     uint8_t IPRECHG:4;      // Precharge Current Limit, offset: +64mA
 | ||||||
|     uint8_t VREG:6;         // Charge Voltage Limit, offset: +3840mV
 | } REG05; | ||||||
| } REG06; | 
 | ||||||
| 
 | 
 | ||||||
| #define VREG_512            (1<<5) | #define VREG_512            (1<<5) | ||||||
| #define VREG_256            (1<<4) | #define VREG_256            (1<<4) | ||||||
| @ -95,30 +100,36 @@ typedef struct { | |||||||
| #define VREG_32             (1<<1) | #define VREG_32             (1<<1) | ||||||
| #define VREG_16             (1<<0) | #define VREG_16             (1<<0) | ||||||
| 
 | 
 | ||||||
|  | typedef struct { | ||||||
|  |     bool VRECHG:1;          // Battery Recharge Threshold Offset
 | ||||||
|  |     bool BATLOWV:1;         // Battery Precharge to Fast Charge Threshold
 | ||||||
|  |     uint8_t VREG:6;         // Charge Voltage Limit, offset: +3840mV
 | ||||||
|  | } REG06; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef enum { | ||||||
|  |     WatchdogDisable = 0b00, | ||||||
|  |     Watchdog40 = 0b01, | ||||||
|  |     Watchdog80 = 0b10, | ||||||
|  |     Watchdog160 = 0b11, | ||||||
|  | } Watchdog; | ||||||
|  | 
 | ||||||
|  | typedef enum { | ||||||
|  |     ChgTimer5 = 0b00, | ||||||
|  |     ChgTimer8 = 0b01, | ||||||
|  |     ChgTimer12 = 0b10, | ||||||
|  |     ChgTimer20 = 0b11, | ||||||
|  | } ChgTimer; | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     bool JEITA_ISET:1;      // JEITA Low Temperature Current Setting
 |     bool JEITA_ISET:1;      // JEITA Low Temperature Current Setting
 | ||||||
|     uint8_t CHG_TIMER:2;    // Fast Charge Timer Setting
 |     ChgTimer CHG_TIMER:2;    // Fast Charge Timer Setting
 | ||||||
|     bool EN_TIMER:1;        // Charging Safety Timer Enable
 |     bool EN_TIMER:1;        // Charging Safety Timer Enable
 | ||||||
|     uint8_t WATCHDOG:2;     // I2C Watchdog Timer Setting
 |     Watchdog WATCHDOG:2;     // I2C Watchdog Timer Setting
 | ||||||
|     bool STAT_DIS:1;        // STAT Pin Disable
 |     bool STAT_DIS:1;        // STAT Pin Disable
 | ||||||
|     bool EN_TERM:1;         // Charging Termination Enable
 |     bool EN_TERM:1;         // Charging Termination Enable
 | ||||||
| } REG07; | } REG07; | ||||||
| 
 | 
 | ||||||
| #define WATCHDOG_DIS        (0b00) |  | ||||||
| #define WATCHDOG_40         (0b01) |  | ||||||
| #define WATCHDOG_80         (0b10) |  | ||||||
| #define WATCHDOG_160        (0b11) |  | ||||||
| 
 |  | ||||||
| #define CHG_TIMER_5         (0b00) |  | ||||||
| #define CHG_TIMER_8         (0b01) |  | ||||||
| #define CHG_TIMER_12        (0b10) |  | ||||||
| #define CHG_TIMER_20        (0b11) |  | ||||||
| 
 |  | ||||||
| typedef struct { |  | ||||||
|     uint8_t TREG:2;         // Thermal Regulation Threshold
 |  | ||||||
|     uint8_t VCLAMP:3;       // IR Compensation Voltage Clamp
 |  | ||||||
|     uint8_t BAT_COMP:3;     // IR Compensation Resistor Setting 
 |  | ||||||
| } REG08; |  | ||||||
| 
 | 
 | ||||||
| #define BAT_COMP_80         (1<<2) | #define BAT_COMP_80         (1<<2) | ||||||
| #define BAT_COMP_40         (1<<1) | #define BAT_COMP_40         (1<<1) | ||||||
| @ -133,6 +144,13 @@ typedef struct { | |||||||
| #define TREG_100            (0b10) | #define TREG_100            (0b10) | ||||||
| #define TREG_120            (0b11) | #define TREG_120            (0b11) | ||||||
| 
 | 
 | ||||||
|  | typedef struct { | ||||||
|  |     uint8_t TREG:2;         // Thermal Regulation Threshold
 | ||||||
|  |     uint8_t VCLAMP:3;       // IR Compensation Voltage Clamp
 | ||||||
|  |     uint8_t BAT_COMP:3;     // IR Compensation Resistor Setting 
 | ||||||
|  | } REG08; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     bool PUMPX_DN:1;        // Current pulse control voltage down enable
 |     bool PUMPX_DN:1;        // Current pulse control voltage down enable
 | ||||||
|     bool PUMPX_UP:1;        // Current pulse control voltage up enable
 |     bool PUMPX_UP:1;        // Current pulse control voltage up enable
 | ||||||
| @ -144,11 +162,6 @@ typedef struct { | |||||||
|     bool FORCE_ICO:1;       // Force Start Input Current Optimizer 
 |     bool FORCE_ICO:1;       // Force Start Input Current Optimizer 
 | ||||||
| } REG09; | } REG09; | ||||||
| 
 | 
 | ||||||
| typedef struct { |  | ||||||
|     uint8_t BOOST_LIM:3;    // Boost Mode Current Limit
 |  | ||||||
|     bool PFM_OTG_DIS:1;     // PFM mode allowed in boost mode
 |  | ||||||
|     uint8_t BOOSTV:4;       // Boost Mode Voltage Regulation, offset: +4550mV
 |  | ||||||
| } REG0A; |  | ||||||
| 
 | 
 | ||||||
| #define BOOSTV_512          (1<<3) | #define BOOSTV_512          (1<<3) | ||||||
| #define BOOSTV_256          (1<<2) | #define BOOSTV_256          (1<<2) | ||||||
| @ -164,6 +177,12 @@ typedef struct { | |||||||
| #define BOOST_LIM_2150      (0b110) | #define BOOST_LIM_2150      (0b110) | ||||||
| #define BOOST_LIM_RSVD      (0b111) | #define BOOST_LIM_RSVD      (0b111) | ||||||
| 
 | 
 | ||||||
|  | typedef struct { | ||||||
|  |     uint8_t BOOST_LIM:3;    // Boost Mode Current Limit
 | ||||||
|  |     bool PFM_OTG_DIS:1;     // PFM mode allowed in boost mode
 | ||||||
|  |     uint8_t BOOSTV:4;       // Boost Mode Voltage Regulation, offset: +4550mV
 | ||||||
|  | } REG0A; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|     VBusStatNo = 0b000, |     VBusStatNo = 0b000, | ||||||
| @ -187,6 +206,7 @@ typedef struct { | |||||||
|     VBusStat VBUS_STAT:3;    // VBUS Status register
 |     VBusStat VBUS_STAT:3;    // VBUS Status register
 | ||||||
| } REG0B; | } REG0B; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|     ChrgFaultNO = 0b00, |     ChrgFaultNO = 0b00, | ||||||
|     ChrgFaultIN = 0b01, |     ChrgFaultIN = 0b01, | ||||||
| @ -210,10 +230,6 @@ typedef struct { | |||||||
|     bool WATCHDOG_FAULT:1;  // Watchdog Fault Status
 |     bool WATCHDOG_FAULT:1;  // Watchdog Fault Status
 | ||||||
| } REG0C; | } REG0C; | ||||||
| 
 | 
 | ||||||
| typedef struct { |  | ||||||
|     uint8_t VINDPM:7;       // Absolute VINDPM Threshold, offset: +2600mV
 |  | ||||||
|     bool FORCE_VINDPM:1;    // VINDPM Threshold Setting Method
 |  | ||||||
| } REG0D; |  | ||||||
| 
 | 
 | ||||||
| #define VINDPM_6400         (1<<6) | #define VINDPM_6400         (1<<6) | ||||||
| #define VINDPM_3200         (1<<5) | #define VINDPM_3200         (1<<5) | ||||||
| @ -223,37 +239,49 @@ typedef struct { | |||||||
| #define VINDPM_200          (1<<1) | #define VINDPM_200          (1<<1) | ||||||
| #define VINDPM_100          (1<<0) | #define VINDPM_100          (1<<0) | ||||||
| 
 | 
 | ||||||
|  | typedef struct { | ||||||
|  |     uint8_t VINDPM:7;       // Absolute VINDPM Threshold, offset: +2600mV
 | ||||||
|  |     bool FORCE_VINDPM:1;    // VINDPM Threshold Setting Method
 | ||||||
|  | } REG0D; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t BATV:7;         // ADC conversion of Battery Voltage (VBAT), offset: +2304mV
 |     uint8_t BATV:7;         // ADC conversion of Battery Voltage (VBAT), offset: +2304mV
 | ||||||
|     bool THERM_STAT:1;      // Thermal Regulation Status
 |     bool THERM_STAT:1;      // Thermal Regulation Status
 | ||||||
| } REG0E; | } REG0E; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t SYSV:7;         // ADDC conversion of System Voltage (VSYS), offset: +2304mV
 |     uint8_t SYSV:7;         // ADDC conversion of System Voltage (VSYS), offset: +2304mV
 | ||||||
|     uint8_t RES:1;          // Reserved: Always reads 0
 |     uint8_t RES:1;          // Reserved: Always reads 0
 | ||||||
| } REG0F; | } REG0F; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t TSPCT:7;        // ADC conversion of TS Voltage (TS) as percentage of REGN, offset: +21%
 |     uint8_t TSPCT:7;        // ADC conversion of TS Voltage (TS) as percentage of REGN, offset: +21%
 | ||||||
|     uint8_t RES:1;          // Reserved: Always reads 0
 |     uint8_t RES:1;          // Reserved: Always reads 0
 | ||||||
| } REG10; | } REG10; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t VBUSV:7;        // ADC conversion of VBUS voltage (VBUS), offset: +2600mV
 |     uint8_t VBUSV:7;        // ADC conversion of VBUS voltage (VBUS), offset: +2600mV
 | ||||||
|     bool VBUS_GD:1;         // VBUS Good Status
 |     bool VBUS_GD:1;         // VBUS Good Status
 | ||||||
| } REG11; | } REG11; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t ICHGR:7;        // ADC conversion of Charge Current (IBAT) when VBAT > VBATSHORT
 |     uint8_t ICHGR:7;        // ADC conversion of Charge Current (IBAT) when VBAT > VBATSHORT
 | ||||||
|     uint8_t RES:1;          // Reserved: Always reads 0
 |     uint8_t RES:1;          // Reserved: Always reads 0
 | ||||||
| } REG12; | } REG12; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t IDPM_LIM:6;     // Input Current Limit in effect while Input Current Optimizer (ICO) is enabled, offset: 100mA (default)
 |     uint8_t IDPM_LIM:6;     // Input Current Limit in effect while Input Current Optimizer (ICO) is enabled, offset: 100mA (default)
 | ||||||
|     bool IDPM_STAT:1;       // IINDPM Status
 |     bool IDPM_STAT:1;       // IINDPM Status
 | ||||||
|     bool VDPM_STAT:1;       // VINDPM Status
 |     bool VDPM_STAT:1;       // VINDPM Status
 | ||||||
| } REG13; | } REG13; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t DEV_REV:2;      // Device Revision
 |     uint8_t DEV_REV:2;      // Device Revision
 | ||||||
|     bool TS_PROFILE:1;      // Temperature Profile
 |     bool TS_PROFILE:1;      // Temperature Profile
 | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ ASM_SOURCES		= | |||||||
| C_SOURCES		=  | C_SOURCES		=  | ||||||
| CPP_SOURCES		=  | CPP_SOURCES		=  | ||||||
| ASSETS			=  | ASSETS			=  | ||||||
| DEBUG_AGENT		=  | OPENOCD_OPTS	=  | ||||||
| 
 | 
 | ||||||
| CFLAGS			=  | CFLAGS			=  | ||||||
| CPPFLAGS		=  | CPPFLAGS		=  | ||||||
|  | |||||||
| @ -55,11 +55,11 @@ $(OBJ_DIR)/%.o: %.cpp $(OBJ_DIR)/BUILD_FLAGS $(ASSETS) | |||||||
| 	@$(CPP) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ | 	@$(CPP) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ | ||||||
| 
 | 
 | ||||||
| $(OBJ_DIR)/flash: $(OBJ_DIR)/$(PROJECT).bin | $(OBJ_DIR)/flash: $(OBJ_DIR)/$(PROJECT).bin | ||||||
| 	$(DEBUG_AGENT) -c "program $(OBJ_DIR)/$(PROJECT).bin reset exit $(FLASH_ADDRESS)"  | 	openocd $(OPENOCD_OPTS) -c "program $(OBJ_DIR)/$(PROJECT).bin reset exit $(FLASH_ADDRESS)"  | ||||||
| 	touch $@ | 	touch $@ | ||||||
| 
 | 
 | ||||||
| $(OBJ_DIR)/upload: $(OBJ_DIR)/$(PROJECT).bin | $(OBJ_DIR)/upload: $(OBJ_DIR)/$(PROJECT).bin | ||||||
| 	dfu-util -D $(OBJ_DIR)/$(PROJECT).bin -a 0 -s $(FLASH_ADDRESS) -S $(DFU_SERIAL) | 	dfu-util -D $(OBJ_DIR)/$(PROJECT).bin -a 0 -s $(FLASH_ADDRESS) | ||||||
| 	touch $@ | 	touch $@ | ||||||
| 
 | 
 | ||||||
| $(ASSETS): $(ASSETS_SOURCES) | $(ASSETS): $(ASSETS_SOURCES) | ||||||
| @ -71,17 +71,14 @@ flash: $(OBJ_DIR)/flash | |||||||
| upload: $(OBJ_DIR)/upload | upload: $(OBJ_DIR)/upload | ||||||
| 
 | 
 | ||||||
| debug: flash | debug: flash | ||||||
| 	$(DEBUG_AGENT) & echo $$! > $(OBJ_DIR)/agent.PID |  | ||||||
| 	arm-none-eabi-gdb \
 | 	arm-none-eabi-gdb \
 | ||||||
| 		-ex "target extended-remote 127.0.0.1:3333" \
 | 		-ex 'target extended-remote | openocd -c "gdb_port pipe" $(OPENOCD_OPTS)' \
 | ||||||
| 		-ex "set confirm off" \
 | 		-ex "set confirm off" \
 | ||||||
| 		-ex "source ../debug/FreeRTOS/FreeRTOS.py" \
 | 		-ex "source ../debug/FreeRTOS/FreeRTOS.py" \
 | ||||||
| 		-ex "source ../debug/PyCortexMDebug/scripts/gdb.py" \
 | 		-ex "source ../debug/PyCortexMDebug/scripts/gdb.py" \
 | ||||||
| 		-ex "svd_load $(SVD_FILE)" \
 | 		-ex "svd_load $(SVD_FILE)" \
 | ||||||
| 		-ex "compare-sections" \
 | 		-ex "compare-sections" \
 | ||||||
| 		$(OBJ_DIR)/$(PROJECT).elf; \
 | 		$(OBJ_DIR)/$(PROJECT).elf; \
 | ||||||
| 	echo "reset; shutdown;" | nc 127.0.0.1 4444 > /dev/null |  | ||||||
| 	kill `cat $(OBJ_DIR)/agent.PID`; rm $(OBJ_DIR)/agent.PID > /dev/null |  | ||||||
| 
 | 
 | ||||||
| bm_debug: flash | bm_debug: flash | ||||||
| 	set -m; blackmagic & echo $$! > $(OBJ_DIR)/agent.PID | 	set -m; blackmagic & echo $$! > $(OBJ_DIR)/agent.PID | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく