]> rtime.felk.cvut.cz Git - arc.git/commitdiff
LED Blinker running on TMS570LS31x Hercules Development Kit (HDK) (TMS570LS3137ZWT)
authorLeos@Leos-PC <Leos@Leos-PC>
Wed, 30 Jan 2013 17:22:39 +0000 (18:22 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 12 Feb 2013 11:22:49 +0000 (12:22 +0100)
arch/arm/arm_cr4/drivers/Dio.c
arch/arm/arm_cr4/drivers/Mcu.c
arch/arm/arm_cr4/drivers/Port.c
arch/arm/arm_cr4/kernel/core_cr4.h
arch/arm/arm_cr4/kernel/startup_cr4.s
boards/ti_tms570ls/examples/rte_simple/config/Dio_Cfg.h
boards/ti_tms570ls/memory.ldf
include/Dio.h

index 44c5db75f54f614ff2299be0c278e9e2d54fa510..6913092231bf343879235d1dff4de86b42a323ae 100644 (file)
@@ -19,8 +19,9 @@
 #include "Det.h"\r
 #include "Cpu.h"\r
 #include <string.h>\r
+#include "../kernel/core_cr4.h"\r
 \r
-GIO_RegisterType *GPIO_ports[] = { GIO_PORTA_BASE, GIO_PORTB_BASE };\r
+GIO_RegisterType *GPIO_ports[] = { GIO_PORTA_BASE, GIO_PORTB_BASE, GIO_HET_PORT1_BASE };\r
 \r
 #define DIO_GET_PORT_FROM_CHANNEL_ID(_channelId) (_channelId >> 8)\r
 #define DIO_GET_BIT_FROM_CHANNEL_ID(_channelId) (1 << (_channelId & 0x1F))\r
@@ -145,7 +146,7 @@ void Dio_WriteChannel(Dio_ChannelType channelId, Dio_LevelType level)
        VALIDATE_CHANNEL(channelId, DIO_WRITECHANNEL_ID);\r
 \r
        Dio_PortType port = DIO_GET_PORT_FROM_CHANNEL_ID(channelId);\r
-       uint16 bit = DIO_GET_BIT_FROM_CHANNEL_ID(channelId);\r
+       uint32 bit = DIO_GET_BIT_FROM_CHANNEL_ID(channelId);\r
 \r
        if (!( GPIO_ports[port]->DIR & bit)) { // This is an input channel.\r
                goto cleanup;\r
index 18546226f76b73cb98b1d272741462aa05e4d6fe..9bf6357cee14c6ce097a5e97bc49ffcb56ecf7b2 100644 (file)
@@ -95,7 +95,8 @@
 #endif\r
 \r
 \r
-#define CORE_CPUID_CORTEX_M3           0x411FC231UL\r
+#define CORE_MIDR_CORTEX_R4    0x411FC141UL    // c0, Main ID Register\r
+\r
 \r
 typedef struct {\r
        uint32 lossOfLockCnt;\r
@@ -104,9 +105,6 @@ typedef struct {
 \r
 \r
 \r
-\r
-\r
-\r
 /**\r
  * Type that holds all global data for Mcu\r
  */\r
@@ -149,10 +147,7 @@ void Mcu_ConfigureFlash(void);
 \r
 \r
 \r
-/* Haven't found any ID accessable from memory.\r
- * There is the DBGMCU_IDCODE (0xe0042000) found in RM0041 but it\r
- * you can't read from that address..\r
- */\r
+// see tech.ref.manual for Debug Reference Register\r
 #if 0\r
 cpu_info_t cpu_info_list[] = {\r
     {\r
@@ -166,8 +161,8 @@ cpu_info_t cpu_info_list[] = {
  */\r
 core_info_t core_info_list[] = {\r
     {\r
-    .name = "CORE_ARM_CORTEX_M3",\r
-    .pvr = CORE_CPUID_CORTEX_M3,\r
+    .name = "CORE_ARM_CORTEX_R4",\r
+    .pvr = CORE_MIDR_CORTEX_R4,\r
     },\r
 };\r
 \r
@@ -216,10 +211,11 @@ static void InitMcuClocks(Mcu_ClockSettingConfigType *clockSettingsPtr)
        /** - Setup pll control register 1:\r
        *     - Setup reset on oscillator slip\r
        *     - Setup bypass on pll slip\r
+       *     - Setup Pll output clock divider\r
        *     - Setup reset on oscillator fail\r
-       *      - Setup Pll output clock divider\r
        *     - Setup reference clock divider\r
        *     - Setup Pll multiplier*\r
+       *\r
        */\r
        systemREG1->PLLCTL1 =\r
                  (MCU_RESET_ON_SLIP << MCU_RESET_ON_SLIP_OFFSET)\r
@@ -229,7 +225,6 @@ static void InitMcuClocks(Mcu_ClockSettingConfigType *clockSettingsPtr)
                | (((clockSettingsPtr->Pll2 - 1) * 256) << MCU_PLLMUL_OFFSET)\r
                | ((clockSettingsPtr->Pll4 - 1) << MCU_PLLDIV_OFFSET);\r
 \r
-\r
        /** Setup PLLCTL2\r
         *     - Setup internal Pll output divider\r
         *     - Enable/Disable frequency modulation (NOT USED)\r
@@ -237,12 +232,41 @@ static void InitMcuClocks(Mcu_ClockSettingConfigType *clockSettingsPtr)
         *     - Setup bandwidth adjustment (NOT USED)\r
         *     - Setup spreading amount (NOT USED)\r
         */\r
-       systemREG1->PLLCTL2 =\r
+       /*systemREG1->PLLCTL2 =\r
                  (MCU_FM_ENABLE << MCU_FM_ENABLE_OFFSET)\r
                | (MCU_SPREADING_RATE << MCU_SPREADING_RATE_OFFSET)\r
                | (MCU_BWADJ << MCU_BWADJ_OFFSET)\r
                | (MCU_SPREADING_AMOUNT << MCU_SPREADING_AMOUT_OFFSET)\r
-               | ((clockSettingsPtr->Pll3 - 1) << MCU_ODPLL_OFFSET);\r
+               | ((clockSettingsPtr->Pll3 - 1) << MCU_ODPLL_OFFSET);*/\r
+\r
+    systemREG1->PLLCTL2 =  0x00000000U\r
+                        | (255U << 22U)\r
+                        | (7U << 12U)\r
+                        | ((2U - 1U)<< 9U)\r
+                        |  61U;\r
+\r
+    /** @b Initialize @b Pll2: */\r
+\r
+    /**   - Setup pll2 control register :\r
+    *     - setup Pll output clock divider to max before Lock\r
+    *     - Setup reference clock divider\r
+    *     - Setup internal Pll output divider\r
+    *     - Setup Pll multiplier\r
+    */\r
+    systemREG2->PLLCTL3 = ((2U - 1U) << 29U)\r
+                        | ((0x1F)<< 24U)\r
+                        | ((6U - 1U)<< 16U)\r
+                        | ((135U - 1U) << 8U);\r
+\r
+       /** - Enable PLL(s) to start up or Lock */\r
+    systemREG1->CSDIS = 0x00000000U\r
+                      | 0x00000000U\r
+                      | 0x00000008U\r
+                      | 0x00000080U\r
+                      | 0x00000000U\r
+                      | 0x00000000U\r
+                      | 0x00000000U;\r
+\r
 \r
        /** - Wait for until clocks are locked */\r
        while ((systemREG1->CSVSTAT & ((systemREG1->CSDIS ^ 0xFF) & 0xFF)) != ((systemREG1->CSDIS ^ 0xFF) & 0xFF)) ;\r
@@ -276,10 +300,13 @@ void Mcu_Init(const Mcu_ConfigType *configPtr)
        while ((systemREG1->CSVSTAT & ((systemREG1->CSDIS ^ 0xFF) & 0xFF)) != ((systemREG1->CSDIS ^ 0xFF) & 0xFF)) ;\r
 \r
        /** - Setup GCLK, HCLK and VCLK clock source for normal operation, power down mode and after wakeup */\r
-       systemREG1->GHVSRC = (SYS_PLL << 24U) // Selectes PLL clock (clock source 1) as wakeup clock source.\r
+       systemREG1->GHVSRC = (SYS_PLL << 24U) // Selectes PLL clock (clock source 1) as wakeup clock source. (Use main oscillator as wake up source for GHV CLK)\r
                                           | (SYS_PLL << 16U) // Select PLL clock (clock source 1) as wakeup when GCLK is off as clock source.\r
                                           |  SYS_PLL;  // Select PLL clock (clock source 1) as current clock source.\r
 \r
+       /** - Disable Peripherals before peripheral powerup*/\r
+       systemREG1->PENA = 0U;\r
+\r
        /** - Power-up clocks to all peripharals */\r
        pcrREG->PSPWRDWNCLR0 = 0xFFFFFFFFU;\r
        pcrREG->PSPWRDWNCLR1 = 0xFFFFFFFFU;\r
index dfe86b2db0144b187fb6da8e701c68bb62014a53..fb764f08186c81bcc556c576f17a122a3a78daf4 100644 (file)
@@ -46,17 +46,17 @@ typedef volatile struct
 \r
 #define PORT_NOT_CONFIGURED 0x00000000\r
 \r
-#define PORT_0_BASE ((Port_RegisterType *)0xFFF7BC30)\r
-#define PORT_1_BASE ((Port_RegisterType *)0xFFF7BC50)\r
-#define PORT_2_BASE ((Port_RegisterType *)PORT_NOT_CONFIGURED)\r
+#define PORT_0_BASE ((Port_RegisterType *)0xFFF7BC30)                  // GIO Emulation B register\r
+#define PORT_1_BASE ((Port_RegisterType *)0xFFF7BC50)                  // GIO Pull Select Register A ??\r
+#define PORT_2_BASE ((Port_RegisterType *)0xFFF7B848)                  // N2HET1\r
 #define PORT_3_BASE ((Port_RegisterType *)PORT_NOT_CONFIGURED)\r
 #define PORT_4_BASE ((Port_RegisterType *)PORT_NOT_CONFIGURED)\r
 #define PORT_5_BASE ((Port_RegisterType *)PORT_NOT_CONFIGURED)\r
 #define PORT_6_BASE ((Port_RegisterType *)PORT_NOT_CONFIGURED)\r
 #define PORT_7_BASE ((Port_RegisterType *)PORT_NOT_CONFIGURED)\r
-#define PORT_8_BASE ((Port_RegisterType *)0xFFF7DDE0)\r
-#define PORT_9_BASE ((Port_RegisterType *)0xFFF7DFE0)\r
-#define PORT_10_BASE ((Port_RegisterType *)0xFFF7E1E0)\r
+#define PORT_8_BASE ((Port_RegisterType *)0xFFF7DDE0)                  // DCAN1 TX IO Control Register\r
+#define PORT_9_BASE ((Port_RegisterType *)0xFFF7DFE0)                  // DCAN2 TX IO Control Register\r
+#define PORT_10_BASE ((Port_RegisterType *)0xFFF7E1E0)                 // DCAN3 TX IO Control Register\r
 #define PORT_NUMBER_OF_PORTS 11\r
 \r
 static Port_RegisterType * const Port_Base[] =\r
@@ -169,6 +169,10 @@ void Port_Init(const Port_ConfigType *configType) {
        // Bring GIO register out of reset.\r
        gioREG->GCR0 = 1;\r
 \r
+       /* Hack to connect N2HET1[27] (function 2) to pin A9 */\r
+       *(volatile uint32*)0xFFFFEB10 &= ~0xFF000000;\r
+       *(volatile uint32*)0xFFFFEB10 |= ~0x04000000;\r
+\r
        for (uint16 i = 0; i < PORT_NUMBER_OF_PINS; i++) {\r
                Port_RefreshPin(i);\r
        }\r
index 44fb1381a4130bb8e4775a8cf0d2b0ab129fd800..51129059f5f521de1eaf715e95a38f7ad0943805 100644 (file)
@@ -473,7 +473,7 @@ typedef volatile struct gioPort
 \r
 #define GIO_PORTA_BASE ((GIO_RegisterType *)0xFFF7BC34)\r
 #define GIO_PORTB_BASE ((GIO_RegisterType *)0xFFF7BC54)\r
-\r
+#define GIO_HET_PORT1_BASE ((GIO_RegisterType *)0xFFF7B84CU)\r
 \r
 /** @def gioREG\r
 *   @brief GIO Register Frame Pointer\r
index a7300dc9203b036c64112596f6f16889b483e152..2ef398fbc42f17632be08f6c14a04f7f2eacdc4b 100644 (file)
@@ -90,10 +90,10 @@ Reset_Handler:
 /* System level configuration\r
    This mainly involves setting instruction mode for exceptions and interrupts.\r
 */\r
-    mrc   p15,0,r11,c1,c0,0       /* Read current system configuration */\r
+    mrc   p15,0,r11,c1,c0,0       /* Read current system configuration */ /* read System Control Register (SCTLR) */\r
     mov   r12,           #0x40000000 /* Set THUMB instruction set mode for interrupts and exceptions */\r
     orr   r12, r12, r11\r
-    mcr   p15,0,r12,c1,c0,0       /* Write new configuration */\r
+    mcr   p15,0,r12,c1,c0,0       /* Write new configuration */        /* write SCTLR */\r
 \r
 \r
 /* Initialize stack pointers.\r
index 07c16796fa0c7c3e52fd0a966f211fdd0d87373c..13fc05f508b890ac1f25d3b4760b59c71031234a 100644 (file)
@@ -21,6 +21,7 @@
 #ifndef DIO_CFG_H_\r
 #define DIO_CFG_H_\r
 #include "Port.h"\r
+#include "Std_Types.h" /** @req DIO131 */\r
 \r
 #define DIO_VERSION_INFO_API    STD_OFF\r
 #define DIO_DEV_ERROR_DETECT    STD_OFF\r
index 8746a0333546fd9289d05ec7b8bb72ff59bc010d..8f995e898aa1018d3cb5e4ac5f55db7604ced474 100644 (file)
@@ -1,4 +1,4 @@
 \r
 intvecs(R) : ORIGIN = 0x0000000, LENGTH = 0x60\r
-flash(R) : ORIGIN = 0x00000060, LENGTH = 2M\r
-ram(RW)  : ORIGIN = 0x08000000, LENGTH = 160K\r
+flash(R) : ORIGIN = 0x00000060, LENGTH = 3M\r
+ram(RW)  : ORIGIN = 0x08000000, LENGTH = 256K\r
index 5f568984d57a9c4b77a73507dffa7ca8e10a9096..999d96d9e88f5e00d473d41e3dfbc27b6955372a 100644 (file)
@@ -24,7 +24,8 @@
 #define DIO_H_
 
 #include "Modules.h"
-#include "Std_Types.h" /** @req DIO131 */
+#include "Std_Types.h"
+
 
 // API Service ID's
 #define DIO_READCHANNEL_ID                     0x00
@@ -70,7 +71,7 @@ typedef struct
 
 typedef uint32 Dio_LevelType;
 
-typedef uint16 Dio_PortLevelType;
+typedef uint32 Dio_PortLevelType;
 #endif