1
0
mirror of https://github.com/binary-kitchen/doorlockd synced 2024-07-01 11:27:44 +02:00
doorlockd-mirror/doorlockd/epaper/bsp.c
2015-09-25 00:50:07 +02:00

244 lines
6.7 KiB
C

/*****************************************************************************
*
* Copyright(C) 2012, Embedded Artists AB
* All rights reserved.
*
******************************************************************************
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* products. This software is supplied "AS IS" without any warranties.
* Embedded Artists AB assumes no responsibility or liability for the
* use of the software, conveys no license or title under any patent,
* copyright, or mask work right to the product. Embedded Artists AB
* reserves the right to make changes in the software without
* notification. Embedded Artists AB also make no representation or
* warranty that such application will be suitable for the specified
* use without further testing or modification.
*****************************************************************************/
/******************************************************************************
* Includes
*****************************************************************************/
#include "bsp.h"
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <wiringPiSPI.h>
#include <string.h>
/******************************************************************************
* Typedefs and defines
*****************************************************************************/
#define LM75A_I2C_ADDR 0x49 //(0x49 << 1)
#define LM75A_CMD_TEMP 0x00
#define DISPLAY_BUF_SZ (256)
/******************************************************************************
* Local variables
*****************************************************************************/
// I2C device handle
static int gI2cFd = -1;
// mapping between Serial Expansion connector and Raspberry Pi
// GPIOs. Raspberry Pi GPIO numbering according to wiringPi
static int pinMap[BSP_PIN_SZ*2] =
{
// [SEC] | [PI GPIO#]
BSP_PIN_6, 6, // CS
BSP_PIN_7, 0, // Busy
BSP_PIN_8, -1, // Not Used
BSP_PIN_11, 1, // PWM
BSP_PIN_12, 5, // RST
BSP_PIN_13, 3, // PWR_Ctrl
BSP_PIN_14, 4, // DISCHARGE
};
// buffer used when writing to display via SPI
static uint8_t displayBuf[DISPLAY_BUF_SZ];
/******************************************************************************
* Local functions
*****************************************************************************/
static int32_t lm75a_readTemp(void)
{
uint8_t temp[2];
int16_t t = 0;
wiringPiI2CWrite(gI2cFd, LM75A_CMD_TEMP);
temp[0] = wiringPiI2CRead(gI2cFd);
temp[1] = wiringPiI2CRead(gI2cFd);
// 11 MSB bits used. Celcius is calculated as Temp data * 1/8
t = ((temp[0] << 8) | (temp[1]));
return ((t * 100) >> 8);
}
/******************************************************************************
* Public functions
*****************************************************************************/
/******************************************************************************
*
* Description:
* BSP initialize function. Must be called before any other BSP related
* functions.
*
*****************************************************************************/
int bsp_init(void)
{
if (wiringPiSetup() < 0) {
printf("bsp_init: failed to initialize wiringPi\n");
return -1;
}
if ((gI2cFd = wiringPiI2CSetup(LM75A_I2C_ADDR)) < 0) {
printf("bsp_init: failed to initialize I2C\n");
return -1;
}
if (wiringPiSPISetup(0, 1000000) < 0) {
printf("bsp_init: failed to initialize SPI\n");
return -1;
}
return 0;
}
/******************************************************************************
*
* Description:
* Get number of milliseconds
*
*****************************************************************************/
uint32_t bsp_getMsTicks(void)
{
return millis();
}
/******************************************************************************
*
* Description:
* Initialize SPI
*
*****************************************************************************/
void bsp_spiInit(void)
{
// initialized in bsp_init
}
/******************************************************************************
*
* Description:
* Write data to the display
*
*****************************************************************************/
void bsp_writeToDisplay(uint8_t* data, uint16_t len)
{
if (len > DISPLAY_BUF_SZ) {
printf("bsp_writeToDisplay: ERROR len=%d > %d\n", len, DISPLAY_BUF_SZ);
return;
}
memcpy(displayBuf, data, len);
wiringPiSPIDataRW(0, displayBuf, len);
}
/******************************************************************************
*
* Description:
* Delay specified number of milliseconds
*
* Params:
* [in] ms - number of milliseconds to delay
*
*****************************************************************************/
void bsp_delayMs(uint32_t ms)
{
delay(ms);
}
/******************************************************************************
*
* Description:
* Delay specified number of microseconds
*
* Params:
* [in] us - number of microseconds to delay
*
*****************************************************************************/
void bsp_delayUs(uint32_t us)
{
delayMicroseconds(us);
}
/******************************************************************************
*
* Description:
* Read temperature
*
* Params:
* [out] temperature - (int16_t) temperature in Celsius
*
*****************************************************************************/
int16_t bsp_getTemp(void)
{
lm75a_readTemp();
bsp_delayMs(5);
return (int16_t)(lm75a_readTemp()/100);
}
/******************************************************************************
*
* Description:
* Set the PIN mode of a specific pin
*
*****************************************************************************/
void bsp_pinMode(bsp_pin_t pin, bps_pinMode_t mode)
{
int m = INPUT;
int p = 0;
if (pin >= BSP_PIN_SZ) return;
if (mode == BSP_PINMODE_OUTPUT) {
m = OUTPUT;
}
p = pinMap[pin*2+1];
pinMode(p, m);
}
/******************************************************************************
*
* Description:
* Set PIN to high (1) of low (0) value
*
*****************************************************************************/
void bsp_pinOut(bsp_pin_t pin, int value)
{
int p = 0;
int v = LOW;
if (pin >= BSP_PIN_SZ) return;
if (value != 0) {
v = HIGH;
}
p = pinMap[pin*2+1];
digitalWrite(p, v);
}