keypad support, making stuff good
parent
4614429f57
commit
51b884c44c
@ -1,46 +1,116 @@
|
|||||||
|
/**
|
||||||
|
* @file gpio.h
|
||||||
|
* Abstracts gpio access, makes things easier
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef GPIO_H_
|
#ifndef GPIO_H_
|
||||||
#define GPIO_H_
|
#define GPIO_H_
|
||||||
|
|
||||||
#include <stm32l476xx.h>
|
#include <stm32l476xx.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helps simplify gpio calls.
|
||||||
|
* @param p port, e.g. GPIOA
|
||||||
|
* @param b pin, e.g. 4
|
||||||
|
*/
|
||||||
#define GPIO_PORT(p, b) GPIO##p, b
|
#define GPIO_PORT(p, b) GPIO##p, b
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines possible modes for a gpio pin
|
||||||
|
*/
|
||||||
enum GPIO_MODE
|
enum GPIO_MODE
|
||||||
{
|
{
|
||||||
INPUT = 0,
|
INPUT = 0, /**< digital input */
|
||||||
OUTPUT,
|
OUTPUT, /**< digital output */
|
||||||
ALTERNATE,
|
ALTERNATE, /**< alternate function */
|
||||||
ANALOG
|
ANALOG /**< analog function */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines whether to use push-pull or open drain.
|
||||||
|
*/
|
||||||
enum GPIO_TYPE
|
enum GPIO_TYPE
|
||||||
{
|
{
|
||||||
PUSHPULL = 0,
|
PUSHPULL = 0, /**< push-pull */
|
||||||
OPENDRAIN
|
OPENDRAIN /**< open drain */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the pin's speed
|
||||||
|
*/
|
||||||
enum GPIO_SPEED
|
enum GPIO_SPEED
|
||||||
{
|
{
|
||||||
LOW = 0,
|
LOW = 0, /**< low */
|
||||||
MEDIUM,
|
MEDIUM, /**< medium */
|
||||||
HIGH,
|
HIGH, /**< high */
|
||||||
VERYHIGH
|
VERYHIGH /**< very high/maximum */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines if a pullup or pulldown should be used.
|
||||||
|
*/
|
||||||
enum GPIO_PUPD
|
enum GPIO_PUPD
|
||||||
{
|
{
|
||||||
NOPUPD,
|
NOPUPD, /**< no pullup/pulldown */
|
||||||
PULLUP,
|
PULLUP, /**< use pullup */
|
||||||
PULLDOWN
|
PULLDOWN /**< use pulldown */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the gpio.
|
||||||
|
*/
|
||||||
void gpio_init(void);
|
void gpio_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables or disables pullup/pulldown for the given pin.
|
||||||
|
* @param port the port, e.g. GPIOA
|
||||||
|
* @param pin the pin
|
||||||
|
* @param pupd pullup/pulldown enable
|
||||||
|
* @see GPIO_PUPD
|
||||||
|
*/
|
||||||
void gpio_pupd(GPIO_TypeDef *port, uint8_t pin, uint8_t pupd);
|
void gpio_pupd(GPIO_TypeDef *port, uint8_t pin, uint8_t pupd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether to use push-pull or open drain for the given pin.
|
||||||
|
* @param port the port
|
||||||
|
* @param pin the pin
|
||||||
|
* @param type what to use
|
||||||
|
* @see GPIO_TYPE
|
||||||
|
*/
|
||||||
void gpio_type(GPIO_TypeDef *port, uint8_t pin, uint8_t type);
|
void gpio_type(GPIO_TypeDef *port, uint8_t pin, uint8_t type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the pin's speed.
|
||||||
|
* @param port the port
|
||||||
|
* @param pin the pin
|
||||||
|
* @param speed the speed to use
|
||||||
|
* @see GPIO_SPEED
|
||||||
|
*/
|
||||||
void gpio_speed(GPIO_TypeDef *port, uint8_t pin, uint8_t speed);
|
void gpio_speed(GPIO_TypeDef *port, uint8_t pin, uint8_t speed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the pin's i/o mode.
|
||||||
|
* @param port the port
|
||||||
|
* @param pin the pin
|
||||||
|
* @param mode the mode to use
|
||||||
|
* @see GPIO_MODE
|
||||||
|
*/
|
||||||
void gpio_mode(GPIO_TypeDef *port, uint8_t pin, uint8_t mode);
|
void gpio_mode(GPIO_TypeDef *port, uint8_t pin, uint8_t mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the state of a digital output pin.
|
||||||
|
* @param port the port
|
||||||
|
* @param pin the pin
|
||||||
|
* @param val non-zero for high, zero for low
|
||||||
|
*/
|
||||||
void gpio_dout(GPIO_TypeDef *port, uint8_t pin, uint8_t val);
|
void gpio_dout(GPIO_TypeDef *port, uint8_t pin, uint8_t val);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a digital input pin.
|
||||||
|
* @param port the port
|
||||||
|
* @param pin the pin
|
||||||
|
* @return non-zero for high, zero for low
|
||||||
|
*/
|
||||||
uint8_t gpio_din(GPIO_TypeDef *port, uint8_t pin);
|
uint8_t gpio_din(GPIO_TypeDef *port, uint8_t pin);
|
||||||
|
|
||||||
#endif // GPIO_H_
|
#endif // GPIO_H_
|
||||||
|
@ -1,12 +1,40 @@
|
|||||||
|
/**
|
||||||
|
* @file heap.h
|
||||||
|
* A basic memory manager
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef HEAP_H_
|
#ifndef HEAP_H_
|
||||||
#define HEAP_H_
|
#define HEAP_H_
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes memory management of the given heap.
|
||||||
|
* No overflow stuff is done, so...
|
||||||
|
* @param buf the heap to use for allocations
|
||||||
|
*/
|
||||||
void heap_init(void *buf);
|
void heap_init(void *buf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a chunk of memory.
|
||||||
|
* @param size how many bytes to claim
|
||||||
|
* @return pointer to the allocated buffer
|
||||||
|
*/
|
||||||
void *malloc(uint32_t size);
|
void *malloc(uint32_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates and zeros a chunk of memory.
|
||||||
|
* @param count how many of whatever to allocate
|
||||||
|
* @param size byte count of each whatever
|
||||||
|
* @return pointer to the allocated buffer
|
||||||
|
*/
|
||||||
void *calloc(uint32_t count, uint32_t size);
|
void *calloc(uint32_t count, uint32_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees the buffer allocated through malloc/calloc.
|
||||||
|
* Please don't double-free.
|
||||||
|
* @param the buffer to release
|
||||||
|
*/
|
||||||
void free(void *buf);
|
void free(void *buf);
|
||||||
|
|
||||||
#endif // HEAP_H_
|
#endif // HEAP_H_
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef KEYPAD_H_
|
||||||
|
#define KEYPAD_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define K0 (1 << 0)
|
||||||
|
#define K1 (1 << 1)
|
||||||
|
#define K2 (1 << 2)
|
||||||
|
#define K3 (1 << 3)
|
||||||
|
#define K4 (1 << 4)
|
||||||
|
#define K5 (1 << 5)
|
||||||
|
#define K6 (1 << 6)
|
||||||
|
#define K7 (1 << 7)
|
||||||
|
#define K8 (1 << 8)
|
||||||
|
#define K9 (1 << 9)
|
||||||
|
#define KS (1 << 10)
|
||||||
|
#define KP (1 << 11)
|
||||||
|
|
||||||
|
void keypad_init(void);
|
||||||
|
|
||||||
|
uint16_t keypad_get(void);
|
||||||
|
uint8_t keypad_isdown(uint16_t);
|
||||||
|
|
||||||
|
#endif // KEYPAD_H_
|
@ -1,9 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* @file random.h
|
||||||
|
* Provides true random number generation functionality
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef RANDOM_H_
|
#ifndef RANDOM_H_
|
||||||
#define RANDOM_H_
|
#define RANDOM_H_
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the STM's true random number generator.
|
||||||
|
*/
|
||||||
void random_init(void);
|
void random_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the next random number from the generator.
|
||||||
|
* @return the random number
|
||||||
|
*/
|
||||||
uint32_t random_get(void);
|
uint32_t random_get(void);
|
||||||
|
|
||||||
#endif // RANDOM_H_
|
#endif // RANDOM_H_
|
||||||
|
@ -1,8 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @file script.h
|
||||||
|
* Provides script library for using calculator hardware
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SCRIPT_H_
|
#ifndef SCRIPT_H_
|
||||||
#define SCRIPT_H_
|
#define SCRIPT_H_
|
||||||
|
|
||||||
#include <parser.h>
|
#include <parser.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the library for the given interpreter.
|
||||||
|
* @param it the interpreter to use
|
||||||
|
*/
|
||||||
void script_loadlib(interpreter *it);
|
void script_loadlib(interpreter *it);
|
||||||
|
|
||||||
#endif // SCRIPT_H_
|
#endif // SCRIPT_H_
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo "Making initrd.img..."
|
|
||||||
rm -f initrd.img
|
|
||||||
arm-none-eabi-ar r initrd.img initrd/*
|
|
@ -0,0 +1,63 @@
|
|||||||
|
#include <keypad.h>
|
||||||
|
#include <gpio.h>
|
||||||
|
|
||||||
|
#define PIN_0 GPIO_PORT(A, 11)
|
||||||
|
#define PIN_1 GPIO_PORT(B, 13)
|
||||||
|
#define PIN_2 GPIO_PORT(B, 2)
|
||||||
|
#define PIN_3 GPIO_PORT(A, 12)
|
||||||
|
#define PIN_4 GPIO_PORT(B, 14)
|
||||||
|
#define PIN_5 GPIO_PORT(B, 11)
|
||||||
|
#define PIN_6 GPIO_PORT(C, 5)
|
||||||
|
#define PIN_7 GPIO_PORT(B, 15)
|
||||||
|
#define PIN_8 GPIO_PORT(B, 12)
|
||||||
|
#define PIN_9 GPIO_PORT(C, 6)
|
||||||
|
#define PIN_S GPIO_PORT(B, 1)
|
||||||
|
#define PIN_P GPIO_PORT(C, 8)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
GPIO_TypeDef *port;
|
||||||
|
uint16_t pin;
|
||||||
|
uint16_t keycode;
|
||||||
|
} key_t;
|
||||||
|
|
||||||
|
static const key_t keypad_map[12] = {
|
||||||
|
{ PIN_0, K0 },
|
||||||
|
{ PIN_1, K1 },
|
||||||
|
{ PIN_2, K2 },
|
||||||
|
{ PIN_3, K3 },
|
||||||
|
{ PIN_4, K4 },
|
||||||
|
{ PIN_5, K5 },
|
||||||
|
{ PIN_6, K6 },
|
||||||
|
{ PIN_7, K7 },
|
||||||
|
{ PIN_8, K8 },
|
||||||
|
{ PIN_9, K9 },
|
||||||
|
{ PIN_S, KS },
|
||||||
|
{ PIN_P, KP }
|
||||||
|
};
|
||||||
|
|
||||||
|
void keypad_init(void)
|
||||||
|
{
|
||||||
|
for (uint8_t i = 0; i < 12; i++) {
|
||||||
|
GPIO_TypeDef *p = keypad_map[i].port;
|
||||||
|
uint16_t pin = keypad_map[i].pin;
|
||||||
|
gpio_mode(p, pin, OUTPUT);
|
||||||
|
gpio_dout(p, pin, 0);
|
||||||
|
gpio_mode(p, pin, INPUT);
|
||||||
|
gpio_pupd(p, pin, PULLDOWN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t keypad_get(void)
|
||||||
|
{
|
||||||
|
uint16_t state = 0;
|
||||||
|
for (uint8_t i = 0; i < 12; i++) {
|
||||||
|
if (gpio_din(keypad_map[i].port, keypad_map[i].pin))
|
||||||
|
state |= keypad_map[i].keycode;
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t keypad_isdown(uint16_t keycode)
|
||||||
|
{
|
||||||
|
return (keypad_get() & keycode);
|
||||||
|
}
|
Loading…
Reference in New Issue