altos: Make ao_xmem funcs require __xdata void * instead of casting
authorKeith Packard <keithp@keithp.com>
Sat, 12 Nov 2011 06:30:17 +0000 (22:30 -0800)
committerKeith Packard <keithp@keithp.com>
Sat, 12 Nov 2011 06:30:17 +0000 (22:30 -0800)
Having an explicit cast in the ao_xmem wrapper macros caused the
compiler to generate garbage values for pdata addresses, making the
upper byte 0x00 instead of the required 0xf0. Removing the
casts from the ao_xmem macros exposed this problem, so a new
PDATA_TO_XDATA macros was added, along with a CODE_TO_XDATA macro
which serve to cast pointers, with suitable address modifications, so
that things work again.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/cc1111/ao_arch.h
src/cc1111/ao_string.c
src/core/ao.h
src/core/ao_config.c
src/core/ao_host.h
src/core/ao_telemetry.c
src/drivers/ao_gps_skytraq.c

index f0f0daae4260b80f0bad7efa18127595f0f880b3..001165fafd9bae0b592a4be9f1da975ce8f6e9eb 100644 (file)
 /* Convert a __data pointer into an __xdata pointer */
 #define DATA_TO_XDATA(a)       ((void __xdata *) ((uint8_t) (a) | 0xff00))
 
+/* Code and xdata use the same address space */
+#define CODE_TO_XDATA(a)       ((__xdata void *) ((uint16_t) (a)))
+
+/* Pdata lives at the start of xdata */
+#define PDATA_TO_XDATA(a)      ((void __xdata *) ((uint8_t) (a) | 0xf000))
+
 /* Stack runs from above the allocated __data space to 0xfe, which avoids
  * writing to 0xff as that triggers the stack overflow indicator
  */
@@ -228,18 +234,18 @@ ao_button_get(void) __critical;
 /* ao_string.c */
 
 void
-_ao_xmemcpy(__xdata uint8_t *dst, __xdata uint8_t *src, uint8_t count);
+_ao_xmemcpy(__xdata void *dst, __xdata void *src, uint8_t count);
 
-#define ao_xmemcpy(d,s,c) _ao_xmemcpy((__xdata uint8_t *) (d), (__xdata uint8_t *) (s), (c))
+#define ao_xmemcpy(d,s,c) _ao_xmemcpy(d,s,c)
 
 void
-_ao_xmemset(__xdata uint8_t *dst, uint8_t value, uint8_t count);
+_ao_xmemset(__xdata void *dst, uint8_t value, uint8_t count);
 
-#define ao_xmemset(d,v,c) _ao_xmemset((__xdata uint8_t *) (d), (v), (c))
+#define ao_xmemset(d,v,c) _ao_xmemset(d,v,c)
 
 int8_t
-_ao_xmemcmp(__xdata uint8_t *a, __xdata uint8_t *b, uint8_t count);
+_ao_xmemcmp(__xdata void *a, __xdata void *b, uint8_t count);
 
-#define ao_xmemcmp(d,s,c) _ao_xmemcmp((__xdata uint8_t *) (d), (__xdata uint8_t *) (s), (c))
+#define ao_xmemcmp(d,s,c) _ao_xmemcmp((d), (s), (c))
 
 #endif /* _AO_ARCH_H_ */
index daa5c14b2636b9d709e4b926f5ba87a8290efb56..3a07e47ed5c3d9effb73b37ef6d657c08375dd8d 100644 (file)
 #include "ao.h"
 
 void
-_ao_xmemcpy(__xdata uint8_t *dst, __xdata uint8_t *src, uint8_t count)
+_ao_xmemcpy(__xdata void *dst, __xdata void *src, uint8_t count)
 {
-       while (count--)
-               *dst++ = *src++;
+       while (count--) {
+               *(__xdata uint8_t *) dst = *(__xdata uint8_t *) src;
+               dst = (__xdata uint8_t *) dst + 1;
+               src = (__xdata uint8_t *) src + 1;
+       }
 }
 
 void
-_ao_xmemset(__xdata uint8_t *dst, uint8_t v, uint8_t count)
+_ao_xmemset(__xdata void *dst, uint8_t v, uint8_t count)
 {
-       while (count--)
-               *dst++ = v;
+       while (count--) {
+               *(__xdata uint8_t *) dst = v;
+               dst = (__xdata uint8_t *) dst + 1;
+       }
 }
 
 int8_t
