Skip to content

Commit 43c254b

Browse files
sandeepmistrycmaglie
authored andcommitted
Split PMIC and I2C functionality in boot loader to separate files
1 parent ec356b8 commit 43c254b

File tree

5 files changed

+297
-238
lines changed

5 files changed

+297
-238
lines changed

bootloaders/zero/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ LDFLAGS+=-Wl,--warn-common -Wl,--warn-section-align -Wl,--warn-unresolved-symbol
8686
SOURCES= \
8787
board_driver_i2c.c \
8888
board_driver_led.c \
89+
board_driver_pmic.c \
8990
board_driver_serial.c \
9091
board_driver_usb.c \
9192
board_init.c \

bootloaders/zero/board_driver_i2c.c

+4-219
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
#define I2C_SERCOM_APBCMASK PM_APBCMASK_SERCOM0
2929

3030
static uint8_t txBuffer[2];
31-
static uint8_t rxBuffer[1];
31+
uint8_t rxBuffer[1];
3232
static uint8_t txBufferLen = 0;
3333
static uint8_t rxBufferLen = 0;
3434
static uint8_t txAddress;
@@ -327,7 +327,7 @@ static inline bool sendDataMasterWIRE(uint8_t data)
327327
return true;
328328
}
329329

330-
static inline void i2c_init(uint32_t baud) {
330+
void i2c_init(uint32_t baud) {
331331
//Master Mode
332332
initMasterWIRE(baud);
333333
enableWIRE();
@@ -336,7 +336,7 @@ static inline void i2c_init(uint32_t baud) {
336336
pin_set_peripheral_function(PINMUX_PA09C_SERCOM0_PAD1);
337337
}
338338

339-
static inline void i2c_end() {
339+
void i2c_end() {
340340
disableWIRE();
341341
}
342342

@@ -425,219 +425,4 @@ uint8_t i2c_write(uint8_t ucData)
425425
return 1 ;
426426
}
427427

428-
uint8_t readRegister(uint8_t reg) {
429-
i2c_beginTransmission(PMIC_ADDRESS);
430-
i2c_write(reg);
431-
i2c_endTransmission(true);
432-
433-
i2c_requestFrom(PMIC_ADDRESS, 1, true);
434-
return rxBuffer[0];
435-
}
436-
437-
uint8_t writeRegister(uint8_t reg, uint8_t data) {
438-
i2c_beginTransmission(PMIC_ADDRESS);
439-
i2c_write(reg);
440-
i2c_write(data);
441-
i2c_endTransmission(true);
442-
443-
return 2;
444-
}
445-
446-
bool disableWatchdog(void) {
447-
448-
uint8_t DATA = readRegister(CHARGE_TIMER_CONTROL_REGISTER);
449-
writeRegister(CHARGE_TIMER_CONTROL_REGISTER, (DATA & 0b11001110));
450-
return 1;
451-
}
452-
453-
bool setInputVoltageLimit(uint16_t voltage) {
454-
455-
uint8_t DATA = readRegister(INPUT_SOURCE_REGISTER);
456-
uint8_t mask = DATA & 0b10000111;
457-
458-
switch(voltage) {
459-
460-
case 3880:
461-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00000000));
462-
break;
463-
464-
case 3960:
465-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00001000));
466-
break;
467-
468-
case 4040:
469-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00010000));
470-
break;
471-
472-
case 4120:
473-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00011000));
474-
break;
475-
476-
case 4200:
477-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00100000));
478-
break;
479-
480-
case 4280:
481-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00101000));
482-
break;
483-
484-
case 4360:
485-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00110000));
486-
break;
487-
488-
case 4440:
489-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00111000));
490-
break;
491-
492-
case 4520:
493-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b01000000));
494-
break;
495-
496-
case 4600:
497-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b01001000));
498-
break;
499-
500-
case 4680:
501-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b01010000));
502-
break;
503-
504-
case 4760:
505-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b01011000));
506-
break;
507-
508-
case 4840:
509-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b01100000));
510-
break;
511-
512-
case 4920:
513-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b01101000));
514-
break;
515-
516-
case 5000:
517-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b01110000));
518-
break;
519-
520-
case 5080:
521-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b01111000));
522-
break;
523-
524-
default:
525-
return 0; // return error since the value passed didn't match
526-
}
527-
528-
return 1; // value was written successfully
529-
}
530-
531-
bool setInputCurrentLimit(uint16_t current) {
532-
533-
534-
uint8_t DATA = readRegister(INPUT_SOURCE_REGISTER);
535-
uint8_t mask = DATA & 0b11111000;
536-
537-
switch (current) {
538-
539-
case 100:
540-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00000000));
541-
break;
542-
543-
case 150:
544-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00000001));
545-
break;
546-
547-
case 500:
548-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00000010));
549-
break;
550-
551-
case 900:
552-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00000011));
553-
break;
554-
555-
case 1200:
556-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00000100));
557-
break;
558-
559-
case 1500:
560-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00000101));
561-
break;
562-
563-
case 2000:
564-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00000110));
565-
break;
566-
567-
case 3000:
568-
writeRegister(INPUT_SOURCE_REGISTER, (mask | 0b00000111));
569-
break;
570-
571-
default:
572-
return 0; // return error since the value passed didn't match
573-
}
574-
575-
return 1; // value was written successfully
576-
}
577-
578-
bool setChargeCurrent(bool bit7, bool bit6, bool bit5, bool bit4, bool bit3, bool bit2) {
579-
580-
uint8_t current = 0;
581-
if (bit7) current = current | 0b10000000;
582-
if (bit6) current = current | 0b01000000;
583-
if (bit5) current = current | 0b00100000;
584-
if (bit4) current = current | 0b00010000;
585-
if (bit3) current = current | 0b00001000;
586-
if (bit2) current = current | 0b00000100;
587-
588-
uint8_t DATA = readRegister(CHARGE_CURRENT_CONTROL_REGISTER);
589-
uint8_t mask = DATA & 0b00000001;
590-
writeRegister(CHARGE_CURRENT_CONTROL_REGISTER, current | mask);
591-
return 1;
592-
}
593-
594-
bool setChargeVoltage(uint16_t voltage) {
595-
596-
uint8_t DATA = readRegister(CHARGE_VOLTAGE_CONTROL_REGISTER);
597-
uint8_t mask = DATA & 0b000000011;
598-
599-
switch (voltage) {
600-
601-
case 4112:
602-
writeRegister(CHARGE_VOLTAGE_CONTROL_REGISTER, (mask | 0b10011000));
603-
break;
604-
605-
case 4208:
606-
writeRegister(CHARGE_VOLTAGE_CONTROL_REGISTER, (mask | 0b10110000));
607-
break;
608-
609-
default:
610-
return 0; // return error since the value passed didn't match
611-
}
612-
613-
return 1; // value was written successfully
614-
}
615-
616-
bool disableCharge()
617-
{
618-
uint8_t DATA = readRegister(POWERON_CONFIG_REGISTER);
619-
uint8_t mask = DATA & 0b11001111;
620-
621-
writeRegister(POWERON_CONFIG_REGISTER, mask);
622-
623-
return 1;
624-
}
625-
626-
void apply_pmic_newdefaults()
627-
{
628-
disableWatchdog();
629-
630-
//disableDPDM();
631-
disableCharge();
632-
setInputVoltageLimit(4360); // default
633-
setInputCurrentLimit(900); // 900mA
634-
setChargeCurrent(0,0,0,0,0,0); // 512mA
635-
setChargeVoltage(4112); // 4.112V termination voltage
636-
}
637-
638-
void configure_pmic() {
639-
i2c_init(100000);
640-
apply_pmic_newdefaults();
641-
}
642-
643-
#endif
428+
#endif

