I/O port driver for LPC214x added.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1016 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
gdisirio 2009-06-02 13:41:38 +00:00
parent 1aa2773ad0
commit 2a7941ee58
16 changed files with 314 additions and 51 deletions

View File

@ -19,10 +19,10 @@
#include <ch.h>
#include <lpc214x.h>
#include <vic.h>
#include <lpc214x_serial.h>
//#include "lpc214x_ssp.h"
#include "lpc214x.h"
#include "vic.h"
#include "lpc214x_serial.h"
#include "lpc214x_ssp.h"
#include "board.h"
//#include "mmcsd.h"
@ -103,10 +103,11 @@ void hwinit0(void) {
PINSEL0 = VAL_PINSEL0;
PINSEL1 = VAL_PINSEL1;
PINSEL2 = VAL_PINSEL2;
IO0DIR = VAL_FIO0DIR;
IO0SET = 0xFFFFFFFF;
IO1DIR = VAL_FIO1DIR;
IO1SET = 0xFFFFFFFF;
ioport_init_lld();
ioport_lpc214x_set_direction_lld(IOPORT_A, VAL_FIO0DIR);
ioport_write_lld(IOPORT_A, 0xFFFFFFFF);
ioport_lpc214x_set_direction_lld(IOPORT_B, VAL_FIO1DIR);
ioport_write_lld(IOPORT_B, 0xFFFFFFFF);
}
/*

View File

@ -20,6 +20,14 @@
#ifndef _BOARD_H_
#define _BOARD_H_
#ifndef _LPC214X_H_
#include "lpc214x.h"
#endif
#ifndef _IOPORTS_LLD_H_
#include "ioports.h"
#endif
#define BOARD_OLIMEX_LCP_P2148
/*
@ -61,4 +69,17 @@
#define VAL_FIO0DIR 0xB0703C00
#define VAL_FIO1DIR 0x00000000
#define PA_LED1 IOPORT_BIT(10)
#define PA_LED2 IOPORT_BIT(11)
#define PA_BUZZ1 IOPORT_BIT(12)
#define PA_BUZZ2 IOPORT_BIT(13)
#define PA_BSL IOPORT_BIT(14)
#define PA_BUTTON1 IOPORT_BIT(15)
#define PA_BUTTON2 IOPORT_BIT(16)
#define PA_SSEL1 IOPORT_BIT(20)
#define PA_LEDUSB IOPORT_BIT(31)
#define PB_WP1 IOPORT_BIT(24)
#define PB_CP1 IOPORT_BIT(25)
#endif /* _BOARD_H_ */

View File

