From 044ad7c3987460ede48ff27afd6bdb0ca05a0432 Mon Sep 17 00:00:00 2001
From: Harald Welte <laforge@gnumonks.org>
Date: Mon, 4 Jul 2011 20:52:54 +0200
Subject: import at91lib from at91lib_20100901_softpack_1_9_v_1_0_svn_v15011

it's sad to see that atmel doesn't publish their svn repo or has
a centralized location or even puts proper version/release info
into the library itself
---
 peripherals/chipid/chipid.c   | 301 ++++++++++++++++++++++++++++++++++++++++++
 peripherals/chipid/chipid.dir |  36 +++++
 peripherals/chipid/chipid.h   | 109 +++++++++++++++
 3 files changed, 446 insertions(+)
 create mode 100644 peripherals/chipid/chipid.c
 create mode 100644 peripherals/chipid/chipid.dir
 create mode 100644 peripherals/chipid/chipid.h

(limited to 'peripherals/chipid')

diff --git a/peripherals/chipid/chipid.c b/peripherals/chipid/chipid.c
new file mode 100644
index 0000000..8a52eac
--- /dev/null
+++ b/peripherals/chipid/chipid.c
@@ -0,0 +1,301 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include <stdio.h>
+#include <chipid/chipid.h>
+#include <string.h>
+
+//------------------------------------------------------------------------------
+//         Definitions
+//------------------------------------------------------------------------------
+
+/// ChipID register, version field
+#define AT91C_CHIPID_CIDR_VERSION                     (0x1fUL << 0)
+#define AT91C_CHIPID_CIDR_VERSION_BITFLD              0
+#define AT91C_CHIPID_CIDR_VERSION_BITS                5
+/// ChipID register, embedded processor field
+#define AT91C_CHIPID_CIDR_EPROC                       (0x7UL << 5)
+#define AT91C_CHIPID_CIDR_EPROC_BITFLD                5
+#define AT91C_CHIPID_CIDR_EPROC_BITS                  3
+/// ChipID register, nonvolatile program memory size field
+#define AT91C_CHIPID_CIDR_NVPSIZ                      (0xfUL << 8)
+#define AT91C_CHIPID_CIDR_NVPSIZ_BITFLD               8
+#define AT91C_CHIPID_CIDR_NVPSIZ_BITS                 4
+/// ChipID register, second nonvolatile program memory size field
+#define AT91C_CHIPID_CIDR_NVPSIZ2                     (0xfUL << 12)
+#define AT91C_CHIPID_CIDR_NVPSIZ2_BITFLD              12
+#define AT91C_CHIPID_CIDR_NVPSIZ2_BITS                4
+/// ChipID register, Internal SRAM siize field
+#define AT91C_CHIPID_CIDR_SRAMSIZ                     (0xfUL << 16)
+#define AT91C_CHIPID_CIDR_SRAMSIZ_BITFLD              16
+#define AT91C_CHIPID_CIDR_SRAMSIZ_BITS                4
+/// ChipID register, Architecture identifier field
+#define AT91C_CHIPID_CIDR_ARCH                        (0xffUL << 20)
+#define AT91C_CHIPID_CIDR_ARCH_BITFLD                 20
+#define AT91C_CHIPID_CIDR_ARCH_BITS                   8
+/// ChipID register, nonvolatile program memory type field
+#define AT91C_CHIPID_CIDR_NVPTYP                      (0x7UL << 28)
+#define AT91C_CHIPID_CIDR_NVPTYP_BITFLD               28
+#define AT91C_CHIPID_CIDR_NVPTYP_BITS                 3
+/// ChipID register, extersion flag field
+#define AT91C_CHIPID_CIDR_EXT                         (0x1UL << 31)
+#define AT91C_CHIPID_CIDR_EXT_BITFLD                  31
+#define AT91C_CHIPID_CIDR_EXT_BITS                    1
+
+#define CHIPID_ID(chipid, bitfield, bits)   ((chipid >> bitfield) & ((1 << (bits)) - 1))
+
+//------------------------------------------------------------------------------
+//         Internal variables
+//------------------------------------------------------------------------------
+#define AT91C_CHIPID_EPROC_SIZE    5
+const struct ChipIDType CHIPID_eProc[AT91C_CHIPID_EPROC_SIZE] = {
+
+    // identifier       description
+    {0x1,   "ARM946ES"},
+    {0x2,   "ARM7TDMI"},
+    {0x3,   "Cortex-M3"},
+    {0x4,   "ARM920T"},
+    {0x5,   "ARM926EJS"},
+};
+
+#define AT91C_CHIPID_NVPSIZE_SIZE    16
+const struct ChipIDType CHIPID_nvpSiz[AT91C_CHIPID_NVPSIZE_SIZE] = {
+
+    // identifier       description
+    {0x0,   "None"},
+    {0x1,   "8K bytes"},
+    {0x2,   "16K bytes"},
+    {0x3,   "32K bytes"},
+    {0x4,   "Reserved"},
+    {0x5,   "64K bytes"},
+    {0x6,   "Reserved"},
+    {0x7,   "128K bytes"},
+    {0x8,   "Reserved"},
+    {0x9,   "256K bytes"},
+    {0xA,   "512K bytes"},
+    {0xB,   "Reserved"},
+    {0xC,   "1024K bytes"},
+    {0xD,   "Reserved"},
+    {0xE,   "2048K bytes"},
+    {0xF,   "Reserved"}
+};
+
+#define AT91C_CHIPID_NVPSIZE2_SIZE    16
+const struct ChipIDType CHIPID_nvpSiz2[AT91C_CHIPID_NVPSIZE2_SIZE] = {
+
+    // identifier       description
+    {0x0,   "None"},
+    {0x1,   "8K bytes"},
+    {0x2,   "16K bytes"},
+    {0x3,   "32K bytes"},
+    {0x4,   "Reserved"},
+    {0x5,   "64K bytes"},
+    {0x6,   "Reserved"},
+    {0x7,   "128K bytes"},
+    {0x8,   "Reserved"},
+    {0x9,   "256K bytes"},
+    {0xA,   "512K bytes"},
+    {0xB,   "Reserved"},
+    {0xC,   "1024K bytes"},
+    {0xD,   "Reserved"},
+    {0xE,   "2048K bytes"},
+    {0xF,   "Reserved"}
+};
+
+#define AT91C_CHIPID_SRAMSIZE_SIZE    16
+const struct ChipIDType CHIPID_sramSiz[AT91C_CHIPID_SRAMSIZE_SIZE] = {
+
+    // identifier       description
+    {0x0,   "48K bytes"},
+    {0x1,   "1K bytes"},
+    {0x2,   "2K bytes"},
+    {0x3,   "6K bytes"},
+    {0x4,   "112K bytes"},
+    {0x5,   "4K bytes"},
+    {0x6,   "80K bytes"},
+    {0x7,   "160K bytes"},
+    {0x8,   "8K bytes"},
+    {0x9,   "16K bytes"},
+    {0xA,   "32K bytes"},
+    {0xB,   "64K bytes"},
+    {0xC,   "128K bytes"},
+    {0xD,   "256K bytes"},
+    {0xE,   "96K bytes"},
+    {0xF,   "512K bytes"}
+};
+
+#define AT91C_CHIPID_ARCH_SIZE    22
+const struct ChipIDType CHIPID_archSiz[AT91C_CHIPID_ARCH_SIZE] = {
+
+    // identifier       description
+    {0x19,   "AT91SAM9xx Series"},
+    {0x29,   "AT91SAM9XExx Series"},
+    {0x34,   "AT91x34 series"},
+    {0x37,   "CAP7 Series"},
+    {0x39,   "CAP9 Series"},
+    {0x3B,   "CAP11 Series"},
+    {0x40,   "AT91x40 Series"},
+    {0x42,   "AT91x42 Series"},
+    {0x55,   "AT91x55 Series"},
+    {0x60,   "AT91SAM7Axx Series"},
+    {0x61,   "AT91SAM7AQxx Series"},
+    {0x63,   "AT91x63 Series"},
+    {0x70,   "AT91SAM7Sxx Series"},
+    {0x71,   "AT91SAM7XCxx Series"},
+    {0x72,   "AT91SAM7SExx Series"},
+    {0x73,   "AT91SAM7Lxx Series"},
+    {0x75,   "AT91SAM7Xxx Series"},
+    {0x76,   "AT91SAM7SLxx Series"},
+    {0x80,   "AT91SAM3Uxx Series"},
+    {0x81,   "AT91SAM3UExx Series"},
+    {0x92,   "AT91x92 Series"},
+    {0xF0,   "AT75Cxx Series"}
+};
+
+#define AT91C_CHIPID_NVPTYPE_SIZE    5
+const struct ChipIDType CHIPID_nvpTyp[AT91C_CHIPID_NVPTYPE_SIZE] = {
+
+    // identifier       description
+    {0x0,   "ROM"},
+    {0x1,   "ROMless or on-chip Flash"},
+    {0x4,   "SRAM emulating ROM"},
+    {0x2,   "Embedded Flash Memory"},
+    {0x3,   "ROM and Embedded Flash Memory, NVPSIZ is ROM size, NVPSIZ2 is Flash size"}
+};
+
+//------------------------------------------------------------------------------
+/// Internal functions
+//------------------------------------------------------------------------------
+unsigned char CHIPID_Find(const struct ChipIDType* pChipIDTypeList,
+                               unsigned int size,
+                               unsigned int id, 
+                               struct ChipIDType* pChipIDType)
+{
+    unsigned int i;
+
+    for(i=0; i<size; i++)
+    {
+        if(pChipIDTypeList[i].num == id)
+       	{
+            memcpy(pChipIDType, &pChipIDTypeList[i], sizeof(struct ChipIDType));
+            return 0;
+        }
+    }
+
+    return 1;
+}
+
+//------------------------------------------------------------------------------
+/// Exported functions
+//------------------------------------------------------------------------------
+unsigned char CHIPID_Get(ChipId* pChipId)
+{
+    unsigned int chipId, chipIdExt;
+
+    chipId = AT91C_BASE_DBGU->DBGU_CIDR;
+    chipIdExt = AT91C_BASE_DBGU->DBGU_EXID;
+
+    pChipId->version = CHIPID_ID(chipId, AT91C_CHIPID_CIDR_VERSION_BITFLD, AT91C_CHIPID_CIDR_VERSION_BITS);
+    pChipId->eProc = CHIPID_ID(chipId, AT91C_CHIPID_CIDR_EPROC_BITFLD, AT91C_CHIPID_CIDR_EPROC_BITS);
+    pChipId->nvpSiz = CHIPID_ID(chipId, AT91C_CHIPID_CIDR_NVPSIZ_BITFLD, AT91C_CHIPID_CIDR_NVPSIZ_BITS);
+    pChipId->nvpSiz2 = CHIPID_ID(chipId, AT91C_CHIPID_CIDR_NVPSIZ2_BITFLD, AT91C_CHIPID_CIDR_NVPSIZ2_BITS);
+    pChipId->sramSiz = CHIPID_ID(chipId, AT91C_CHIPID_CIDR_SRAMSIZ_BITFLD, AT91C_CHIPID_CIDR_SRAMSIZ_BITS);
+    pChipId->arch = CHIPID_ID(chipId, AT91C_CHIPID_CIDR_ARCH_BITFLD, AT91C_CHIPID_CIDR_ARCH_BITS);
+    pChipId->nvpTyp = CHIPID_ID(chipId, AT91C_CHIPID_CIDR_NVPTYP_BITFLD, AT91C_CHIPID_CIDR_NVPTYP_BITS);
+    pChipId->extFlag= CHIPID_ID(chipId, AT91C_CHIPID_CIDR_EXT_BITFLD, AT91C_CHIPID_CIDR_EXT_BITS);
+    pChipId->extID = chipIdExt;
+
+    return 0;
+}
+
+void CHIPID_Print(ChipId* pChipId)
+{
+    unsigned char status;
+    struct ChipIDType  chipIdType;
+
+    // Version
+    printf("Version                                   0x%x.\r\n", pChipId->version);
+
+    // Find Embedded Processor
+    status = CHIPID_Find(CHIPID_eProc, AT91C_CHIPID_EPROC_SIZE, pChipId->eProc, &chipIdType);
+    if(!status)
+    {
+        printf("Embedded Processor                        %s.\r\n", chipIdType.pStr);
+    }
+
+	// Find nonvolatile program memory size
+    status = CHIPID_Find(CHIPID_nvpSiz, AT91C_CHIPID_NVPSIZE_SIZE, pChipId->nvpSiz, &chipIdType);
+    if(!status)
+    {
+        printf("Nonvolatile program memory size           %s.\r\n", chipIdType.pStr);
+    }
+
+	// Find Second nonvolatile program memory size
+    status = CHIPID_Find(CHIPID_nvpSiz2, AT91C_CHIPID_NVPSIZE2_SIZE, pChipId->nvpSiz2, &chipIdType);
+    if(!status)
+    {
+        printf("Second nonvolatile program memory size    %s.\r\n", chipIdType.pStr);
+    }
+
+	// Find Internal SRAM size
+    status = CHIPID_Find(CHIPID_sramSiz, AT91C_CHIPID_SRAMSIZE_SIZE, pChipId->sramSiz, &chipIdType);
+    if(!status)
+    {
+        printf("Internal SRAM size                        %s.\r\n", chipIdType.pStr);
+    }
+
+	// Find Architecture identifier
+    status = CHIPID_Find(CHIPID_archSiz, AT91C_CHIPID_ARCH_SIZE, pChipId->arch, &chipIdType);
+    if(!status)
+    {
+        printf("Architecture identifier                   %s.\r\n", chipIdType.pStr);
+    }
+
+	// Find nonvolatile program memory type
+    status = CHIPID_Find(CHIPID_nvpTyp, AT91C_CHIPID_NVPTYPE_SIZE, pChipId->nvpTyp, &chipIdType);
+    if(!status)
+    {
+        printf("Nonvolatile program memory type           %s.\r\n", chipIdType.pStr);
+    }
+
+	// Find extension flag
+    if(pChipId->extFlag)
+    {
+        printf("Extended chip ID is                       0x%x. \r\n", pChipId->extID);
+    }
+    else
+    {
+        printf("Extended chip ID is not existed. \r\n");
+    }
+
+}
diff --git a/peripherals/chipid/chipid.dir b/peripherals/chipid/chipid.dir
new file mode 100644
index 0000000..641a730
--- /dev/null
+++ b/peripherals/chipid/chipid.dir
@@ -0,0 +1,36 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+//------------------------------------------------------------------------------
+/// \dir
+///
+/// !!!Purpose
+///
+/// This directory contains an API for access the ChipID perpheral of AT91 microcontrollers.
+//------------------------------------------------------------------------------
\ No newline at end of file
diff --git a/peripherals/chipid/chipid.h b/peripherals/chipid/chipid.h
new file mode 100644
index 0000000..f450673
--- /dev/null
+++ b/peripherals/chipid/chipid.h
@@ -0,0 +1,109 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+//------------------------------------------------------------------------------
+/// \unit
+///
+/// !Purpose
+/// 
+/// Methods and definitions for access Chip ID peripheral in AT91 microcontrollers.
+/// 
+/// !Usage
+///
+/// -# 
+///
+//------------------------------------------------------------------------------
+
+#ifndef CHIPID_H
+#define CHIPID_H
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include <board.h>
+
+//------------------------------------------------------------------------------
+//         Definitions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// Definition for chip id register
+//------------------------------------------------------------------------------
+typedef struct _ChipId {
+
+   /// Version of the device
+   unsigned int version;
+   /// Embedded processor
+   unsigned int eProc;
+   /// Nonvolatile program memory size
+   unsigned int nvpSiz;
+   /// Second nonvolatile program memory size
+   unsigned int nvpSiz2;
+   /// Internal SRAM size
+   unsigned int sramSiz;
+   /// Architecture identifier
+   unsigned int arch;
+   /// Nonvolatile program memory type
+   unsigned int nvpTyp;
+   /// Extension flag
+   unsigned int extFlag;
+   /// Chip ID extersion extension
+   unsigned int extID;
+}ChipId;
+
+#if 1
+struct ChipIDType {
+
+   /// Identifier
+   unsigned int num;
+   /// Type
+   unsigned char pStr[80];
+};
+#else
+typedef struct _ChipIDType {
+
+   /// Identifier
+   unsigned int num;
+   /// Type
+   unsigned char pStr[80];
+}ChipIDType;
+#endif
+
+//------------------------------------------------------------------------------
+//         Global functions
+//------------------------------------------------------------------------------
+
+/// Get chip ID
+extern unsigned char CHIPID_Get(ChipId* pChipId);
+
+/// Print chip ID
+extern void CHIPID_Print(ChipId* pChipId);
+
+#endif //#ifndef CHIPID_H
\ No newline at end of file
-- 
cgit v1.2.3