bootloaders/zero/board_driver_i2c.h

+9-19
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,12 @@
2424
#include <stdbool.h>
2525
#include "board_definitions.h"
2626

27-
//Default PMIC (BQ24195) I2C address
28-
#define PMIC_ADDRESS 0x6B
29-
30-
// Register address definitions
31-
#define INPUT_SOURCE_REGISTER 0x00
32-
#define POWERON_CONFIG_REGISTER 0x01
33-
#define CHARGE_CURRENT_CONTROL_REGISTER 0x02
34-
#define PRECHARGE_CURRENT_CONTROL_REGISTER 0x03
35-
#define CHARGE_VOLTAGE_CONTROL_REGISTER 0x04
36-
#define CHARGE_TIMER_CONTROL_REGISTER 0x05
37-
#define THERMAL_REG_CONTROL_REGISTER 0x06
38-
#define MISC_CONTROL_REGISTER 0x07
39-
#define SYSTEM_STATUS_REGISTER 0x08
40-
#define FAULT_REGISTER 0x09
41-
#define PMIC_VERSION_REGISTER 0x0A
42-
43-
void configure_pmic();
44-
45-
#endif // _BOARD_DRIVER_LED_
27+
void i2c_init(uint32_t baud);
28+
void i2c_end();
29+
uint8_t i2c_requestFrom(uint8_t address, uint8_t quantity, bool stopBit);
30+
void i2c_beginTransmission(uint8_t address);
31+
uint8_t i2c_endTransmission(bool stopBit);
32+
uint8_t i2c_write(uint8_t ucData);
33+
34+
35+
#endif // _BOARD_DRIVER_I2C_

0 commit comments

Comments
 (0)