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_
|
||||
#define GPIO_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
|
||||
|
||||
/**
|
||||
* Defines possible modes for a gpio pin
|
||||
*/
|
||||
enum GPIO_MODE
|
||||
{
|
||||
INPUT = 0,
|
||||
OUTPUT,
|
||||
ALTERNATE,
|
||||
ANALOG
|
||||
INPUT = 0, /**< digital input */
|
||||
OUTPUT, /**< digital output */
|
||||
ALTERNATE, /**< alternate function */
|
||||
ANALOG /**< analog function */
|
||||
};
|
||||
|
||||
/**
|
||||
* Defines whether to use push-pull or open drain.
|
||||
*/
|
||||
enum GPIO_TYPE
|
||||
{
|
||||
PUSHPULL = 0,
|
||||
OPENDRAIN
|
||||
PUSHPULL = 0, /**< push-pull */
|
||||
OPENDRAIN /**< open drain */
|
||||
};
|
||||
|
||||
/**
|
||||
* Defines the pin's speed
|
||||
*/
|
||||
enum GPIO_SPEED
|
||||
{
|
||||
LOW = 0,
|
||||
MEDIUM,
|
||||
HIGH,
|
||||
VERYHIGH
|
||||
LOW = 0, /**< low */
|
||||
MEDIUM, /**< medium */
|
||||
HIGH, /**< high */
|
||||
VERYHIGH /**< very high/maximum */
|
||||
};
|
||||
|
||||
/**
|
||||
* Defines if a pullup or pulldown should be used.
|
||||
*/
|
||||
enum GPIO_PUPD
|
||||
{
|
||||
NOPUPD,
|
||||
PULLUP,
|
||||
PULLDOWN
|
||||
NOPUPD, /**< no pullup/pulldown */
|
||||
PULLUP, /**< use pullup */
|
||||
PULLDOWN /**< use pulldown */
|
||||
};
|
||||
|
||||
/**
|
||||
* Initializes the gpio.
|
||||
*/
|
||||
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);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
#endif // GPIO_H_
|
||||
|
@ -1,12 +1,40 @@
|
||||
/**
|
||||
* @file heap.h
|
||||
* A basic memory manager
|
||||
*/
|
||||
|
||||
#ifndef HEAP_H_
|
||||
#define HEAP_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);
|
||||
|
||||
/**
|
||||
* Allocates a chunk of memory.
|
||||
* @param size how many bytes to claim
|
||||
* @return pointer to the allocated buffer
|
||||
*/
|
||||
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);
|
||||
|
||||
/**
|
||||
* Frees the buffer allocated through malloc/calloc.
|
||||
* Please don't double-free.
|
||||
* @param the buffer to release
|
||||
*/
|
||||
void free(void *buf);
|
||||
|
||||
#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_
|
||||
#define RANDOM_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* Initializes the STM's true random number generator.
|
||||
*/
|
||||
void random_init(void);
|
||||
|
||||
/**
|
||||
* Gets the next random number from the generator.
|
||||
* @return the random number
|
||||
*/
|
||||
uint32_t random_get(void);
|
||||
|
||||
#endif // RANDOM_H_
|
||||
|
@ -1,8 +1,17 @@
|
||||
/**
|
||||
* @file script.h
|
||||
* Provides script library for using calculator hardware
|
||||
*/
|
||||
|
||||
#ifndef SCRIPT_H_
|
||||
#define SCRIPT_H_
|
||||
|
||||
#include <parser.h>
|
||||
|
||||
/**
|
||||
* Loads the library for the given interpreter.
|
||||
* @param it the interpreter to use
|
||||
*/
|
||||
void script_loadlib(interpreter *it);
|
||||
|
||||
#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