Add pwm led code from sniffonly branch
git-svn-id: https://svn.openpcd.org:2342/trunk@435 6dc7ffe9-61d6-0310-9af1-9938baff3ed1
This commit is contained in:
parent
ad5b96d584
commit
5b3bd67fb9
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,13 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
a = range(1001)
|
||||||
|
|
||||||
|
#b = [ (pow(10, (float(e)/500))) * 202 - 202 for e in a]
|
||||||
|
b = [ 65534 * (pow((float(e)/1000), 2)) for e in a]
|
||||||
|
maximum = max(b)+1
|
||||||
|
|
||||||
|
print "/* Autogenerated from gammatable.py */"
|
||||||
|
print "const u_int16_t gammatable[] = {" + ", ".join( [str(int(round(int(e)))) for e in b] ) + "};"
|
||||||
|
print "#define GAMMA_MAX %i" % maximum
|
||||||
|
print "#define GAMMA_LEN %i" % len(b)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
* OpenBeacon.org - LED support
|
* OpenBeacon.org - LED support
|
||||||
*
|
*
|
||||||
* Copyright 2007 Milosch Meriac <meriac@openbeacon.de>
|
* Copyright 2007 Milosch Meriac <meriac@openbeacon.de>
|
||||||
|
* Copyright 2008 Henryk Plötz <henryk@ploetzli.ch>
|
||||||
*
|
*
|
||||||
***************************************************************
|
***************************************************************
|
||||||
|
|
||||||
|
@ -27,43 +28,102 @@
|
||||||
#include <board.h>
|
#include <board.h>
|
||||||
#include <task.h>
|
#include <task.h>
|
||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
|
||||||
|
#include "gammatable.inc"
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
#define BLINK_TIME 5
|
#define BLINK_TIME 5
|
||||||
|
#define PWM_PERIOD GAMMA_MAX
|
||||||
|
const struct channel_definition {
|
||||||
|
int channel_no;
|
||||||
|
enum { PERIPH_NONE=0, PERIPH_A, PERIPH_B} periph;
|
||||||
|
AT91PS_PWMC_CH channel;
|
||||||
|
}
|
||||||
|
pwm_channels[] = {
|
||||||
|
[0] = {0, PERIPH_A, AT91C_BASE_PWMC_CH0},
|
||||||
|
[1] = {1, PERIPH_A, AT91C_BASE_PWMC_CH1},
|
||||||
|
[2] = {2, PERIPH_A, AT91C_BASE_PWMC_CH2},
|
||||||
|
[7] = {3, PERIPH_B, AT91C_BASE_PWMC_CH3},
|
||||||
|
[11] = {0, PERIPH_B, AT91C_BASE_PWMC_CH0},
|
||||||
|
[12] = {1, PERIPH_B, AT91C_BASE_PWMC_CH1},
|
||||||
|
[13] = {2, PERIPH_B, AT91C_BASE_PWMC_CH2},
|
||||||
|
[14] = {3, PERIPH_B, AT91C_BASE_PWMC_CH3},
|
||||||
|
[23] = {0, PERIPH_B, AT91C_BASE_PWMC_CH0},
|
||||||
|
[24] = {1, PERIPH_B, AT91C_BASE_PWMC_CH1},
|
||||||
|
[25] = {2, PERIPH_B, AT91C_BASE_PWMC_CH2},
|
||||||
|
};
|
||||||
|
|
||||||
void vLedSetRed(bool_t on)
|
static const struct channel_definition* find_channel(unsigned int led)
|
||||||
|
{
|
||||||
|
unsigned int pos = ffs(led);
|
||||||
|
if(pos==0) return 0;
|
||||||
|
|
||||||
|
if(pos-1 >= sizeof(pwm_channels) / sizeof(pwm_channels[0]) ) return 0;
|
||||||
|
if(pwm_channels[pos-1].periph == PERIPH_NONE) return 0;
|
||||||
|
return &pwm_channels[pos-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Brightness is in per thousand
|
||||||
|
void vLedSetBrightness(unsigned int led, int brightness)
|
||||||
|
{
|
||||||
|
const struct channel_definition *c = find_channel(led);
|
||||||
|
if(c==0) return;
|
||||||
|
|
||||||
|
if(brightness < 0) brightness = 0;
|
||||||
|
if(brightness > GAMMA_LEN-1) brightness = GAMMA_LEN-1;
|
||||||
|
|
||||||
|
int duty = gammatable[brightness];
|
||||||
|
if(duty > 1) {
|
||||||
|
c->channel->PWMC_CUPDR = duty;
|
||||||
|
if(c->periph == PERIPH_A) {
|
||||||
|
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, led, 0);
|
||||||
|
} else if(c->periph == PERIPH_B) {
|
||||||
|
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, 0, led);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
vLedSet(led, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void vLedSet(int led, bool_t on)
|
||||||
{
|
{
|
||||||
if(on)
|
if(on)
|
||||||
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED_RED );
|
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led );
|
||||||
else
|
else
|
||||||
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_RED );
|
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led );
|
||||||
|
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, led );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vLedBlink(int led)
|
||||||
|
{
|
||||||
|
volatile int i=0;
|
||||||
|
vLedSet(led, 1);
|
||||||
|
for(i=0; i<BLINK_TIME; i++) {vLedSet(led,0);vLedSet(led,1);}
|
||||||
|
vLedSet(led, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
void vLedSetRed(bool_t on)
|
||||||
|
{
|
||||||
|
vLedSet(LED_RED, on);
|
||||||
|
}
|
||||||
|
|
||||||
void vLedBlinkRed(void)
|
void vLedBlinkRed(void)
|
||||||
{
|
{
|
||||||
volatile int i=0;
|
vLedBlink(LED_RED);
|
||||||
vLedSetRed(1);
|
|
||||||
for(i=0; i<BLINK_TIME; i++) {vLedSetRed(0);vLedSetRed(1);}
|
|
||||||
vLedSetRed(0);
|
|
||||||
}
|
}
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
void vLedSetGreen(bool_t on)
|
void vLedSetGreen(bool_t on)
|
||||||
{
|
{
|
||||||
if(on)
|
vLedSet(LED_GREEN, on);
|
||||||
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED_GREEN );
|
|
||||||
else
|
|
||||||
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_GREEN );
|
|
||||||
}
|
}
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
void vLedBlinkGreen(void)
|
void vLedBlinkGreen(void)
|
||||||
{
|
{
|
||||||
volatile int i=0;
|
vLedBlink(LED_GREEN);
|
||||||
vLedSetGreen(1);
|
|
||||||
for(i=0; i<BLINK_TIME; i++) {vLedSetGreen(0);vLedSetGreen(1);}
|
|
||||||
vLedSetGreen(0);
|
|
||||||
}
|
}
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
|
@ -72,7 +132,7 @@ void vLedHaltBlinking(int reason)
|
||||||
volatile u_int32_t i=0;
|
volatile u_int32_t i=0;
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED_MASK );
|
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED_RED | LED_GREEN );
|
||||||
for(i=0; i<MCK/40; i++) ;
|
for(i=0; i<MCK/40; i++) ;
|
||||||
|
|
||||||
switch(reason) {
|
switch(reason) {
|
||||||
|
@ -96,15 +156,44 @@ void vLedHaltBlinking(int reason)
|
||||||
}
|
}
|
||||||
for(i=0; i<MCK/20; i++) ;
|
for(i=0; i<MCK/20; i++) ;
|
||||||
|
|
||||||
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK );
|
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_RED | LED_GREEN );
|
||||||
for(i=0; i<MCK/40; i++) ;
|
for(i=0; i<MCK/40; i++) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
|
static void init_led_pwm(unsigned int led)
|
||||||
|
{
|
||||||
|
const struct channel_definition *c = find_channel(led);
|
||||||
|
|
||||||
|
if(c==0) return;
|
||||||
|
|
||||||
|
// Set PIO mapping
|
||||||
|
if(c->periph == PERIPH_A) {
|
||||||
|
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, led, 0);
|
||||||
|
} else if(c->periph == PERIPH_B) {
|
||||||
|
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, 0, led);
|
||||||
|
} else
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Configure channel: clock = MCK, period = PWM_PERIOD, CPOL=1, duty cycle variable
|
||||||
|
c->channel->PWMC_CMR = 0x0 | AT91C_PWMC_CPOL;
|
||||||
|
c->channel->PWMC_CDTYR = 1;
|
||||||
|
c->channel->PWMC_CPRDR = PWM_PERIOD;
|
||||||
|
|
||||||
|
AT91C_BASE_PWMC->PWMC_ENA = (1<<(c->channel_no));
|
||||||
|
vLedSetBrightness(led, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void vLedInit(void)
|
void vLedInit(void)
|
||||||
{
|
{
|
||||||
// turn off LED's
|
// turn off LED's
|
||||||
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK );
|
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_RED | LED_GREEN );
|
||||||
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK );
|
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_RED | LED_GREEN );
|
||||||
|
|
||||||
|
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,
|
||||||
|
((unsigned int) 1 << AT91C_ID_PWMC));
|
||||||
|
|
||||||
|
init_led_pwm(LED_GREEN);
|
||||||
|
init_led_pwm(LED_RED);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,9 @@
|
||||||
|
|
||||||
#include "openpicc.h"
|
#include "openpicc.h"
|
||||||
|
|
||||||
|
extern void vLedSetBrightness(unsigned int led, int brightness);
|
||||||
|
extern void vLedSet(int led, bool_t on);
|
||||||
|
extern void vLedBlink(int led);
|
||||||
extern void vLedSetRed(bool_t on);
|
extern void vLedSetRed(bool_t on);
|
||||||
extern void vLedBlinkRed(void);
|
extern void vLedBlinkRed(void);
|
||||||
extern void vLedSetGreen(bool_t on);
|
extern void vLedSetGreen(bool_t on);
|
||||||
|
|
Loading…
Reference in New Issue