Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • add_menu_vibration
  • blinkisync-as-preload
  • ch3/api-speed-eval2
  • ch3/dual-core
  • ch3/genapi-refactor
  • ch3/leds-api
  • ch3/splashscreen
  • dualcore
  • dx/flatten-config-module
  • dx/meh-bdf-to-stm
  • freertos-btle
  • genofire/ble-follow-py
  • koalo/bhi160-works-but-dirty
  • koalo/factory-reset
  • koalo/wip/i2c-for-python
  • master
  • msgctl/faultscreen
  • msgctl/textbuffer_api
  • plaetzchen/ios-workaround
  • rahix/bhi
  • rahix/bluetooth-app-favorite
  • rahix/bma
  • rahix/user-space-ctx
  • renze/hatchery_apps
  • renze/safe_mode
  • schleicher-test
  • schneider/212-reset-hardware-when-entering-repl
  • schneider/ancs
  • schneider/ble-buffers
  • schneider/ble-central
  • schneider/ble-ecg-stream-visu
  • schneider/ble-fixes-2020-3
  • schneider/ble-mini-demo
  • schneider/ble-stability
  • schneider/ble-stability-new-phy
  • schneider/bonding
  • schneider/bonding-fail-if-full
  • schneider/bootloader-update-9a0d158
  • schneider/deepsleep
  • schneider/deepsleep2
  • schneider/deepsleep4
  • schneider/default-main
  • schneider/freertos-list-debug
  • schneider/fundamental-test
  • schneider/iaq-python
  • schneider/ir
  • schneider/max30001
  • schneider/max30001-epicaridum
  • schneider/max30001-pycardium
  • schneider/maxim-sdk-update
  • schneider/mp-exception-print
  • schneider/mp-for-old-bl
  • schneider/png
  • schneider/schleicher-test
  • schneider/sdk-0.2.1-11
  • schneider/sdk-0.2.1-7
  • schneider/sleep-display
  • schneider/spo2-playground
  • schneider/stream-locks
  • schneider/v1.17-changelog
  • bootloader-v1
  • release-1
  • v0.0
  • v1.0
  • v1.1
  • v1.10
  • v1.11
  • v1.12
  • v1.13
  • v1.14
  • v1.15
  • v1.16
  • v1.17
  • v1.18
  • v1.2
  • v1.3
  • v1.4
  • v1.5
  • v1.6
  • v1.7
  • v1.8
  • v1.9
82 results

Target

Select target project
  • card10/firmware
  • annejan/firmware
  • astro/firmware
  • fpletz/firmware
  • gerd/firmware
  • fleur/firmware
  • swym/firmware
  • l/firmware
  • uberardy/firmware
  • wink/firmware
  • madonius/firmware
  • mot/firmware
  • filid/firmware
  • q3k/firmware
  • hauke/firmware
  • Woazboat/firmware
  • pink/firmware
  • mossmann/firmware
  • omniskop/firmware
  • zenox/firmware
  • trilader/firmware
  • Danukeru/firmware
  • shoragan/firmware
  • zlatko/firmware
  • sistason/firmware
  • datenwolf/firmware
  • bene/firmware
  • amedee/firmware
  • martinling/firmware
  • griffon/firmware
  • chris007/firmware
  • adisbladis/firmware
  • dbrgn/firmware
  • jelly/firmware
  • rnestler/firmware
  • mh/firmware
  • ln/firmware
  • penguineer/firmware
  • monkeydom/firmware
  • jens/firmware
  • jnaulty/firmware
  • jeffmakes/firmware
  • marekventur/firmware
  • pete/firmware
  • h2obrain/firmware
  • DooMMasteR/firmware
  • jackie/firmware
  • prof_r/firmware
  • Draradech/firmware
  • Kartoffel/firmware
  • hinerk/firmware
  • abbradar/firmware
  • JustTB/firmware
  • LuKaRo/firmware
  • iggy/firmware
  • ente/firmware
  • flgr/firmware
  • Lorphos/firmware
  • matejo/firmware
  • ceddral7/firmware
  • danb/firmware
  • joshi/firmware
  • melle/firmware
  • fitch/firmware
  • deurknop/firmware
  • sargon/firmware
  • markus/firmware
  • kloenk/firmware
  • lucaswerkmeister/firmware
  • derf/firmware
  • meh/firmware
  • dx/card10-firmware
  • torben/firmware
  • yuvadm/firmware
  • AndyBS/firmware
  • klausdieter1/firmware
  • katzenparadoxon/firmware
  • xiretza/firmware
  • ole/firmware
  • techy/firmware
  • thor77/firmware
  • TilCreator/firmware
  • fuchsi/firmware
  • dos/firmware
  • yrlf/firmware
  • PetePriority/firmware
  • SuperVirus/firmware
  • sur5r/firmware
  • tazz/firmware
  • Alienmaster/firmware
  • flo_h/firmware
  • baldo/firmware
  • mmu_man/firmware
  • Foaly/firmware
  • sodoku/firmware
  • Guinness/firmware
  • ssp/firmware
  • led02/firmware
  • Stormwind/firmware
  • arist/firmware
  • coon/firmware
  • mdik/firmware
  • pippin/firmware
  • royrobotiks/firmware
  • zigot83/firmware
  • mo_k/firmware
