OSDN Git Service

Fixed some implementation for an interrupt handler.
authorShinichiro Nakamura <shinta.main.jp@gmail.com>
Fri, 17 Aug 2012 22:17:51 +0000 (07:17 +0900)
committerShinichiro Nakamura <shinta.main.jp@gmail.com>
Fri, 17 Aug 2012 22:17:51 +0000 (07:17 +0900)
firm/bare_metal/ChangeLog
firm/bare_metal/README
firm/bare_metal/main.c

index 5faa7a2..7e76230 100644 (file)
@@ -1,26 +1,31 @@
 2012-07-07 Shinichiro Nakamura <shinta.main.jp@gmail.com>
 
-       * \e$B%*%j%8%J%k$O\e(BVisualDSP++\e$B$r;HMQ$7$F$$$k!#\e(B
+       * オリジナルはVisualDSP++を使用している。
 
-       * \e$B;HMQ$7$F$$$k\e(BSPORT\e$B$r\e(BSPORT1\e$B$+$i\e(BSPORT0\e$B$KJQ99$7$?!#\e(B
+       * 使用しているSPORTをSPORT1からSPORT0に変更した。
 
-       * SPORT\e$B$NJQ99$KH<$$\e(BDMA3\e$B$+$i\e(BDMA1\e$B$KJQ99$7$?!#\e(B
+       * SPORTの変更に伴いDMA3からDMA1に変更した。
 
-       * SPORT\e$B$NJQ99$KH<$$\e(BDMA4\e$B$+$i\e(BDMA2\e$B$KJQ99$7$?!#\e(B
+       * SPORTの変更に伴いDMA4からDMA2に変更した。
 
-       * MUTE\e$B%T%s$N@)8f$rDI2C$7$?!#\e(B
+       * MUTEピンの制御を追加した。
 
-       * gcc\e$B8~$1$K3d$j9~$_4X?t$N<BAu$r=$@5$7$?!#\e(B
+       * gcc向けに割り込み関数の実装を修正した。
 
 2012-08-10 Shinichiro Nakamura <shinta.main.jp@gmail.com>
 
-       * main.c\e$B$NJQ?tL>$r0lItJQ99$7$?!#\e(B
+       * main.cの変数名を一部変更した。
 
-       * twi.c\e$B$rDI2C$7!"\e(BTWI\e$B$N=hM}$r0\F0$5$;$?!#\e(B
+       * twi.cを追加し、TWIの処理を移動させた。
 
-       * ssm2603.c\e$B$rDI2C$7!"\e(BSSM2603\e$B$N=hM}$r0\F0$5$;$?!#\e(B
+       * ssm2603.cを追加し、SSM2603の処理を移動させた。
 
-       * \e$B0lIt$N%U%!%$%k$N\e(Bfileencoding\e$B$r=$@5$7$?!#\e(B
+       * 一部のファイルのfileencodingを修正した。
 
-       * \e$B0lIt$N%U%!%$%k$N\e(Bfileformat\e$B$r=$@5$7$?!#\e(B
+       * 一部のファイルのfileformatを修正した。
 
+2012-08-18 Shinichiro Nakamura <shinta.main.jp@gmail.com>
+
+       * ユティリティモジュールを追加した。
+
+       * 割り込み関数登録の実装を修正した。
index 7680bba..480e3b4 100644 (file)
@@ -1,2 +1,52 @@
 ハードウェア動作確認用のベアメタルなファームウェア。
 オリジナルのコードは金子システムさんがウェブ上で公開されていたもの。
+
+==========================================================================
+[Terminal #1]
+==========================================================================
+> sudo /opt/uClinux/bfin-elf/bin/bfin-gdbproxy bfin
+
+Remote proxy for GDB, v0.7.2, Copyright (C) 1999 Quality Quorum Inc.
+MSP430 adaption Copyright (C) 2002 Chris Liechti and Steve Underwood
+Blackfin adaption Copyright (C) 2008 Analog Devices, Inc.
+
+GDBproxy comes with ABSOLUTELY NO WARRANTY; for details
+use `--warranty' option. This is Open Source software. You are
+welcome to redistribute it under certain conditions. Use the
+'--copying' option for details.
+
+Found USB cable: gnICE+
+Connected to libftdi driver.
+IR length: 5
+Chain length: 1
+Device Id: 00100010100000000010000011001011 (0x228020CB)
+  Manufacturer: Analog Devices, Inc. (0x0CB)
+  Part(0):      BF592 (0x2802)
+  Stepping:     2
+  Filename:     /opt/uClinux/bfin-elf/bin/../share/urjtag/analog/bf592/bf592
+warning:   bfin: no board selected, BF592 is detected
+notice:    bfin: jc: waiting on TCP port 2001
+notice:    bfin: jc:  (you must connect GDB before using jtag console)
+notice:    bfin-gdbproxy: waiting on TCP port 2000
+
+==========================================================================
+[Terminal #2]
+==========================================================================
+> bfin-elf-ldr -T BF592 -c bluetank.ldr bluetank.elf
+> bfin-elf-ldr -l bluetank.ldr /dev/ttyUSB0 -b 57600 -C
+
+Creating LDR obj/bluetank.ldr ...
+ Adding DXE 'obj/bluetank.elf' ... [jump block to 0xFFA00000] [ELF block: 5768 @ 0xFF800000] [ELF block: 11348 @ 0xFFA00000] OK!
+Done!
+bfin-elf-ldr -l obj/bluetank.ldr /dev/ttyUSB0 -b 57600 -C
+Loading LDR obj/bluetank.ldr ... OK!
+Opening /dev/ttyUSB0 ... OK!
+Configuring terminal I/O ... OK!
+Trying to send autobaud ... OK!
+Trying to read autobaud ... OK!
+Checking autobaud ... OK!
+Autobaud result: 57600bps 36.864mhz (header:0xBF DLL:0x28 DLH:0x00 fin:0x00)
+Sending blocks of DXE 1 ... OK!         
+You may want to run minicom or kermit now
+Quick tip: run 'ldr <ldr> <devspec> && minicom'
+
index 5ce5eb7..d04d479 100644 (file)
@@ -4,9 +4,11 @@
  * @author Copyright(C) 2012 Shinichiro Nakamura
  */
 
-#include <cdefBF592-A.h>
 #include <stdint.h>
 #include <string.h>
+#include <cdefBF592-A.h>
+#include <builtins.h>
+#include <sys/exception.h>
 #include "lcd.h"
 #include "led.h"
 #include "pff.h"
 #define SCLOCK_HZ           (100000000) /**< システムクロック(100MHz) */
 #define DMA_SAMPLE_SIZE     (256)       /**< 1回のサンプルサイズ */
 
-void sport_rx_isr() __attribute__((interrupt_handler));
-void audio_effect(const int32_t* src, int32_t* des, int32_t count);
+typedef __attribute__((interrupt_handler)) void (*ex_handler_fn_gcc)(void);
 
-static int32_t sport_buffer_rx[2][DMA_SAMPLE_SIZE]; /**< SPORT受信バッファ(ダブルバッファ) */
-static int32_t sport_buffer_tx[2][DMA_SAMPLE_SIZE]; /**< SPORT受信バッファ(ダブルバッファ) */
-static volatile int32_t bufidx_dma_target;          /**< DMAがどのバッファ使用をしているか */
-static volatile int32_t data_ready;                 /**< データ転送完了フラグ */
+static void setup_pll(uint8_t mul_val, uint8_t div_val);
+static void __attribute__((interrupt_handler)) sport_rx_isr();
+static void audio_effect(const int32_t* src, int32_t* des, int32_t count);
 
-int iii;
+/**
+ * SPORT受信バッファ(ダブルバッファ)
+ */
+static int32_t sport_buffer_rx[2][DMA_SAMPLE_SIZE];
+/**
+ * SPORT受信バッファ(ダブルバッファ)
+ */
+static int32_t sport_buffer_tx[2][DMA_SAMPLE_SIZE];
+/**
+ * DMAがどのバッファ使用をしているか
+ */
+static volatile int32_t bufidx_dma_target;
+/**
+ * データ転送完了フラグ
+ */
+static volatile int32_t data_ready;
 
 static void setup_pll(uint8_t mul_val, uint8_t div_val)
 {
@@ -34,16 +49,41 @@ static void setup_pll(uint8_t mul_val, uint8_t div_val)
     *pSIC_IWR = IWR_ENABLE_ALL;
 }
 
-__attribute__((interrupt_handler)) void sport_rx_isr()
+static void __attribute__((interrupt_handler)) sport_rx_isr()
 {
     *pDMA1_IRQ_STATUS = DMA_DONE;
-    asm("ssync;");
+    ssync();
     /* オーディオコーデックからデータ到着 */
     data_ready = 1;
     /* DMAが使用するバッファを変更 */
     bufidx_dma_target = (bufidx_dma_target ^ 1) & 1;
 }
 
+/**
+ * @brief オーディオ処理を実行する。
+ *
+ * @param src 処理元バッファ。
+ * @param des 処理後バッファ。
+ */
+static void audio_effect(const int32_t *src, int32_t *des, int32_t count)
+{
+    memcpy(des, src, sizeof(int32_t) * count);
+}
+
+static void vdsp_register_handler(interrupt_kind kind, ex_handler_fn_gcc fn)
+{
+    uint32_t mask;
+
+    if ((ik_emulation > kind) || (kind > ik_ivg15)) {
+        return;
+    }
+
+    *((ex_handler_fn_gcc*)&(((uint32_t*)EVT0)[(int32_t)kind])) = fn;
+    mask  = cli();
+    mask |= 1u << (int32_t)kind;
+    sti(mask);
+}
+
 int main(void)
 {
     int32_t bufidx_dma_done;
@@ -104,12 +144,8 @@ int main(void)
      * 割り込みハンドラの登録。
      * IVG9が登録先。
      */
-    *pEVT9 = sport_rx_isr;
-    asm("ssync;");
-    asm volatile ("cli %0; bitset (%0, 9); sti %0; csync;": "+d"(iii)); // set IMASK bit
-    asm("ssync;");
+    vdsp_register_handler(ik_ivg9, sport_rx_isr);
     *pSIC_IMASK |= IRQ_DMA1;
-    asm("ssync;");
 
     /*
      * SPORT RXの設定
@@ -148,7 +184,7 @@ int main(void)
     *pDMA2_X_MODIFY = sizeof(int32_t);
     *pDMA2_Y_COUNT = 2;
     *pDMA2_Y_MODIFY = sizeof(int32_t);
-    asm("ssync;");
+    ssync();
 
     /*
      * DMAを有効
@@ -156,14 +192,14 @@ int main(void)
     *pDMA1_IRQ_STATUS = DMA_DONE;
     *pDMA1_CONFIG |= DMAEN;
     *pDMA2_CONFIG |= DMAEN;
-    asm("ssync;");
+    ssync();
 
     /*
      * SPORT0を有効
      */
     *pSPORT0_TCR1 |= TSPEN;
     *pSPORT0_RCR1 |= RSPEN;
-    asm("ssync;");
+    ssync();
 
     /*
      * 初期化の完了をユーザに通知する。
@@ -191,20 +227,13 @@ int main(void)
              */
             bufidx_dma_done = bufidx_dma_target ^ 1;
             audio_effect(sport_buffer_rx[bufidx_dma_done], sport_buffer_tx[bufidx_dma_done], DMA_SAMPLE_SIZE);
+            /*
+             *
+             */
+            led_write(LedTargetR, 1);
         }
     }
 
     return 0;
 }
 
-/**
- * @brief オーディオ処理を実行する。
- *
- * @param src 処理元バッファ。
- * @param des 処理後バッファ。
- */
-void audio_effect(const int32_t *src, int32_t *des, int32_t count)
-{
-    memcpy(des, src, sizeof(int32_t) * count);
-}
-