socsvn commit: r238102 -
soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x
aleek at FreeBSD.org
aleek at FreeBSD.org
Thu Jun 21 18:59:41 UTC 2012
Author: aleek
Date: Thu Jun 21 18:59:38 2012
New Revision: 238102
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238102
Log:
timer is working. FreeBSD boots to mounting rootfs
Modified:
soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h
soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer_tc.c
Modified: soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h
==============================================================================
--- soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h Thu Jun 21 17:48:28 2012 (r238101)
+++ soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h Thu Jun 21 18:59:38 2012 (r238102)
@@ -126,10 +126,10 @@
void (*callback)(void *data), void *data);
int
-omap3_gptimer_start(struct omap3_gptimer_softc *sc);
+omap3_gptimer_start(struct eventtimer *et, struct bintime *first, struct bintime *period);
int
-omap3_gptimer_stop(struct omap3_gptimer_softc *sc);
+omap3_gptimer_stop(struct eventtimer *et);
int
omap3_gptimer_get_freq(struct omap3_gptimer_softc *sc, uint32_t *freq);
Modified: soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer_tc.c
==============================================================================
--- soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer_tc.c Thu Jun 21 17:48:28 2012 (r238101)
+++ soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer_tc.c Thu Jun 21 18:59:38 2012 (r238102)
@@ -44,6 +44,8 @@
#include <sys/lock.h>
#include <sys/gpio.h>
#include <sys/mutex.h>
+#include <sys/timeet.h>
+#include <sys/timetc.h>
#include <machine/bus.h>
#include <machine/cpu.h>
@@ -100,6 +102,8 @@
.tc_quality = 1000,
};
+static struct eventtimer omap3_gptimer_et;
+
#define __omap3_delay(i) \
do { \
unsigned int cnt = (i); \
@@ -435,7 +439,7 @@
/* Calculate the start value */
startcount = 0xFFFFFFFFUL - (uint32_t)(tickcount & 0xFFFFFFFFUL);
- printf("[BRG] %s, %d : freq64=%llu : tickcount=%llu : startcount=%u : time_us=%u\n",
+ printf("%s, %d : freq64=%llu : tickcount=%llu : startcount=%u : time_us=%u\n",
__func__, __LINE__, freq64, tickcount, startcount, time_us);
}
@@ -482,9 +486,6 @@
sc->flags |= OMAP3_GPTIMER_ACTIVATED_FLAG;
//OMAP3_GPTIMER_UNLOCK(sc);
-
- printf("[BRG] %s, %d\n", __func__, __LINE__);
-
return (0);
}
@@ -497,8 +498,9 @@
* Returns 0 on success, otherwise an error code
*/
int
-omap3_gptimer_start(struct omap3_gptimer_softc *sc)
+omap3_gptimer_start(struct eventtimer *et, struct bintime *first, struct bintime *period)
{
+ struct omap3_gptimer_softc *sc = (struct omap3_gptimer_softc *)et->et_priv;
uint32_t val;
/* Sanity checks */
@@ -527,8 +529,9 @@
* Returns 0 on success, otherwise an error code
*/
int
-omap3_gptimer_stop(struct omap3_gptimer_softc *sc)
+omap3_gptimer_stop(struct eventtimer *et)
{
+ struct omap3_gptimer_softc *sc = (struct omap3_gptimer_softc *)et->et_priv;
uint32_t val;
/* Sanity checks */
@@ -748,16 +751,10 @@
omap3_gptimer_attach_common(device_t dev)
{
struct omap3_gptimer_softc *sc = device_get_softc(dev);
- //char name[32];
int rid=0; // resource id for device, unique
- uint32_t rev;
-
- device_printf( dev, "Generic attaching the device...\n" );
-
- // Setup the basics
- //sc->sc_dev = dev;
- //sc->sc_tick_timer = NULL;
+ //device_printf( dev, "Generic attaching the device...\n" );
+ sc->sc_dev = dev;
/* First try and get the register addresses, if this fails we assume
* there are no more timers.
@@ -771,32 +768,9 @@
/* Next try and get the interrupt resource, this is not fatal */
sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE | RF_SHAREABLE); //@TODO XXX Why shareable?
-
- /* Mutex to protect the shared data structures */
- //snprintf(name, 32, "omap_gptimer_tc");
- //mtx_init(&sc->mtx, device_get_nameunit(dev), name, MTX_SPIN);
-
- // I decided to delete support for OMAP4 timers from the original code - aleek
- rev = omap3_gptimer_readl(sc, OMAP3_GPT_TIDR);
- switch (rev) {
- case 0x00000013: /* OMAP3 without 1ms generation */
- case 0x00000015:
- case 0x00000021: /* OMAP3 with 1ms generation */
sc->profile = OMAP_GPTIMER_PROFILE_OMAP3;
- break;
- break;
- default:
- sc->profile = OMAP_GPTIMER_PROFILE_UNKNOWN;
- break;
- }
-
- if (sc->profile == OMAP_GPTIMER_PROFILE_UNKNOWN) {
- device_printf(dev, "Error: failed to determine the type of "
- "GPTIMER_tc, ignoring timer (rev: 0x%08x)\n",
- rev);
- return (ENXIO);
- }
- device_printf( dev, "done!\n" );
+
+ //device_printf( dev, "done!\n" );
return 0;
}
@@ -836,9 +810,9 @@
/* Setup another timer to be the timecounter */
if (omap3_gptimer_activate(sc, OMAP3_GPTIMER_PERIODIC_FLAG, 0, NULL, NULL)) {
device_printf(dev, "Error: failed to activate system tick timer\n");
- } else if (omap3_gptimer_start(sc)) {
+ }/* else if (omap3_gptimer_start(sc)) {
device_printf(dev, "Error: failed to start system tick timer\n");
- }
+ }*/
/* Save the system clock speed */
omap3_gptimer_get_freq(sc, &timer_freq);
@@ -896,7 +870,7 @@
struct omap3_gptimer_softc *sc = device_get_softc(dev);
omap3_gptimer_attach_common(dev);
- device_printf( dev, "Timer specyfic attaching...\n" );
+ //device_printf( dev, "Timer specyfic attaching...\n" );
/* Set the clock source for the timer, this is just a one to one
* mapping of the clock id to timer, i.e. n=0 => GPTIMER1_CLK.
*/
@@ -921,14 +895,26 @@
panic("Error: failed to start system tick timer\n");
/* Lastly start the tick timer */
- if (omap3_gptimer_start(sc))
- panic("Error: failed to start system tick timer\n");
+ /*if (omap3_gptimer_start(sc))
+ panic("Error: failed to start system tick timer\n");*/
omap3_gptimer_get_freq(sc, &timer_freq);
device_printf(dev, "tick: timer_freq = %u\n", timer_freq);
/* Restore interrupt state */
restore_interrupts(oldirqstate);
+ omap3_gptimer_et.et_name = "AM37x EventTimer0",
+ omap3_gptimer_et.et_flags = ET_FLAGS_PERIODIC | ET_FLAGS_ONESHOT;
+ omap3_gptimer_et.et_quality = 1000;
+ omap3_gptimer_et.et_frequency = tick; //@todo XXX naprawic to !!
+ omap3_gptimer_et.et_min_period.sec = 0;
+ omap3_gptimer_et.et_min_period.frac = ((0x00000002LLU << 32) / omap3_gptimer_et.et_frequency) << 32;
+ omap3_gptimer_et.et_max_period.sec = 0xfffffff0U / omap3_gptimer_et.et_frequency;
+ omap3_gptimer_et.et_max_period.frac = ((0xfffffffeLLU << 32) / omap3_gptimer_et.et_frequency) << 32;
+ omap3_gptimer_et.et_start = omap3_gptimer_start;
+ omap3_gptimer_et.et_stop = omap3_gptimer_stop;
+ omap3_gptimer_et.et_priv = &omap3_gptimer_et;
+ et_register( &omap3_gptimer_et );
g_omap3_gptimer_sc_et = sc;
More information about the svn-soc-all
mailing list