-_ao_xmemcmp(__xdata uint8_t *a, __xdata uint8_t *b, uint8_t count)
+_ao_xmemcmp(__xdata void *a, __xdata void *b, uint8_t count)
 {
        while (count--) {
-               int8_t  d = *a++ - *b++;
+               int8_t  d = *(__xdata int8_t *) a - *(__xdata int8_t *) b;
                if (d)
                        return d;
+               a = (__xdata int8_t *) a + 1;
+               b = (__xdata int8_t *) b + 1;
        }
        return 0;
 }
index 9b8d3270cf992dd431899966e432348125c02a02..cbe2f8dc34a222c82c668262912794b3f6838eb2 100644 (file)
 #ifndef DATA_TO_XDATA
 #define DATA_TO_XDATA(a)       (a)
 #endif
+#ifndef PDATA_TO_XDATA
+#define PDATA_TO_XDATA(a)      (a)
+#endif
+#ifndef CODE_TO_XDATA
+#define CODE_TO_XDATA(a)       (a)
+#endif
 
 /* An AltOS task */
 struct ao_task {
index 08cc79b16dfca14086c763264117b1e661db8a5e..f0a576ee9692289b0784ba9e62a232fb1ab910fc 100644 (file)
@@ -79,7 +79,7 @@ _ao_config_get(void)
                ao_config.main_deploy = AO_CONFIG_DEFAULT_MAIN_DEPLOY;
                ao_config.radio_channel = AO_CONFIG_DEFAULT_RADIO_CHANNEL;
                ao_xmemset(&ao_config.callsign, '\0', sizeof (ao_config.callsign));
-               ao_xmemcpy(&ao_config.callsign, AO_CONFIG_DEFAULT_CALLSIGN,
+               ao_xmemcpy(&ao_config.callsign, CODE_TO_XDATA(AO_CONFIG_DEFAULT_CALLSIGN),
                       sizeof(AO_CONFIG_DEFAULT_CALLSIGN) - 1);
                ao_config_dirty = 1;
        }
index f2b2f0c974003ba0e68d5cc9e1ecdfeeb22a1479..6eb752c9636f8e2f9645eabbc7e1e1bc1105e71f 100644 (file)
@@ -46,6 +46,10 @@ struct ao_adc {
 #define __code
 #define __reentrant
 
+#define DATA_TO_XDATA(a)       (a)
+#define PDATA_TO_XDATA(a)      (a)
+#define CODE_TO_XDATA(a)       (a)
+
 enum ao_flight_state {
        ao_flight_startup = 0,
        ao_flight_idle = 1,
index e66598d1402a05340a6a3e5f7ec83bf33092e572..c68f158994c478e23d1b8db72a29887302c0a9bb 100644 (file)
@@ -132,11 +132,11 @@ ao_send_configuration(void)
                telemetry.configuration.main_deploy = ao_config.main_deploy;
                telemetry.configuration.flight_log_max = ao_config.flight_log_max >> 10;
                ao_xmemcpy (telemetry.configuration.callsign,
-                       ao_config.callsign,
-                       AO_MAX_CALLSIGN);
+                           ao_config.callsign,
+                           AO_MAX_CALLSIGN);
                ao_xmemcpy (telemetry.configuration.version,
-                       ao_version,
-                       AO_MAX_VERSION);
+                           CODE_TO_XDATA(ao_version),
+                           AO_MAX_VERSION);
                ao_radio_send(&telemetry, sizeof (telemetry));
                ao_telemetry_config_cur = ao_telemetry_config_max;
        }
index 1d457a1fbf60dabb835fd3ed0f216a10e391dc55..6290960677651febc0b309f3b8ea252dc92628a5 100644 (file)
@@ -285,7 +285,7 @@ ao_nmea_gga(void)
        if (!ao_gps_error) {
                ao_mutex_get(&ao_gps_mutex);
                ao_gps_tick = ao_gps_next_tick;
-               ao_xmemcpy(&ao_gps_data, &ao_gps_next, sizeof (ao_gps_data));
+               ao_xmemcpy(&ao_gps_data, PDATA_TO_XDATA(&ao_gps_next), sizeof (ao_gps_data));
                ao_mutex_put(&ao_gps_mutex);
                ao_wakeup(&ao_gps_data);
        }
@@ -343,8 +343,7 @@ ao_nmea_gsv(void)
                ao_gps_tracking_next.channels = 0;
        else if (done) {
                ao_mutex_get(&ao_gps_mutex);
-               ao_xmemcpy(&ao_gps_tracking_data, &ao_gps_tracking_next,
-                      sizeof(ao_gps_tracking_data));
+               ao_xmemcpy(&ao_gps_tracking_data, PDATA_TO_XDATA(&ao_gps_tracking_next), sizeof(ao_gps_tracking_data));
                ao_mutex_put(&ao_gps_mutex);
                ao_wakeup(&ao_gps_tracking_data);
        }