106 results
Select Git revision
Loading items
Show changes
Showing with 92879 additions and 164 deletions
......@@ -3,7 +3,7 @@ l0dable_startup_lib = static_library(
'crt.s',
'hardware.c',
dependencies: [api_caller],
pic: true,
c_args: ['-fpie'],
)
l0dable_startup = declare_dependency(
......
#include "card10.h"
#include "pmic.h"
#include "bosch.h"
#include "display.h"
......@@ -24,12 +25,14 @@
#include <stdint.h>
#include <string.h>
#define SPI_SPEED (15 * 1000 * 1000) // Bit Rate
const gpio_cfg_t bhi_interrupt_pin = {
PORT_0, PIN_13, GPIO_FUNC_IN, GPIO_PAD_PULL_UP
};
static const gpio_cfg_t pwr_hold_pin = {
PORT_0, PIN_30, GPIO_FUNC_OUT, GPIO_PAD_NONE
};
void card10_init(void)
{
printf("card10 init...\n");
......@@ -41,36 +44,34 @@ void card10_init(void)
I2C_Shutdown(MXC_I2C1_BUS0);
I2C_Init(MXC_I2C1_BUS0, I2C_FAST_MODE, NULL);
portexpander_init();
GPIO_Init();
PB_Init();
GPIO_Config(&pwr_hold_pin);
GPIO_OutSet(&pwr_hold_pin);
pmic_init();
pmic_set_led(0, 0);
pmic_set_led(1, 0);
pmic_set_led(2, 0);
TMR_Delay(MXC_TMR0, MSEC(1000), 0);
while (RTC_EnableRTCE(MXC_RTC) == E_BUSY)
;
portexpander_init();
PB_Init();
TMR_Delay(MXC_TMR0, MSEC(1000), 0);
// Enable 32 kHz output
while (RTC_SquareWave(
MXC_RTC,
SQUARE_WAVE_ENABLED,
F_32KHZ,
NOISE_IMMUNE_MODE,
NULL) == E_BUSY
)
while (RTC_SquareWave(MXC_RTC, SQUARE_WAVE_ENABLED, F_32KHZ, NULL) ==
E_BUSY)
;
/* If we don't have a valid time yet, set it to 2019-01-01 */
if (RTC_GetSecond() < 1546300800UL) {
if (RTC_GetSecond() < 1546300800L) {
while (RTC_Init(MXC_RTC, 1546300800UL, 0, NULL) == E_BUSY)
;
}
while (RTC_EnableRTCE(MXC_RTC) == E_BUSY)
;
// Enable SPI
sys_cfg_spi_t spi17y_master_cfg;
......@@ -78,6 +79,7 @@ void card10_init(void)
spi17y_master_cfg.ss0 = Enable;
spi17y_master_cfg.ss1 = Disable;
spi17y_master_cfg.ss2 = Disable;
spi17y_master_cfg.num_io = 2;
if (SPI_Init(SPI0, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
printf("Error configuring SPI\n");
while (1)
......@@ -215,9 +217,10 @@ void core1_stop(void)
void card10_poll(void)
{
pmic_poll();
portexpander_poll();
}
void card10_reset(void)
void __attribute__((noreturn)) card10_reset(void)
{
printf("Resetting ...\n");
/*
......@@ -228,6 +231,9 @@ void card10_reset(void)
__asm volatile("nop");
}
MXC_GCR->rstr0 = MXC_F_GCR_RSTR0_SYSTEM;
while (1)
__WFI();
}
void GPIO0_IRQHandler(void)
......
......@@ -4,6 +4,8 @@
#include <stdint.h>
#define SPI_SPEED (15 * 1000 * 1000) // Bit Rate
extern const gpio_cfg_t bhi_interrupt_pin;
void card10_init(void);
......@@ -13,5 +15,5 @@ void core1_start(void *isr);
void core1_stop(void);
void card10_poll(void);
void card10_reset(void);
void card10_reset(void) __attribute__((noreturn));
#endif
......@@ -4,83 +4,25 @@
#include "textbuffer.h"
#include "gpio.h"
#include "tmr.h"
#include "portexpander.h"
#include "MAX77650-Arduino-Library.h"
#include <stdint.h>
#include <stdio.h>
/***** Globals *****/
const gpio_cfg_t DEV_DC_PIN = { PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE };
struct gfx_region display_screen;
struct txt_buffer display_textb;
// Parameters for PWM output
#define PORT_PWM PORT_0 // port
#define PIN_PWM PIN_28 // pin
#define FREQ 200 // (Hz)
//#define DUTY_CYCLE 75 // (%)
#define DUTY_CYCLE 20 // (%)
#define PWM_TIMER MXC_TMR4 // must change PORT_PWM and PIN_PWM if changed
/***** Functions *****/
void PWM_Output(void)
{
// Declare variables
gpio_cfg_t gpio_pwm; // to configure GPIO
tmr_cfg_t tmr; // to congigure timer
tmr_pwm_cfg_t tmr_pwm; // for configure PWM
unsigned int period_ticks = PeripheralClock / FREQ;
unsigned int duty_ticks = period_ticks * DUTY_CYCLE / 100;
// Congfigure GPIO port and pin for PWM
gpio_pwm.func = GPIO_FUNC_ALT4;
gpio_pwm.port = PORT_PWM;
gpio_pwm.mask = PIN_PWM;
gpio_pwm.pad = GPIO_PAD_PULL_DOWN;
if (GPIO_Config(&gpio_pwm) != E_NO_ERROR) {
printf("Failed GPIO_Config for pwm.\n");
}
/*
Steps for configuring a timer for PWM mode:
1. Disable the timer
2. Set the prescale value
3. Configure the timer for PWM mode
4. Set polarity, pwm parameters
5. Enable Timer
*/
TMR_Disable(PWM_TIMER);
TMR_Init(PWM_TIMER, TMR_PRES_1, 0);
tmr.mode = TMR_MODE_PWM;
tmr.cmp_cnt = period_ticks;
tmr.pol = 0;
TMR_Config(PWM_TIMER, &tmr);
tmr_pwm.pol = 1;
tmr_pwm.per_cnt = period_ticks;
tmr_pwm.duty_cnt = duty_ticks;
if (TMR_PWMConfig(PWM_TIMER, &tmr_pwm) != E_NO_ERROR) {
printf("Failed TMR_PWMConfig.\n");
}
TMR_Enable(PWM_TIMER);
printf("PWM started.\n");
}
void display_set_reset_pin(uint8_t state)
{
if (!portexpander_detected()) {
MAX77650_setDO(state ? true : false);
} else {
portexpander_set(4, state);
portexpander_out_put(PIN_4, state ? 0xFF : 0);
}
}
......@@ -95,11 +37,25 @@ void display_init(void)
GPIO_Config(&DEV_DC_PIN);
PWM_Output();
LCD_SetBacklight(500);
LCD_SetBacklight(20);
LCD_Init();
display_screen = gfx_screen(LCD_framebuffer());
txt_init(&display_textb, &display_screen, &Font12);
gfx_clear(&display_screen);
}
void display_init_slim(void)
{
if (!portexpander_detected()) {
// Open-drain
MAX77650_setDRV(false);
// Output
MAX77650_setDIR(false);
}
GPIO_Config(&DEV_DC_PIN);
display_screen = gfx_screen(LCD_framebuffer());
txt_init(&display_textb, &display_screen, &Font12);
}
......@@ -6,5 +6,6 @@ extern struct gfx_region display_screen;
extern struct txt_buffer display_textb;
void display_init(void);
void display_init_slim(void);
#endif
......@@ -206,6 +206,13 @@ void leds_prep(uint8_t led, uint8_t r, uint8_t g, uint8_t b)
leds[led][2] = b;
}
void leds_get_rgb(uint8_t led, uint8_t *rgb)
{
rgb[0] = leds[led][0];
rgb[1] = leds[led][1];
rgb[2] = leds[led][2];
}
#if 0
//don't use, is buggy
void leds_set_autodim(uint8_t led, uint8_t r, uint8_t g, uint8_t b)
......@@ -278,10 +285,7 @@ static uint8_t power_pin_conversion(uint8_t group)
static void power_all(void)
{
for (int i = 0; i < 3; i++) {
portexpander_prep(i, 0);
}
portexpander_update();
portexpander_out_clr(PIN_0 | PIN_1 | PIN_2);
}
void leds_update_power(void)
......@@ -294,14 +298,14 @@ void leds_update_power(void)
if (new_groups == active_groups) {
return;
}
for (int i = 0; i < 3; i++) {
if (i < new_groups) {
portexpander_prep(power_pin_conversion(i), 0);
} else {
portexpander_prep(power_pin_conversion(i), 1);
}
uint8_t out_val = 0;
for (int i = new_groups; i < 3; ++i) {
out_val |= (1 << power_pin_conversion(i));
}
portexpander_update();
portexpander_out_put(PIN_0 | PIN_1 | PIN_2, out_val);
if (active_groups < new_groups) {
for (int i = 0; i < powerup_wait_cycles; i++) {
__NOP();
......@@ -336,7 +340,7 @@ void leds_update(void)
void leds_flashlight(bool power)
{
portexpander_set(7, (power) ? 0 : 1);
portexpander_out_put(PIN_7, (power) ? 0 : 0xFF);
}
void leds_set_gamma_table(uint8_t rgb_channel, uint8_t table[256])
......
......@@ -6,6 +6,7 @@
void leds_set_dim_top(uint8_t value);
void leds_set_dim_bottom(uint8_t value);
void leds_prep(uint8_t led, uint8_t r, uint8_t g, uint8_t b);
void leds_get_rgb(uint8_t led, uint8_t * rgb);
void leds_prep_hsv(uint8_t led, float h, float s, float v);
void leds_update_power(void);
void leds_update(void);
......
......@@ -40,6 +40,10 @@
#include "portexpander.h"
#include "MAX77650-Arduino-Library.h"
#include <stddef.h>
static const uint8_t expander_pins[] = { 5, 0x0, 3, 6 };
static pb_callback pb_callbacks[4] = { NULL };
/******************************************************************************/
int PB_Init(void)
{
......@@ -59,24 +63,71 @@ int PB_Init(void)
return retval;
}
static void pe_pb_callback(gpio_int_pol_t edge_type, void *cbdata)
{
unsigned int pb = (unsigned int)cbdata;
if (pb_callbacks[pb - 1]) {
pb_callbacks[pb - 1](pb, edge_type == GPIO_INT_FALLING);
}
}
static void gpio_pb_callback(void *cbdata)
{
unsigned int pb = (unsigned int)cbdata;
if (pb_callbacks[pb - 1]) {
int level = GPIO_InGet(&pb_pin[pb - 1]);
pb_callbacks[pb - 1](pb, !level);
}
}
/******************************************************************************/
int PB_RegisterCallback(unsigned int pb, pb_callback callback)
{
MXC_ASSERT(pb < num_pbs);
MXC_ASSERT((pb > 0) && (pb <= num_pbs));
if (pb == 2) {
return E_INVALID;
}
pb_callbacks[pb - 1] = callback;
uint8_t mask = (1 << expander_pins[pb - 1]);
// TODO: portexpander support
if (callback) {
if (portexpander_detected()) {
// Register callback
portexpander_register_callback(
mask, pe_pb_callback, (void *)pb
);
// Configure and enable interrupt
portexpander_int_config(mask, GPIO_INT_BOTH);
portexpander_int_enable(mask);
} else {
// Register callback
GPIO_RegisterCallback(&pb_pin[pb], callback, (void *)pb);
GPIO_RegisterCallback(
&pb_pin[pb - 1], gpio_pb_callback, (void *)pb
);
// Configure and enable interrupt
GPIO_IntConfig(&pb_pin[pb], GPIO_INT_EDGE, GPIO_INT_FALLING);
GPIO_IntEnable(&pb_pin[pb]);
NVIC_EnableIRQ((IRQn_Type)MXC_GPIO_GET_IRQ(pb_pin[pb].port));
GPIO_IntConfig(
&pb_pin[pb - 1], GPIO_INT_EDGE, GPIO_INT_BOTH
);
GPIO_IntEnable(&pb_pin[pb - 1]);
NVIC_EnableIRQ((IRQn_Type)MXC_GPIO_GET_IRQ(
pb_pin[pb - 1].port)
);
}
} else {
if (portexpander_detected()) {
// Disable interrupt and clear callback
GPIO_IntDisable(&pb_pin[pb]);
GPIO_RegisterCallback(&pb_pin[pb], NULL, NULL);
portexpander_int_disable(mask);
portexpander_register_callback(mask, NULL, NULL);
} else {
// Disable interrupt and clear callback
GPIO_IntDisable(&pb_pin[pb - 1]);
GPIO_RegisterCallback(&pb_pin[pb - 1], NULL, NULL);
}
}
return E_NO_ERROR;
......@@ -85,39 +136,60 @@ int PB_RegisterCallback(unsigned int pb, pb_callback callback)
//******************************************************************************
void PB_IntEnable(unsigned int pb)
{
// TODO: portexpander support
MXC_ASSERT(pb < num_pbs);
GPIO_IntEnable(&pb_pin[pb]);
MXC_ASSERT((pb > 0) && (pb <= num_pbs));
if (pb == 2) {
return;
}
if (portexpander_detected()) {
portexpander_int_enable((1 << expander_pins[pb - 1]));
} else {
GPIO_IntEnable(&pb_pin[pb - 1]);
}
}
//******************************************************************************
void PB_IntDisable(unsigned int pb)
{
// TODO: portexpander support
MXC_ASSERT(pb < num_pbs);
GPIO_IntDisable(&pb_pin[pb]);
MXC_ASSERT((pb > 0) && (pb <= num_pbs));
if (pb == 2) {
return;
}
if (portexpander_detected()) {
portexpander_int_disable((1 << expander_pins[pb - 1]));
} else {
GPIO_IntDisable(&pb_pin[pb - 1]);
}
}
//******************************************************************************
void PB_IntClear(unsigned int pb)
{
// TODO: portexpander support
MXC_ASSERT(pb < num_pbs);
GPIO_IntClr(&pb_pin[pb]);
MXC_ASSERT((pb > 0) && (pb <= num_pbs));
if (pb == 2) {
return;
}
if (portexpander_detected()) {
portexpander_int_clr((1 << expander_pins[pb - 1]));
} else {
GPIO_IntClr(&pb_pin[pb - 1]);
}
}
//******************************************************************************
int PB_Get(unsigned int pb)
{
static const uint8_t expander_pins[] = { 5, 0x0, 3, 6 };
MXC_ASSERT(pb < 4);
MXC_ASSERT(pb <= 4);
switch (pb) {
case 1:
case 3:
case 4:
if (portexpander_detected()) {
uint8_t port = portexpander_get();
return (port & (1 << expander_pins[pb - 1])) == 0;
return portexpander_in_get(
(1 << expander_pins[pb - 1])) == 0;
} else {
return GPIO_InGet(&pb_pin[pb - 1]) == 0;
}
......
/**
* @file pb.h
* @brief Pushbutton driver header file.
*/
/* ****************************************************************************
* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* Except as contained in this notice, the name of Maxim Integrated
* Products, Inc. shall not be used except as stated in the Maxim Integrated
* Products, Inc. Branding Policy.
*
* The mere transfer of this software does not imply any licenses
* of trade secrets, proprietary technology, copyrights, patents,
* trademarks, maskwork rights, or any other form of intellectual
* property whatsoever. Maxim Integrated Products, Inc. retains all
* ownership rights.
*
* $Date: 2018-10-31 15:32:51 +0000 (Wed, 31 Oct 2018) $
* $Revision: 38826 $
*
*************************************************************************** */
#ifndef _PB_H_
#define _PB_H_
#include "gpio.h"
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @ingroup bsp
* @defgroup pushbutton_evkit Push button driver board support
* @{
*/
/* **** Global Variables **** */
extern const gpio_cfg_t pb_pin[];
extern const unsigned int num_pbs;
/* **** Function Prototypes **** */
/**
* @brief Initialize all push buttons.
* @return \c #E_NO_ERROR Push buttons initialized successfully.
* @return "Error Code" @ref MXC_Error_Codes "Error Code" if unsuccessful.
*
*/
int PB_Init(void);
/**
* Type alias @c pb_callback for the push button callback.
* @details The function is of type:
* @code
* void pb_callback(unsigned int pb, bool falling)
* @endcode
* To receive notification of a push button event, define a callback
* function and pass it as a pointer to the PB_RegisterCallback(unsigned int pb, pb_callback callback) function.
* @param pb push button index that triggered the callback.
*/
typedef void (*pb_callback)(unsigned int pb, bool falling);
/**
* @brief Register or Unregister a callback handler for events on the @p pb push button.
* @details
* - Calling this function with a pointer to a function @p callback, configures the pushbutton @p pb and enables the
* interrupt to handle the push button events.
* - Calling this function with a <tt>NULL</tt> pointer will disable the interrupt and unregister the
* callback function.
* @p pb must be a value between 0 and \c num_pbs.
*
* @param pb push button index to receive event callbacks.
* @param callback Callback function pointer of type @c pb_callback
* @return #E_NO_ERROR if configured and callback registered successfully.
* @return "Error Code" @ref MXC_Error_Codes "Error Code" if unsuccessful.
*/
int PB_RegisterCallback(unsigned int pb, pb_callback callback);
/**
* @brief Register or Unregister a callback handler for rising and falling events on the @p pb push button.
* @details
* - Calling this function with a pointer to a function @p callback, configures the pushbutton @p pb and enables the
* interrupt to handle the push button events.
* - Calling this function with a <tt>NULL</tt> pointer will disable the interrupt and unregister the
* callback function.
* @p pb must be a value between 0 and \c num_pbs.
*
* @param pb push button index to receive event callbacks.
* @param callback Callback function pointer of type @c pb_callback
* @return #E_NO_ERROR if configured and callback registered successfully.
* @return "Error Code" @ref MXC_Error_Codes "Error Code" if unsuccessful.
*/
int PB_RegisterRiseFallCallback(unsigned int pb, pb_callback callback);
/**
* @brief Enable a callback interrupt.
* @note PB_RegisterCallback must be called prior to enabling the callback interrupt.
* @param pb push button index value between 0 and \c num_pbs.
*/
void PB_IntEnable(unsigned int pb);
/**
* @brief Disable a callback interrupt.
* @param pb push button index
*/
void PB_IntDisable(unsigned int pb);
/**
* @brief Clear a callback interrupt.
* @param pb push button index value between 0 and \c num_pbs.
*/
void PB_IntClear(unsigned int pb);
/**
* @brief Get the current state of the push button.
* @param pb push button index value between 0 and \c num_pbs.
* @return TRUE The button is pressed.
* @return FALSE The button is not pressed.
*/
int PB_Get(unsigned int pb);
/**@}*/
#ifdef __cplusplus
}
#endif
#endif /* _PB_H_ */
#include "i2c.h"
#include "pmic.h"
#include "lp.h"
#include "MAX77650-Arduino-Library.h"
#include <stdint.h>
#include <stdio.h>
#include <errno.h>
static const gpio_cfg_t pmic_interrupt_pin = {
PORT_0, PIN_12, GPIO_FUNC_IN, GPIO_PAD_PULL_UP
......@@ -44,7 +46,7 @@ void pmic_init(void)
//MAX77650_setTV_SBB2(0b110100); //Set output Voltage of SBB2 to 5.0V
MAX77650_setTV_SBB2(0b010010); //Set output Voltage of SBB2 to 3.3V
#endif
MAX77650_setADE_SBB2(0b0); //Disable Active Discharge at SBB2 Output
MAX77650_setADE_SBB2(0b1); //Enable Active Discharge at SBB2 Output
MAX77650_setEN_SBB2(
0b110); //Enable SBB2 is on irrespective of FPS whenever the on/off controller is in its "On via Software" or "On via On/Off Controller" states
......@@ -89,6 +91,8 @@ void pmic_init(void)
);
NVIC_EnableIRQ((IRQn_Type)MXC_GPIO_GET_IRQ(pmic_interrupt_pin.port));
/* Allow the PMIC to interrupt us in deepsleep */
LP_EnableGPIOWakeup((gpio_cfg_t *)&pmic_interrupt_pin);
/* Setup power button interrupt */
MAX77650_setINT_M_GLBL(~(MAX77650_INT_nEN_R | MAX77650_INT_nEN_F));
/* Clear existing interrupts */
......@@ -123,6 +127,20 @@ void pmic_set_button_callback(pmic_button_callback_fn cb)
pmic_button_callback = cb;
}
int pmic_get_led(uint8_t led)
{
if (led == 0) {
return MAX77650_getBRT_LED0();
}
if (led == 1) {
return MAX77650_getBRT_LED1();
}
if (led == 2) {
return MAX77650_getBRT_LED2();
}
return -EINVAL;
}
void pmic_set_led(uint8_t led, uint8_t val)
{
if (led == 0) {
......
......@@ -21,6 +21,7 @@
void pmic_init(void);
void pmic_set_led(uint8_t led, uint8_t val);
int pmic_get_led(uint8_t led);
void pmic_poll(void);
/* weak, so it can be overwritten by applications */
......
/* PCAL6408A I2C port expander */
/* **** Includes **** */
#include "portexpander.h"
#include "mxc_config.h"
#include "mxc_assert.h"
#include "i2c.h"
#include <stdio.h>
......@@ -7,10 +12,7 @@
#include <string.h>
#include <stdbool.h>
// PCAL6408A I2C port expander
static bool detected = false;
static uint8_t output_state;
/* **** Definitions **** */
/* clang-format off */
#define PE_ADDR 0x42
......@@ -40,95 +42,295 @@ static uint8_t output_state;
#define PE_INPUT_MASK ((uint8_t)0b01101000) // 3, 5, 6 = input
/* **** Globals **** */
static bool detected = false;
static volatile bool interrupt_pending;
static uint8_t type_state = 0xFF;
static uint8_t output_state = 0xFF;
static uint8_t pull_enable_state = 0x00;
static uint8_t pull_selection_state = 0xFF;
static uint8_t int_mask_state = 0xFF;
static gpio_int_pol_t int_edge_config[8] = { 0 };
static pe_callback callbacks[8] = { NULL };
static void *cbparam[8] = { NULL };
const gpio_cfg_t pe_int_pin = { PORT_1, PIN_7, GPIO_FUNC_IN, GPIO_PAD_PULL_UP };
static const portexpander_cfg_t pe_pin_config[] = {
{ PE_INPUT_MASK, GPIO_FUNC_IN, GPIO_PAD_PULL_UP },
{ ~PE_INPUT_MASK, GPIO_FUNC_OUT, GPIO_PAD_PULL_UP },
};
/* **** Functions **** */
static int portexpander_write(uint8_t command, uint8_t data)
{
uint8_t i2c_data[2] = { command, data };
return I2C_MasterWrite(MXC_I2C1_BUS0, PE_ADDR, i2c_data, 2, 0);
}
/* ************************************************************************** */
static int portexpander_read(uint8_t command, uint8_t *data)
{
I2C_MasterWrite(MXC_I2C1_BUS0, PE_ADDR, &command, 1, 1);
return I2C_MasterRead(MXC_I2C1_BUS0, PE_ADDR, data, 1, 0);
}
void portexpander_init(void)
/* ************************************************************************** */
int portexpander_init(void)
{
int ret;
// Enable pull-ups for buttons (type defaults to pull-up)
ret = portexpander_write(PE_C_PULL_ENABLE, PE_INPUT_MASK);
// Set _all_ outputs to open-drain to support the high side p-channel transistors.
ret = portexpander_write(PE_C_OUTPUT_PORT_CONFIG, PE_OUT_OPEN_DRAIN);
if (ret != 2) {
printf("portexpander NOT detected\n");
detected = false;
return;
return E_NO_DEVICE;
}
detected = true;
// Set _all_ outputs to open-drain to support the high side p-channel transistors.
portexpander_write(PE_C_OUTPUT_PORT_CONFIG, PE_OUT_OPEN_DRAIN);
// Set outputs to high
portexpander_out_set(~PE_INPUT_MASK);
// Enable pull-ups for buttons
// Enable outputs for the transistors, the LED and the LCD reset
portexpander_write(PE_C_CONFIG, PE_INPUT_MASK);
for (size_t i = 0; i < sizeof(pe_pin_config) / sizeof(pe_pin_config[0]);
i++) {
ret = portexpander_config(&pe_pin_config[i]);
MXC_ASSERT(ret == E_NO_ERROR);
}
// Set outputs to high (i.e. open-drain)
output_state = ~PE_INPUT_MASK;
portexpander_write(PE_C_OUTPUT_PORT, output_state);
// Latch inputs so we can figure out whether an interrupt was caused by a rising or falling edge
portexpander_write(PE_C_INPUT_LATCH, PE_INPUT_MASK);
// Configure interrupt GPIO
MXC_ASSERT(GPIO_Config(&pe_int_pin) == E_NO_ERROR);
// Configure and enable portexpander interrupt
GPIO_RegisterCallback(
&pe_int_pin, &portexpander_interrupt_callback, NULL
);
MXC_ASSERT(
GPIO_IntConfig(&pe_int_pin, GPIO_INT_EDGE, GPIO_INT_FALLING) ==
E_NO_ERROR);
GPIO_IntEnable(&pe_int_pin);
NVIC_EnableIRQ((IRQn_Type)MXC_GPIO_GET_IRQ(pe_int_pin.port));
return E_SUCCESS;
}
/* ************************************************************************** */
int portexpander_config(const portexpander_cfg_t *cfg)
{
// Set the GPIO type
switch (cfg->func) {
case GPIO_FUNC_IN:
type_state |= cfg->mask;
break;
case GPIO_FUNC_OUT:
type_state &= ~cfg->mask;
break;
default:
return E_BAD_PARAM;
}
if (portexpander_write(PE_C_CONFIG, type_state) != 2) {
return E_NO_DEVICE;
}
switch (cfg->pad) {
case GPIO_PAD_NONE:
pull_enable_state &= ~cfg->mask;
break;
case GPIO_PAD_PULL_UP:
pull_selection_state |= cfg->mask;
pull_enable_state |= cfg->mask;
break;
case GPIO_PAD_PULL_DOWN:
pull_selection_state &= ~cfg->mask;
pull_enable_state |= cfg->mask;
break;
default:
return E_BAD_PARAM;
}
uint8_t portexpander_get(void)
portexpander_write(PE_C_PULL_SEL, pull_selection_state);
portexpander_write(PE_C_PULL_ENABLE, pull_enable_state);
return E_NO_ERROR;
}
/* ************************************************************************** */
uint8_t portexpander_in_get(uint8_t mask)
{
// Reading the input port clears interrupts, so we need to check them here to avoid losing information
portexpander_poll();
uint8_t buf = 0xFF;
if (detected) {
portexpander_read(PE_C_INPUT_PORT, &buf);
}
return buf;
return buf & mask;
}
/* ************************************************************************** */
bool portexpander_detected(void)
{
return detected;
}
void portexpander_set(uint8_t pin, uint8_t value)
/* ************************************************************************** */
void portexpander_out_set(uint8_t mask)
{
if (detected && pin < 8) {
if (value) {
output_state |= (1 << pin);
} else {
output_state &= ~(1 << pin);
if (detected) {
output_state |= mask;
portexpander_write(PE_C_OUTPUT_PORT, output_state);
}
}
/* ************************************************************************** */
void portexpander_out_clr(uint8_t mask)
{
if (detected) {
output_state &= ~mask;
portexpander_write(PE_C_OUTPUT_PORT, output_state);
}
}
void portexpander_prep(uint8_t pin, uint8_t value)
/* ************************************************************************** */
uint8_t portexpander_out_get(uint8_t mask)
{
if (pin < 8) {
if (value) {
output_state |= (1 << pin);
} else {
output_state &= ~(1 << pin);
return output_state & mask;
}
/* ************************************************************************** */
void portexpander_out_put(uint8_t mask, uint8_t val)
{
if (detected) {
output_state = (output_state & ~mask) | (val & mask);
portexpander_write(PE_C_OUTPUT_PORT, output_state);
}
}
void portexpander_update(void)
/* ************************************************************************** */
void portexpander_out_toggle(uint8_t mask)
{
if (detected) {
output_state ^= mask;
portexpander_write(PE_C_OUTPUT_PORT, output_state);
}
}
void portexpander_set_mask(uint8_t mask, uint8_t values)
/* ************************************************************************** */
void portexpander_int_config(uint8_t mask, gpio_int_pol_t edge)
{
if (detected) {
output_state &= ~(mask & ~values);
output_state |= mask & values;
portexpander_write(PE_C_OUTPUT_PORT, output_state);
for (uint8_t pin = 0; pin < 8; ++pin) {
if (mask & (1 << pin)) {
int_edge_config[pin] = edge;
}
}
}
}
/* ************************************************************************** */
void portexpander_int_enable(uint8_t mask)
{
if (detected) {
int_mask_state &= ~mask;
portexpander_write(PE_C_INT_MASK, int_mask_state);
}
}
/* ************************************************************************** */
void portexpander_int_disable(uint8_t mask)
{
if (detected) {
int_mask_state |= mask;
portexpander_write(PE_C_INT_MASK, int_mask_state);
}
}
/* ************************************************************************** */
uint8_t portexpander_int_status()
{
uint8_t buf = 0;
if (detected) {
portexpander_read(PE_C_INT_STATUS, &buf);
}
return buf;
}
/* ************************************************************************** */
void portexpander_int_clr(uint8_t mask)
{
if (detected) {
uint8_t tmp_mask = int_mask_state | mask;
// Setting an interrupt mask clears the corresponding interrupt
portexpander_write(PE_C_INT_MASK, tmp_mask);
portexpander_write(PE_C_INT_MASK, int_mask_state);
}
}
/* ************************************************************************** */
int portexpander_register_callback(
uint8_t mask, pe_callback callback, void *cbdata
) {
if (!detected) {
return E_NO_DEVICE;
}
for (uint8_t pin = 0; pin < 8; ++pin) {
if (mask & (1 << pin)) {
callbacks[pin] = callback;
cbparam[pin] = cbdata;
}
}
return E_NO_ERROR;
}
/* ************************************************************************** */
__attribute__((weak)) void portexpander_interrupt_callback(void *_)
{
GPIO_IntDisable(&pe_int_pin);
GPIO_IntClr(&pe_int_pin);
interrupt_pending = true;
}
/* ************************************************************************** */
void portexpander_poll()
{
if (detected && interrupt_pending) {
interrupt_pending = false;
uint8_t caused_by = portexpander_int_status();
// Port read resets interrupts
uint8_t port_levels = portexpander_in_get(0xFF);
GPIO_IntEnable(&pe_int_pin);
for (uint8_t pin = 0; pin < 8; ++pin) {
if ((caused_by & (1 << pin)) && callbacks[pin]) {
gpio_int_pol_t edge_type =
(port_levels & (1 << pin) ?
GPIO_INT_RISING :
GPIO_INT_FALLING);
if ((int_edge_config[pin] == GPIO_INT_BOTH) ||
(edge_type == int_edge_config[pin])) {
callbacks[pin](edge_type, cbparam[pin]);
}
}
}
}
}
#ifndef PORTEXPANDER_H
#define PORTEXPANDER_H
#include "mxc_config.h"
#include <stdint.h>
#include <stdbool.h>
void portexpander_init(void);
uint8_t portexpander_get(void);
void portexpander_set(uint8_t pin, uint8_t value);
void portexpander_set_mask(uint8_t mask, uint8_t values);
void portexpander_prep(uint8_t pin, uint8_t value);
void portexpander_update(void);
/**
* Structure type for configuring the portexpander.
*/
typedef struct {
uint8_t mask; /**< Pin mask (multiple pins may be set) */
gpio_func_t func; /**< Function type */
gpio_pad_t pad; /**< Pad type */
} portexpander_cfg_t;
typedef void (*pe_callback)(gpio_int_pol_t edge_type, void *cbdata);
int portexpander_init(void);
bool portexpander_detected(void);
int portexpander_config(const portexpander_cfg_t *cfg);
uint8_t portexpander_in_get(uint8_t mask);
void portexpander_out_set(uint8_t mask);
void portexpander_out_clr(uint8_t mask);
void portexpander_out_put(uint8_t mask, uint8_t val);
void portexpander_out_toggle(uint8_t mask);
uint8_t portexpander_out_get(uint8_t mask);
void portexpander_int_config(uint8_t mask, gpio_int_pol_t edge);
void portexpander_int_enable(uint8_t mask);
void portexpander_int_disable(uint8_t mask);
uint8_t portexpander_int_status();
void portexpander_int_clr(uint8_t mask);
int portexpander_register_callback(uint8_t mask, pe_callback callback, void *cbdata);
void portexpander_poll();
void portexpander_interrupt_callback(void *_);
#endif
Subproject commit 1c9e3886f69f9ca83c1af49968d8e4389035ff44
includes = include_directories(
'./',
)
sources = files(
'./tiny-AES-c/aes.c',
'./SHA256/mark2/sha256.c',
)
lib = static_library(
'crypto',
sources,
include_directories: includes,
c_args: '-w',
)
libcrypto = declare_dependency(
include_directories: includes,
link_with: lib,
)
Subproject commit 3f69a5899e58e2e398e8c32ce7b3a954dd593ed4
#include <stdlib.h>
#include <libgen.h>
#define CTX_MAX_DRAWLIST_SIZE 4096000
#define CTX_BACKEND_TEXT 0 // we keep then non-backend code paths
// for code handling aroud, this should
// be run-time to permit doing text_to_path
#define CTX_RASTERIZER 0
#define CTX_BITPACK_PACKER 1 // pack vectors
#define CTX_BITPACK 1
#define STB_TRUETYPE_IMPLEMENTATION
#include "stb_truetype.h"
#include <sys/time.h>
#define CTX_EXTRAS 1
#define CTX_FONTS_FROM_FILE 1
#define CTX_AVX2 0
#define CTX_IMPLEMENTATION
#define CTX_PARSER 1
#include "ctx-nofont.h"
static int usage(){
fprintf (stderr, "tool to generate native ctx embedded font format\n");
fprintf (stderr, "\n");
fprintf (stderr, "usage: ctx-fontgen <file.ttf> [name [set1-set2-set3]]\n");
fprintf (stderr, "\nrecognized sets: latin1, ascii, extra, all, emoji\n");
fprintf (stderr, "\na final argument of \"binary\" might be appended, causing\nthe generated file to be binary ctx.\n");
return -1;
}
CtxDrawlist output_font={NULL,};
uint32_t glyphs[65536];
int n_glyphs = 0;
void
add_glyph (Ctx *ctx, uint32_t glyph)
{
for (int i = 0; i < n_glyphs; i++)
{
if (glyphs[i] == glyph)
return;
}
ctx_reset (ctx);
ctx_font_size (ctx, CTX_BAKE_FONT_SIZE);
ctx_move_to (ctx, 0, 0);
if (ctx_glyph (ctx, glyph, 1))
return;
glyphs[n_glyphs++] = glyph;
ctx->drawlist.flags = CTX_TRANSFORMATION_BITPACK;
ctx_drawlist_compact (&ctx->drawlist);
char buf[44]={0,0,0,0,0};
ctx_unichar_to_utf8 (glyph, (uint8_t*)buf);
uint32_t args[2] = {glyph, ctx_glyph_width (ctx, glyph) * 256};
ctx_drawlist_add_u32 (&output_font, CTX_DEFINE_GLYPH, args);
for (int i = 3; i < ctx->drawlist.count - 1; i++)
{
CtxEntry *entry = &ctx->drawlist.entries[i];
args[0] = entry->data.u32[0];
args[1] = entry->data.u32[1];
ctx_drawlist_add_u32 (&output_font, entry->code, &args[0]);
}
}
static int find_glyph (CtxDrawlist *drawlist, uint32_t unichar)
{
for (int i = 0; i < drawlist->count; i++)
{
if (drawlist->entries[i].code == CTX_DEFINE_GLYPH &&
drawlist->entries[i].data.u32[0] == unichar)
{
return i;
// XXX this could be prone to insertion of valid header
// data in included bitmaps.. is that an issue?
}
}
fprintf (stderr, "Eeeek %i\n", unichar);
return -1;
}
int main (int argc, char **argv)
{
int binary = 0;
const char *path;
const char *name = "regular";
const char *subsets = "latin1";
Ctx *ctx;
path = argv[1];
if (!path)
{
return usage();
}
if (argv[2])
{
name = argv[2];
if (argv[3])
subsets = argv[3];
if (argv[4] && !strcmp(argv[4], "binary"))
binary=1;
}
ctx_load_font_ttf_file ("import", argv[1]);
ctx = ctx_new ();
_ctx_set_transformation (ctx, CTX_TRANSFORMATION_RELATIVE);
ctx_font (ctx, "import");
if (strstr (subsets, "all"))
for (int glyph = 0; glyph < 65536*8; glyph++) add_glyph (ctx, glyph);
if (strstr (subsets, "latin1"))
for (int glyph = 0; glyph < 256; glyph++) add_glyph (ctx, glyph);
if (strstr (subsets, "ascii"))
for (int glyph = 0; glyph < 127; glyph++) add_glyph (ctx, glyph);
if (strstr (subsets, "terminal"))
{
char* string = "☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼! #$%&'()*+,-.🔒"
"⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐"
"└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■"
"!#$%&'()*+,-./◆▒␉␌␍␊°±␤␋┘┐┌└┼⎺⎻─⎼⎽├┤┴┬│≤≥π≠£·";
for (const char *utf8 = string; *utf8; utf8 = ctx_utf8_skip (utf8, 1))
add_glyph (ctx, ctx_utf8_to_unichar (utf8));
}
if (strstr (subsets, "cp437"))
{
char* string = " ☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼!\"#$%&'()*+,-./0123456789:;<=>?"
"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^,`abcdefghijklmnopqrstuvwxyz{|}~⌂"
"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»"
"░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀"
"αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■";
for (const char *utf8 = string; *utf8; utf8 = ctx_utf8_skip (utf8, 1))
add_glyph (ctx, ctx_utf8_to_unichar (utf8));
}
if (strstr (subsets, "vt100"))
{
char* string =
" !\"#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_◆▒␉␌␍␊°±␤␋┘┐┌└┼⎺⎻─⎼⎽├┤┴┬│≤≥π≠£· ";
for (const char *utf8 = string; *utf8; utf8 = ctx_utf8_skip (utf8, 1))
add_glyph (ctx, ctx_utf8_to_unichar (utf8));
}
if (strstr (subsets, "extras"))
{
char *string =
"éñÑßæøåö£ÆÖØÅ€§π°üÜ…”““”«»©®™⭾⏎⌫·←↑↓→☀☁☂☢☭☮☯☽✉⚙⚠␣²◆♥♦♣♠÷≈±╴−╶";
for (const char *utf8 = string; *utf8; utf8 = ctx_utf8_skip (utf8, 1))
add_glyph (ctx, ctx_utf8_to_unichar (utf8));
}
if (strstr (subsets, "emoji"))
{
char *string = "๛ ☬☣☠☀☁☂☃☢☭☮☯☼☽✉✓❤№℃∞◌◎☎☐☑♉♩♪♫♬☆◦☄☉☏☤☥☹☺☻♲♨♼♽♾⚀⚁🥕⚂⚃⚄⚅⚙⚠␣⚡⌨⌚⏏⋯•‥․‣•↺↻⌘☕✈✉✓✔✕✖✗✘☑☒☐☓✶❄❍❢❣❤❥❤❥❦❧➲㎏㎆㎅㎇㎤㎥㎦㎝㎧㎨㎞㎐㎏㎑㎒㎓㎠㎡㎢★⁈ ⁉ ⁂✵✺✽✾✿❀❁❂❉❆✡✠🤐🤑🤒🤓🤔🤕🤖🤗🤘🤙🤚🤛🤜🤝🤞🤟🤠🤡🤢🤣🤤🤥🤦🤧🤨🤩🤪🤫🤬🤭🤮🤯🤷🤸🤹🤺🥂🥇🥈🥉🥤🥨🥬🥰🥱🥳🥴🥵🥶🥺🦁🦄🦉🦊🦋🦎🦓🦔🦕🦖🦘🦙🦚🦜🦝🦟🦴🦽🦾🦿🧁🧉🧐🧙🧚🧛🧜🧟🧠🧡🧥🧤🧦🧪🧬🧭🧮🧯🧰🧱🧲🧵🧷🧸🧺🧻🛹🛸🛵🛴🛰🛬🛫🛩🛠🛣🛤🛥🛒🛏🛌🛂🛁🚶🚴🚲🚬🚩🚗🚜🚴🚘🚖🚔🚚🚑🚍🚆🚀🙈🙉🙊🙄🙃🙂🙁🙀😿😾😽😼😻😺😹😸😷😶😵😴😳😲😱😰😯😮😭😬😫😪😩😨😧😦😥😤😣😢😡😠😟😞😝😜😛😚😙😘😗😖😕😔😓😒😑😐😏😎😍😌😋😊😉😈😇😆😅😄😃😂😁😀🗝🗜🗞🗓🗒🗑🗄🖼🖤🖥🖨🖖🖕🖐🖍🖌🖋🖊🖇🕺🕹🕸🕷🕶🕵🕴🕰🕯🔭🔬🔫🔪🔩🔨🔧🔦🔥🔤🔢🔣🔡🔠🔗🔕🔔🔓🔒🔑🔐🔏🔌🔋🔊🔉🔈🔇🔅🔆📽📻📺📹📸📷📳📱📰📯📭📬📫📪📨📦📡📞📚📖📐📏📎📍📌📉📈📄📃📂📁💿💾💻💸💶💳💰💯💫💩💧💦💤💣💢💡💞💖💕💔💓💊💃💀👾👽👻👺👹👸👷👶👵👴👯👭👬👫👣👓👋👍👎🐾🐼🐻🐺🐹🐸🐷🐶🐵🐳🐲🐱🐰🐯🐮🐭🐬🐧🐦🐥🐤🐣🐢🐡🐠🐟🐞🐝🐜🐛🐙🐘🐔🐓🐒🐑🐐🐏🐎🐍🐌🐋🐊🐉🐈🐇🐆🐅🐄🐃🐂🐁🐀🏺🏹🏸🏷🏴🏳🏵🏰🏭🏬🏫🏪🏧🏢🏠🏡🏐🏍🏆🏅🏁🎼🎶🎵🎲🎰🎮🎬🎨🎧🎥🎞🎃🎄🍸🍷🍄🌿🍀🍁🍒🌵🌳🌲🌩🌪🌨🌧🌦🌥🌤🌡🌠🌟🌞🌝🌜🌛🌚🌙🌘🌗🌖🌕🌔🌓🌒🌑🌐🌏🌎🌍🌌🌋🌊🌅🌄🌂🌀";
for (const char *utf8 = string; *utf8; utf8 = ctx_utf8_skip (utf8, 1))
add_glyph (ctx, ctx_utf8_to_unichar (utf8));
}
for (int i = 0; i < n_glyphs; i++)
for (int j = 0; j < n_glyphs; j++)
{
float kerning = ctx_glyph_kern (ctx, glyphs[i], glyphs[j]);
if (kerning > 0.2)
{
CtxCommand command;
int pos = find_glyph (&output_font, glyphs[i]);
pos ++;
while (pos < output_font.count &&
output_font.entries[pos].code != CTX_DEFINE_GLYPH)
pos++;
command.code = CTX_KERNING_PAIR;
command.kern.glyph_before = glyphs[i];
command.kern.glyph_after = glyphs[j];
command.kern.amount = kerning * 256;
ctx_drawlist_insert_entry (&output_font, pos, (CtxEntry*)&command);
}
}
ctx_free (ctx);
if (!binary)
{
printf ("#ifndef CTX_FONT_%s\n", name);
printf ("/* this is a ctx encoded font based on %s */\n", basename (argv[1]));
printf ("/* CTX_SUBDIV:%i CTX_BAKE_FONT_SIZE:%i */\n", CTX_SUBDIV, CTX_BAKE_FONT_SIZE);
printf ("/* glyphs covered: \n\n");
int col = 0;
for (int i = 0; i < output_font.count; i++)
{
CtxEntry *entry = &output_font.entries[i];
if (entry->code == '@')
{
char buf[44]={0,0,0,0,0};
ctx_unichar_to_utf8 (entry->data.u32[0], (uint8_t*)buf);
switch (buf[0])
{
case '\\':
printf ("\\");
break;
default:
printf ("%s", buf);
}
col++;
if (col > 73)
{
col = 0;
printf ("\n ");
}
}
}
printf (" */\n");
printf ("static const struct __attribute__ ((packed)) {uint8_t code; uint32_t a; uint32_t b;}\nctx_font_%s[]={\n", name);
for (int i = 0; i < output_font.count; i++)
{
CtxEntry *entry = &output_font.entries[i];
if (entry->code > 32 && entry->code < 127)
{
printf ("{'%c', 0x%08x, 0x%08x},", entry->code,
entry->data.u32[0],
entry->data.u32[1]);
}
else
{
printf ("{%i, 0x%08x, 0x%08x},", entry->code,
entry->data.u32[0],
entry->data.u32[1]);
}
if (entry->code == '@')
{
char buf[44]={0,0,0,0,0};
ctx_unichar_to_utf8 (entry->data.u32[0], (uint8_t*)buf);
switch (buf[0])
{
case '\\':
printf ("/* \\ x-advance: %f */", entry->data.u32[1]/256.0);
break;
default:
printf ("/* %s x-advance: %f */", buf, entry->data.u32[1]/256.0);
}
}
else
{
}
printf ("\n");
}
printf ("};\n");
printf ("#define CTX_FONT_%s 1\n", name);
printf ("#endif\n");
}
else
{
for (int i = 0; i < output_font.count; i++)
{
CtxEntry *entry = &output_font.entries[i];
for (int c = 0; c < (int)sizeof (CtxEntry); c++)
printf ("%c",((uint8_t*)(entry))[c]);
}
}
return 0;
}
Source diff could not be displayed: it is too large. Options to address this: view the blob.
#include <math.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdint.h>
/* clang-format off */
#define CTX_MIN_EDGE_LIST_SIZE 256
#define CTX_MAX_EDGE_LIST_SIZE 512
#define CTX_MIN_JOURNAL_SIZE 512
#define CTX_MAX_JOURNAL_SIZE 512
#define CTX_LIMIT_FORMATS 1
#define CTX_DITHER 1
#define CTX_ENABLE_RGB565_BYTESWAPPED 1
#define CTX_BITPACK_PACKER 0
#define CTX_COMPOSITING_GROUPS 0
#define CTX_RENDERSTREAM_STATIC 0
#define CTX_GRADIENT_CACHE 1
#define CTX_ENABLE_CLIP 1
#define CTX_BLOATY_FAST_PATHS 0
#define CTX_1BIT_CLIP 1
#define CTX_RASTERIZER_AA 15
#define CTX_RASTERIZER_FORCE_AA 0
#define CTX_SHAPE_CACHE 0
#define CTX_SHAPE_CACHE_DIM 16*18
#define CTX_SHAPE_CACHE_ENTRIES 128
#define CTX_RASTERIZER_MAX_CIRCLE_SEGMENTS 36
#define CTX_RASTERIZER 1
#define CTX_EVENTS 0
#define CTX_STRINGPOOL_SIZE 512
#define CTX_ENABLE_SHADOW_BLUR 0
#define CTX_FORMATTER 0
#define CTX_PARSER 0
#define CTX_FONTS_FROM_FILE 0
/* clang-format on */
#define CTX_IMPLEMENTATION
/* Defining this causes the internal font to be dropped. */
#define _CTX_INTERNAL_FONT_
#include "font-fira-mono.h"
#include "ctx.h"
Source diff could not be displayed: it is too large. Options to address this: view the blob.