@ -18,11 +18,12 @@
*/
#include <ch.hpp>
#include <ioports.h>
#include <evtimer.h>
#include <test.h>
#include <lpc214x.h>
#include <board.h>
#include <lpc214x_serial.h>
using namespace chibios_rt;
@ -47,9 +48,9 @@ typedef struct {
// Flashing sequence for LED1.
static const seqop_t LED1_sequence[] =
{
{BITCLEAR, 0x00000400},
{BITCLEAR, PA_LED1},
{SLEEP, 200},
{BITSET, 0x00000400},
{BITSET, PA_LED1},
{SLEEP, 1800},
{GOTO, 0}
};
@ -58,9 +59,9 @@ static const seqop_t LED1_sequence[] =
static const seqop_t LED2_sequence[] =
{
{SLEEP, 1000},
{BITCLEAR, 0x00000800},
{BITCLEAR, PA_LED2},
{SLEEP, 200},
{BITSET, 0x00000800},
{BITSET, PA_LED2},
{SLEEP, 1800},
{GOTO, 1}
};
@ -68,9 +69,9 @@ static const seqop_t LED2_sequence[] =
// Flashing sequence for LED3.
static const seqop_t LED3_sequence[] =
{
{BITCLEAR, 0x80000000},
{BITCLEAR, PA_LEDUSB},
{SLEEP, 200},
{BITSET, 0x80000000},
{BITSET, PA_LEDUSB},
{SLEEP, 300},
{GOTO, 0}
};
@ -97,10 +98,10 @@ protected:
case STOP:
return 0;
case BITCLEAR:
IO0CLR = curr->value;
chPortClear(IOPORT_A, curr->value);
break;
case BITSET:
IO0SET = curr->value;
chPortSet(IOPORT_A, curr->value);
break;
}
curr++;
@ -135,7 +136,7 @@ public:
*/
static void TimerHandler(eventid_t id) {
if (!(IO0PIN & 0x00018000)) { // Both buttons
if (!(chPortRead(IOPORT_A) & (PA_BUTTON1 | PA_BUTTON2))) { // Both buttons
TesterThread tester;
tester.Wait();
};

View File

@ -103,10 +103,11 @@ void hwinit0(void) {
PINSEL0 = VAL_PINSEL0;
PINSEL1 = VAL_PINSEL1;
PINSEL2 = VAL_PINSEL2;
IO0DIR = VAL_FIO0DIR;
IO0SET = 0xFFFFFFFF;
IO1DIR = VAL_FIO1DIR;
IO1SET = 0xFFFFFFFF;
ioport_init_lld();
ioport_lpc214x_set_direction_lld(IOPORT_A, VAL_FIO0DIR);
ioport_write_lld(IOPORT_A, 0xFFFFFFFF);
ioport_lpc214x_set_direction_lld(IOPORT_B, VAL_FIO1DIR);
ioport_write_lld(IOPORT_B, 0xFFFFFFFF);
}
/*

View File

@ -20,6 +20,14 @@
#ifndef _BOARD_H_
#define _BOARD_H_
#ifndef _LPC214X_H_
#include "lpc214x.h"
#endif
#ifndef _IOPORTS_LLD_H_
#include "ioports.h"
#endif
#define BOARD_OLIMEX_LCP_P2148
/*
@ -61,4 +69,16 @@
#define VAL_FIO0DIR 0xB0703C00
#define VAL_FIO1DIR 0x00000000
#define PA_LED1 IOPORT_BIT(10)
#define PA_LED2 IOPORT_BIT(11)
#define PA_BUZZ1 IOPORT_BIT(12)
#define PA_BUZZ2 IOPORT_BIT(13)
#define PA_BSL IOPORT_BIT(14)
#define PA_BUTTON1 IOPORT_BIT(15)
#define PA_BUTTON2 IOPORT_BIT(16)
#define PA_SSEL1 IOPORT_BIT(20)
#define PA_WP1 IOPORT_BIT(24)
#define PA_CP1 IOPORT_BIT(25)
#define PA_LEDUSB IOPORT_BIT(31)
#endif /* _BOARD_H_ */

View File

@ -19,7 +19,7 @@
#include <ch.h>
#include "lpc214x.h"
#include "board.h"
/*
* Red LEDs blinker thread, times are in milliseconds.
@ -28,13 +28,13 @@ static WORKING_AREA(waThread1, 128);
static msg_t Thread1(void *arg) {
while (TRUE) {
IO0CLR = 0x00000800;
chPortClear(IOPORT_A, PA_LED2);
chThdSleepMilliseconds(200);
IO0SET = 0x00000C00;
chPortSet(IOPORT_A, PA_LED1 | PA_LED2);
chThdSleepMilliseconds(800);
IO0CLR = 0x00000400;
chPortClear(IOPORT_A, PA_LED1);
chThdSleepMilliseconds(200);
IO0SET = 0x00000C00;
chPortSet(IOPORT_A, PA_LED1 | PA_LED2);
chThdSleepMilliseconds(800);
}
return 0;
@ -47,9 +47,9 @@ static WORKING_AREA(waThread2, 128);
static msg_t Thread2(void *arg) {
while (TRUE) {
IO0CLR = 0x80000000;
chPortClear(IOPORT_A, PA_LEDUSB);
chThdSleepMilliseconds(200);
IO0SET = 0x80000000;
chPortSet(IOPORT_A, PA_LEDUSB);
chThdSleepMilliseconds(300);
}
return 0;

View File

@ -103,10 +103,11 @@ void hwinit0(void) {
PINSEL0 = VAL_PINSEL0;
PINSEL1 = VAL_PINSEL1;
PINSEL2 = VAL_PINSEL2;
IO0DIR = VAL_FIO0DIR;
IO0SET = 0xFFFFFFFF;
IO1DIR = VAL_FIO1DIR;
IO1SET = 0xFFFFFFFF;
ioport_init_lld();
ioport_lpc214x_set_direction_lld(IOPORT_A, VAL_FIO0DIR);
ioport_write_lld(IOPORT_A, 0xFFFFFFFF);
ioport_lpc214x_set_direction_lld(IOPORT_B, VAL_FIO1DIR);
ioport_write_lld(IOPORT_B, 0xFFFFFFFF);
}
/*

View File

@ -20,6 +20,14 @@
#ifndef _BOARD_H_
#define _BOARD_H_
#ifndef _LPC214X_H_
#include "lpc214x.h"
#endif
#ifndef _IOPORTS_LLD_H_
#include "ioports.h"
#endif
#define BOARD_OLIMEX_LCP_P2148
/*
@ -61,4 +69,17 @@
#define VAL_FIO0DIR 0xB0703C00
#define VAL_FIO1DIR 0x00000000
#define PA_LED1 IOPORT_BIT(10)
#define PA_LED2 IOPORT_BIT(11)
#define PA_BUZZ1 IOPORT_BIT(12)
#define PA_BUZZ2 IOPORT_BIT(13)
#define PA_BSL IOPORT_BIT(14)
#define PA_BUTTON1 IOPORT_BIT(15)
#define PA_BUTTON2 IOPORT_BIT(16)
#define PA_SSEL1 IOPORT_BIT(20)
#define PA_LEDUSB IOPORT_BIT(31)
#define PB_WP1 IOPORT_BIT(24)
#define PB_CP1 IOPORT_BIT(25)
#endif /* _BOARD_H_ */

View File

@ -20,7 +20,7 @@
#include <ch.h>
#include <test.h>
#include "lpc214x.h"
#include "board.h"
#include "lpc214x_serial.h"
#include "mmcsd.h"
#include "buzzer.h"
@ -33,13 +33,13 @@ static WORKING_AREA(waThread1, 128);
static msg_t Thread1(void *arg) {
while (TRUE) {
IO0CLR = 0x00000800;
chPortClear(IOPORT_A, PA_LED2);
chThdSleepMilliseconds(200);
IO0SET = 0x00000C00;
chPortSet(IOPORT_A, PA_LED1 | PA_LED2);
chThdSleepMilliseconds(800);
IO0CLR = 0x00000400;
chPortClear(IOPORT_A, PA_LED1);
chThdSleepMilliseconds(200);
IO0SET = 0x00000C00;
chPortSet(IOPORT_A, PA_LED1 | PA_LED2);
chThdSleepMilliseconds(800);
}
return 0;
@ -52,9 +52,9 @@ static WORKING_AREA(waThread2, 128);
static msg_t Thread2(void *arg) {
while (TRUE) {
IO0CLR = 0x80000000;
chPortClear(IOPORT_A, PA_LEDUSB);
chThdSleepMilliseconds(200);
IO0SET = 0x80000000;
chPortSet(IOPORT_A, PA_LEDUSB);
chThdSleepMilliseconds(300);
}
return 0;
@ -67,16 +67,16 @@ static WORKING_AREA(waTestThread, 128);
*/
static void TimerHandler(eventid_t id) {
if (!(IO0PIN & 0x00018000)) { // Both buttons
if (!(chPortRead(IOPORT_A) & (PA_BUTTON1 | PA_BUTTON2))) {
Thread *tp = chThdCreateStatic(waTestThread, sizeof(waTestThread),
NORMALPRIO, TestThread, &COM1);
chThdWait(tp);
PlaySound(500, MS2ST(100));
}
else {
if (!(IO0PIN & 0x00008000)) // Button 1
if (!(chPortRead(IOPORT_A) & PA_BUTTON1))
PlaySound(1000, MS2ST(100));
if (!(IO0PIN & 0x00010000)) { // Button 2
if (!(chPortRead(IOPORT_A) & PA_BUTTON2)) {
chFDDWrite(&COM1, (uint8_t *)"Hello World!\r\n", 14);
PlaySound(2000, MS2ST(100));
}
@ -129,7 +129,7 @@ int main(int argc, char **argv) {
* If a button is pressed during the reset then the blinking leds threads
* are not started in order to make accurate benchmarks.
*/
if ((IO0PIN & 0x00018000) == 0x00018000) {
if (chPortRead(IOPORT_A) && (PA_BUTTON1 | PA_BUTTON2) == (PA_BUTTON1 | PA_BUTTON2)) {
chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);
chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL);
}

View File

@ -19,7 +19,7 @@
#include <ch.h>
#include "lpc214x.h"
#include "board.h"
#include "lpc214x_ssp.h"
#include "mmcsd.h"
@ -42,7 +42,7 @@ void InitMMC(void) {
void tmrfunc(void *par) {
if (cnt) {
if (!(IO1PIN & (1 << 25))) {
if (!(chPortRead(IOPORT_B) & PB_CP1)) {
if (!--cnt)
chEvtBroadcastI(&MMCInsertEventSource);
}
@ -50,7 +50,7 @@ void tmrfunc(void *par) {
cnt = POLLING_INTERVAL;
}
else {
if (IO1PIN & (1 << 25)) {
if (chPortRead(IOPORT_B) & PB_CP1) {
cnt = POLLING_INTERVAL;
chEvtBroadcastI(&MMCRemoveEventSource);
}

View File

@ -0,0 +1,174 @@
/*
ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
ChibiOS/RT is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/RT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file ports/ARM-LPC214x/ioports_lld.h
* @brief LPC214x FIO low level driver
* @addtogroup LPC214X_IOPORTS
* @{
*/
#ifndef _IOPORTS_LLD_H_
#define _IOPORTS_LLD_H_
#ifndef _LPC214X_H_
#include "lpc214x.h"
#endif
/*===========================================================================*/
/* I/O Ports Types and constants. */
/*===========================================================================*/
/**
* @brief Width, in bits, of an I/O port.
*/
#define IOPORTS_WIDTH 32
/**
* @brief Digital I/O port sized unsigned type.
*/
typedef uint32_t ioportmask_t;
/**
* @brief Port Identifier.
*/
typedef FIO * ioportid_t;
/*===========================================================================*/
/* I/O Ports Identifiers. */
/*===========================================================================*/
/**
* @brief FIO port 0 identifier.
*/
#define IOPORT_A FIO0Base
/**
* @brief FIO port 1 identifier.
*/
#define IOPORT_B FIO1Base
/*===========================================================================*/
/* Implementation, some of the following macros could be implemented as */
/* functions, please put them in a file named ioports_lld.c if so. */
/*===========================================================================*/
/**
* @brief FIO subsystem initialization.
* @details Enables the access through the fast registers.
*/
#define ioport_init_lld() { \
SCS = 3; \
}
/**
* @brief Writes a bits mask on a I/O port.
*
* @param[in] port the port identifier
* @param[in] bits the bits to be written on the specified port
*
* @note This function is not meant to be invoked directly by the application
* code.
*/
#define ioport_write_lld(port, bits) ((port)->FIO_PIN = (bits))
/**
* @brief Reads an I/O port.
*
* @param[in] port the port identifier
* @return the port bits
*
* @note This function is not meant to be invoked directly by the application
* code.
*/
#define ioport_read_lld(port) ((port)->FIO_PIN)
/**
* @brief Sets a bits mask on a I/O port.
*
* @param[in] port the port identifier
* @param[in] bits the bits to be ORed on the specified port
*
* @note This function is not meant to be invoked directly by the application
* code.
*/
#define ioport_set_lld(port, bits) ((port)->FIO_SET = (bits))
/**
* @brief Clears a bits mask on a I/O port.
*
* @param[in] port the port identifier
* @param[in] bits the bits to be cleared on the specified port
*
* @note This function is not meant to be invoked directly by the application
* code.
*/
#define ioport_clear_lld(port, bits) ((port)->FIO_CLR = (bits))
/**
* @brief Toggles a bits mask on a I/O port.
*
* @param[in] port the port identifier
* @param[in] bits the bits to be XORed on the specified port
*
* @note This function is not meant to be invoked directly by the application
* code.
*/
#define ioport_toggle_lld(port, bits) ((port)->FIO_PIN ^= (bits))
/**
* @brief Writes a value on an I/O bus.
*
* @param[in] bus the I/O bus, pointer to a @p IOBus structure
* @param[in] bits the bits to be written on the I/O bus. Values exceeding
* the bus width are masked so most significant bits are lost.
*
* @note This function is not meant to be invoked directly by the application
* code.
*/
#define ioport_writebus_lld(bus, bits) { \
(port)->FIO_MASK = (bus)->bus_mask; \
(port)->FIO_PIN = (bits) << (bus)->bus_offset; \
(port)->FIO_MASK = 0; \
}
/**
* @brief Reads a value from an I/O bus.
*
* @param[in] bus the I/O bus, pointer to a @p IOBus structure
* @return the bus bits
*
* @note This function is not meant to be invoked directly by the application
* code.
*/
#define ioport_readbus_lld(bus) \
(((bus)->bus_portid->FIO_PIN & (bus)->bus_mask) >> (bus)->bus_offset)
/**
* @brief FIO port setup.
* @details This function initializes a FIO port, note that this functionality
* is LPC214x specific and non portable.
*/
#define ioport_lpc214x_set_direction_lld(port, dir) { \
(port)->FIO_DIR = (dir); \
}
#endif /* _IOPORTS_LLD_H_ */
/** @} */

View File

@ -17,6 +17,11 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file lpc214x.h
* @brief LPC214x register definitions
*/
#ifndef _LPC214X_H_
#define _LPC214X_H_

View File

@ -25,6 +25,7 @@
*/
#include <ch.h>
#include <ioports.h>
#include "lpc214x.h"
#include "lpc214x_ssp.h"
@ -43,7 +44,7 @@ void sspAcquireBus(void) {
#if LPC214x_SSP_USE_MUTEX
chSemWait(&me);
#endif
IO0CLR = 1 << 20;
chPortClear(IOPORT_A, (1 << 20));
}
/**
@ -53,7 +54,7 @@ void sspAcquireBus(void) {
*/
void sspReleaseBus(void) {
IO0SET = 1 << 20;
chPortSet(IOPORT_A, (1 << 20));
#if LPC214x_SSP_USE_MUTEX
chSemSignal(&me);
#endif

View File

@ -23,6 +23,7 @@
* @brief LPC214x specific support.
* @details The LPC214x support includes:
* - VIC support code.
* - I/O ports driver.
* - Buffered, interrupt driven, serial driver.
* - SSP driver.
* - A MMC/SD demo driver.
@ -44,6 +45,21 @@
*/
/** @} */
/**
* @defgroup LPC214x_IOPORTS I/O Ports Support
* @brief I/O Ports peripherals support.
* @details This module supports the LPC214x FIO controller. The controller
* supports the following features (see @ref IOPorts):
* - 32 bits wide ports.
* - Atomic set/reset functions.
* - Atomic set+reset function (atomic bus operations).
* - Output latched regardless of the pad setting.
* - Direct read of input pads regardless of the pad setting.
* .
* The only non atomic operations are bit toggling and bus writing.
* @ingroup LPC214x
*/
/**
* @defgroup LPC214x_SERIAL UART Support
* @{

View File

@ -21,6 +21,7 @@
* @defgroup STM32F103 STM32F103 Support
* @brief STM32F103 specific support.
* @details The STM32F103 support includes:
* - I/O ports driver.
* - Buffered, interrupt driven, serial driver.
* - A demo supporting the kernel test suite.
* .

View File

@ -70,8 +70,8 @@ GNU-Linux-GCC - ChibiOS/RT simulator for x86 Linux systems, it is
interface for digital I/O operations, this should help to create more
portable applications and, in general, make easier to work with ChibiOS/RT
on multiple architectures.
- NEW: Port driver for STM32, cleaned up the initialization code in board.c to
use the port driver macros.
- NEW: Port drivers for STM32 and LPC214x, cleaned up the initialization code
in board.c to use the port driver macros.
- Documentation section reorganization and fixes.
- Changed the STM32 demo stack sizes, it was incorrectly adjusted in version
1.3.0 but it did not create problems (not a bug).