1
0
mirror of git://projects.qi-hardware.com/ben-wpan.git synced 2024-11-19 16:29:42 +02:00
ben-wpan/cntr/fw/cntr/cntr.c
Werner Almesberger 190e8f0082 Firmware support for CNTR version 3.
- common/io.h: describe the role of PROBE_TERM in version 3
- common/io.h (VERSION_ID): renamed to VERSION_ID1
- common/io.h (VERSION_ID2): added P2_0, and described version number
  encoding
- cntr/cntr.h (enum hw_type): added HW_TYPE_V3
- cntr/cntr.c (init_io): decode version 3, flash LED three times, and
  configure PROBE_TERM according to version
2010-11-06 17:03:33 -03:00

132 lines
2.2 KiB
C

/*
* cntr/cntr.c - CNTR initialization and main loop
*
* Written 2008-2010 by Werner Almesberger
* Copyright 2008-2010 Werner Almesberger
*
* This program 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 2 of the License, or
* (at your option) any later version.
*/
#include <stdint.h>
#include "regs.h"
#include "io.h"
#include "usb.h"
#include "cntr/ep0.h"
#include "version.h"
#include "cntr.h"
uint8_t cntr[4];
enum hw_type hw_type;
static void delay(unsigned ms)
{
int x;
while (ms--)
for (x = 0; x < 1488; x)
x++;
}
static void init_io(void)
{
int i;
/* SDCC bug - needs parentheses here */
hw_type = VERSION_ID1 ?
(VERSION_ID2 ? HW_TYPE_V2 : HW_TYPE_V3) :
HW_TYPE_V1;
for (i = HW_TYPE_V1; i != hw_type; i++) {
/* flash LED a second or third time */
LEDv2 = 0;
delay(250);
LEDv2 = 1;
delay(250);
}
if (hw_type == HW_TYPE_V2)
PROBE_TERM_MODE |= 1 << PROBE_TERM_BIT;
/*
* Signal Mode Value
*
* PROBE_T0 open drain 1 (input)
* PROBE_ECI open drain 1 (input)
* PROBE_INT0 open drain 1 (input)
*
* PROBE_TERM open drain 0 version 1
* PROBE_TERM push-pull 1 version 2
*
* LEDv1 push-pull 0 (set up by boot loader)
* LEDv2 push-pull 0 (set up by boot loader)
*
* all unused open drain 0
*/
P0 = 1 << PROBE_INT0_BIT;
P1 = (1 << PROBE_T0_BIT) | (1 << PROBE_ECI_BIT);
P2 = 0;
P3 = 0;
if (hw_type == HW_TYPE_V2 || hw_type == HW_TYPE_V3)
PROBE_TERM = 1;
/*
* Disable pull-ups
*/
XBR1 |= WEAKPUD;
}
static void setup_counter(void)
{
TCON = TR0; /* enable Timer 0 */
TMOD = C_T0 | T0M0; /* clock from T0, mode 1: 16 bit counter */
XBR1 |= T0E; /* route T0 to port */
P0SKIP = 0x7f; /* assign T0 to P0_7 */
}
static void read_counter(void)
{
uint8_t th;
th = TH0;
while (1) {
cntr[0] = TL0;
if (th == TH0)
break;
th = TH0;
}
if (th < cntr[1]) {
cntr[2]++;
if (!cntr[2])
cntr[3]++;
}
cntr[1] = th;
}
void main(void)
{
init_io();
setup_counter();
usb_init();
ep0_init();
while (1) {
read_counter();
usb_poll();
}
}