]> oss.titaniummirror.com Git - msp430-libc.git/blobdiff - include/msp430/mpy32.h
Imported msp430-libc-20100207
[msp430-libc.git] / include / msp430 / mpy32.h
diff --git a/include/msp430/mpy32.h b/include/msp430/mpy32.h
new file mode 100644 (file)
index 0000000..dbdefaf
--- /dev/null
@@ -0,0 +1,125 @@
+#ifndef __MSP430_HEADERS_MPY32_H
+#define __MSP430_HEADERS_MPY32_H
+
+/* mpy.h
+ *
+ * mspgcc project: MSP430 device headers
+ * Hardware 32-bit multiplier
+ *
+ * (c) 2008  by Sergey A. Borshch <sb-sf@sourceforge.net>
+ * Originally based in MSP430F543x datasheet (slas609)
+ *    and MSP430x5xx Family User's Guide (slau208).
+ *
+ * $Id: mpy32.h,v 1.3 2008/12/15 12:48:20 sb-sf Exp $
+ */
+
+/* Switches:
+
+__MSP430_MPY32_BASE__ - base address of MPY32 module
+
+*/
+#if defined(__MSP430_MPY32_BASE__)
+#define MPY_                __MSP430_MPY32_BASE__ + 0x00    /* 16-bit operand 1 - multiply */
+sfrw(MPY, MPY_);
+#define MPYS_               __MSP430_MPY32_BASE__ + 0x02    /* 16-bit operand 1 - signed multiply */
+sfrw(MPYS, MPYS_);
+#define MAC_                __MSP430_MPY32_BASE__ + 0x04    /* 16-bit operand 1 - multiply accumulate */
+sfrw(MAC, MAC_);
+#define MACS_               __MSP430_MPY32_BASE__ + 0x06    /* 16-bit operand 1 - signed multiply accumulate */
+sfrw(MACS, MACS_);
+#define OP2_                __MSP430_MPY32_BASE__ + 0x08    /* 16-bit operand 2 */
+sfrw(OP2, OP2_);
+#define RESLO_              __MSP430_MPY32_BASE__ + 0x0A    /* 16x16 result low word */
+sfrw(RESLO, RESLO_);
+#define RESHI_              __MSP430_MPY32_BASE__ + 0x0C    /* 16x16 result high word */
+sfrw(RESHI, RESHI_);
+#define SUMEXT_             __MSP430_MPY32_BASE__ + 0x0E    /* 16x16 sum extension */
+sfrw(SUMEXT, SUMEXT_);
+#define MPY32L_             __MSP430_MPY32_BASE__ + 0x10    /* 32-bit operand 1 - multiply low word */
+sfrw(MPY32L, MPY32L_);
+#define MPY32H_             __MSP430_MPY32_BASE__ + 0x12    /* 32-bit operand 1 - multiply high word */
+sfrw(MPY32H, MPY32H_);
+#define MPYS32L_            __MSP430_MPY32_BASE__ + 0x14    /* 32-bit operand 1 - signed multiply low word */
+sfrw(MPYS32L, MPYS32L_);
+#define MPYS32H_            __MSP430_MPY32_BASE__ + 0x16    /* 32-bit operand 1 - signed multiply high word */
+sfrw(MPYS32H, MPYS32H_);
+#define MAC32L_             __MSP430_MPY32_BASE__ + 0x18    /* 32-bit operand 1 - multiply accumulate low word */
+sfrw(MAC32L, MAC32L_);
+#define MAC32H_             __MSP430_MPY32_BASE__ + 0x1A    /* 32-bit operand 1 - multiply accumulate high word */
+sfrw(MAC32H, MAC32H_);
+#define MACS32L_            __MSP430_MPY32_BASE__ + 0x1C    /* 32-bit operand 1 - signed multiply accumulate low word */
+sfrw(MACS32L, MACS32L_);
+#define MACS32H_            __MSP430_MPY32_BASE__ + 0x1E    /* 32-bit operand 1 - signed multiply accumulate high word */
+sfrw(MACS32H, MACS32H_);
+#define OP2L_               __MSP430_MPY32_BASE__ + 0x20    /* 32-bit operand 2 - low word */
+sfrw(OP2L, OP2L_);
+#define OP2H_               __MSP430_MPY32_BASE__ + 0x22    /* 32-bit operand 2 - high word */
+sfrw(OP2H, OP2H_);
+#define RES0_               __MSP430_MPY32_BASE__ + 0x24    /* 32x32 result 3 - least significant word */
+sfrw(RES0,RES0_);
+#define RES1_               __MSP430_MPY32_BASE__ + 0x26
+sfrw(RES1,RES1_);
+#define RES2_               __MSP430_MPY32_BASE__ + 0x28
+sfrw(RES2,RES2_);
+#define RES3_               __MSP430_MPY32_BASE__ + 0x2A    /* 32x32 result 3 - most significant word */
+sfrw(RES3,RES3_);
+#define MPY32CTL0_          __MSP430_MPY32_BASE__ + 0x2C    /* MPY32 control register 0 */
+sfrw(MPY32CTL0,MPY32CTL0_);
+#endif  /* defined(__MSP430_MPY32_BASE__) */
+
+#define MPYDLY32            (1<<9)      /* Delayed write mode */
+#define MPYDLYWRTEN         (1<<8)      /* Delayed write enable */
+#define MPYPO2_32           (1<<7)      /* Multiplier bit width of operand 2 */
+#define MPYPO1_32           (1<<6)      /* Multiplier bit width of operand 1 */
+#define MPYM1               (1<<5)      /* Multiplier mode */
+#define MPYM0               (1<<4)      /*  -- // -- */
+#define MPYSAT              (1<<3)      /* Saturation mode */
+#define MPYFRAC             (1<<2)      /* Fractional mode */
+#define MPYC                (1<<0)      /* Carry of the multiplier */
+
+#define MPYM_0              (0<<4)      /* Multiply */
+#define MPYM_1              (1<<4)      /* Signed multiply */
+#define MPYM_2              (2<<4)      /* Multiply accumulate */
+#define MPYM_3              (3<<4)      /* Signed multiply accumulate */
+
+
+#ifndef __ASSEMBLER__
+/* Structured declaration */
+
+#undef  __xstr
+#undef  __str
+#define __xstr(x)     __str(x)
+#define __str(x)      #x
+
+typedef struct
+{
+    volatile unsigned int MPY;          /* 16-bit operand 1 - multiply */
+    volatile unsigned int MPYS;         /* 16-bit operand 1 - signed multiply */
+    volatile unsigned int MAC;          /* 16-bit operand 1 - multiply accumulate */
+    volatile unsigned int MACS;         /* 16-bit operand 1 - signed multiply accumulate */
+    volatile unsigned int OP2;          /* 16-bit operand 2 */
+    volatile unsigned int RESLO;        /* 16x16 result low word */
+    volatile unsigned int RESHI;        /* 16x16 result high word */
+    volatile unsigned int SUMEXT;              /* 16x16 sum extension */
+    volatile unsigned int MPY32L;       /* 32-bit operand 1 - multiply low word */
+    volatile unsigned int MPY32H;       /* 32-bit operand 1 - multiply high word */
+    volatile unsigned int MPYS32L;      /* 32-bit operand 1 - signed multiply low word */
+    volatile unsigned int MPYS32H;      /* 32-bit operand 1 - signed multiply high word */
+    volatile unsigned int MAC32L;       /* 32-bit operand 1 - multiply accumulate low word */
+    volatile unsigned int MAC32H;       /* 32-bit operand 1 - multiply accumulate high word */
+    volatile unsigned int MACS32L;      /* 32-bit operand 1 - signed multiply accumulate low word */
+    volatile unsigned int MACS32H;      /* 32-bit operand 1 - signed multiply accumulate high word */
+    volatile unsigned int OP2L;         /* 32-bit operand 2 - low word */
+    volatile unsigned int OP2H;         /* 32-bit operand 2 - high word */
+    volatile unsigned int RES0;         /* 32x32 result 3 - least significant word */
+    volatile unsigned int RES1;
+    volatile unsigned int RES2;
+    volatile unsigned int RES3;         /* 32x32 result 3 - most significant word */
+    volatile unsigned int MPY32CTL0;    /* MPY32 control register 0 */
+} mpy32_t;
+mpy32_t mpy32 asm(__xstr(__MSP430_MPY32_BASE__));
+#undef  __str
+#undef  __xstr
+#endif  /* __ASSEMBLER__ */
+
+#endif  /* __MSP430_HEADERS_MPY32_H */