OSDN Git Service

Changed system task structure.
authorShinichiro Nakamura <shinta.main.jp@gmail.com>
Sun, 15 Jul 2012 09:46:36 +0000 (18:46 +0900)
committerShinichiro Nakamura <shinta.main.jp@gmail.com>
Sun, 15 Jul 2012 09:46:36 +0000 (18:46 +0900)
firm/sample/sample1/os/Makefile
firm/sample/sample1/os/main.c
firm/sample/sample1/os/memory.c
firm/sample/sample1/os/task.h
firm/sample/sample1/os/task_audio.c
firm/sample/sample1/os/task_audio.h
firm/sample/sample1/os/task_menu.c [new file with mode: 0644]
firm/sample/sample1/os/task_menu.h [new file with mode: 0644]
firm/sample/sample1/os/vs1011e.c
firm/sample/sample1/os/vs1011e.h

index f61af85..d44417f 100644 (file)
@@ -30,6 +30,9 @@ OBJS += spi.o spreg.o
 # Tasks
 OBJS += task_input.o
 OBJS += task_command.o
+OBJS += task_display.o
+OBJS += task_audio.o
+OBJS += task_menu.o
 
 # Kernel
 OBJS += kozos.o syscall.o memory.o
@@ -37,8 +40,6 @@ OBJS += kozos.o syscall.o memory.o
 # Drivers
 OBJS += driver_console.o
 OBJS += driver_timer.o
-OBJS += task_display.o
-OBJS += task_audio.o
 
 TARGET = kozos
 
index 2ad18c0..e4de79f 100644 (file)
@@ -11,13 +11,15 @@ static int start_threads(int argc, char *argv[])
    */
   kz_run(driver_console,    "dConsole",  1, 0x200, 0, NULL);
   kz_run(driver_timer,      "dTimer",    2, 0x200, 0, NULL);
+
   /*
    * Tasks
    */
-  kz_run(task_display,      "tDisplay",  5, 0x800, 0, NULL);
   kz_run(task_audio,        "tAudio",    5, 0x800, 0, NULL);
-  kz_run(task_input,        "tInput",    5, 0x800, 0, NULL);
-  kz_run(task_command,      "tCommand",  8, 0x800, 0, NULL);
+  kz_run(task_display,      "tDisplay",  6, 0x800, 0, NULL);
+  kz_run(task_menu,         "tMenu",     8, 0x800, 0, NULL);
+  kz_run(task_input,        "tInput",    8, 0x800, 0, NULL);
+  kz_run(task_command,      "tCommand",  9, 0x800, 0, NULL);
 
   kz_chpri(15); /* Í¥Àè½ç°Ì¤ò²¼¤²¤Æ¡¤¥¢¥¤¥É¥ë¥¹¥ì¥Ã¥É¤Ë°Ü¹Ô¤¹¤ë */
   INTR_ENABLE; /* ³ä¹þ¤ßÍ­¸ú¤Ë¤¹¤ë */
index 35ff7b5..1c4cc9b 100644 (file)
@@ -27,6 +27,7 @@ static kzmem_pool pool[] = {
   {   64, 8, NULL },
   {  128, 2, NULL },
   {  256, 2, NULL },
+  {  512, 2, NULL },
   { 1024, 2, NULL },
 };
 
@@ -78,8 +79,8 @@ void *kzmem_alloc(int size)
     p = &pool[i];
     if (size <= p->size - sizeof(kzmem_block)) {
       if (p->free == NULL) { /* ²òÊüºÑ¤ßÎΰ褬̵¤¤(¥á¥â¥ê¡¦¥Ö¥í¥Ã¥¯ÉÔ­) */
-       kz_sysdown();
-       return NULL;
+        kz_sysdown();
+        return NULL;
       }
       /* ²òÊüºÑ¤ß¥ê¥ó¥¯¥ê¥¹¥È¤«¤éÎΰè¤ò¼èÆÀ¤¹¤ë */
       mp = p->free;
index f0aa5f7..f4c99ca 100644 (file)
@@ -5,5 +5,6 @@
 #include "task_command.h"
 #include "task_audio.h"
 #include "task_display.h"
+#include "task_menu.h"
 
 #endif
index 8dbb51c..a7d9378 100644 (file)
@@ -2,8 +2,10 @@
 #include "vs1011e.h"
 #include "kozos.h"
 #include "pff.h"
+#include "lib.h"
 
-#define AUDIO_CMD_PULSE  'p'
+#define AUDIO_CMD_PULSE 'p'
+#define AUDIO_CMD_PLAY  'd'
 
 void audio_pulse(void)
 {
@@ -13,6 +15,18 @@ void audio_pulse(void)
   kz_send(MSGBOX_ID_AUDIO, 1, p);
 }
 
+void audio_play(void *buf, int siz)
+{
+  char *p;
+  p = kz_kmalloc(4 + siz);
+  p[0] = AUDIO_CMD_PLAY;
+  p[1] = 0;
+  p[2] = (siz >> 8) & 0xff;
+  p[3] = (siz >> 0) & 0xff;
+  memcpy((void *)&p[4], buf, siz);
+  kz_send(MSGBOX_ID_AUDIO, 4 + siz, p);
+}
+
 static int audio_cmdproc(char *p)
 {
   int cmd = p[0];
@@ -24,6 +38,12 @@ static int audio_cmdproc(char *p)
     vs1011e_sinetest_fini();
     for (i = 0; i < 1000; i++) { }
     break;
+  case AUDIO_CMD_PLAY:
+    puts(">");
+    vs1011e_play_with_data(
+        &p[4],
+        ((unsigned char)p[2] << 8) | ((unsigned char)p[3] << 0));
+    break;
   default:
     break;
   }
@@ -32,60 +52,11 @@ static int audio_cmdproc(char *p)
   return 0;
 }
 
-int readfunc(void * buf, const int len)
-{
-    WORD cnt;
-    pf_read(buf, len, &cnt);
-    kz_wait();
-    return cnt;
-}
-
-static int play(const char *filename)
-{
-    FRESULT r = pf_open("splash.mp3");
-    if (r != FR_OK) {
-        return 1;
-    }
-    int siz = 512;
-    void *p = kz_kmalloc(siz);
-    vs1011e_play(p, siz, readfunc);
-    kz_kmfree(p);
-    return 0;
-}
-
 int task_audio(int argc, char *argv[])
 {
   int size;
   char *p;
 
-#if 0
-  /*
-   * mp3\e$B%U%!%$%k$N:F@8%F%9%H!#\e(B
-   */
-  FATFS fatfs;
-  DIR dir;
-  FILINFO filinfo;
-
-  vs1011e_volume_write(0x02, 0x02);
-  while (1) {
-      if (pf_mount(&fatfs)) {
-          continue;
-      }
-      while (1) {
-          if (pf_opendir(&dir, "")) {
-              break;
-          }
-          while (!pf_readdir(&dir, &filinfo) && filinfo.fname[0]) {
-              if (!(filinfo.fattrib & (AM_DIR | AM_HID))) {
-                  if (play(filinfo.fname)) {
-                      break;
-                  }
-              }
-          }
-      }
-  }
-#endif
-
   while (1) {
     kz_recv(MSGBOX_ID_AUDIO, &size, &p);
     audio_cmdproc(p);
index 72cdf03..ca1081a 100644 (file)
@@ -2,6 +2,7 @@
 #define TASK_AUDIO_H
 
 void audio_pulse(void);
+void audio_play(void *buf, int siz);
 int task_audio(int argc, char *argv[]);
 
 #endif
diff --git a/firm/sample/sample1/os/task_menu.c b/firm/sample/sample1/os/task_menu.c
new file mode 100644 (file)
index 0000000..55b9e94
--- /dev/null
@@ -0,0 +1,57 @@
+
+#include "task_menu.h"
+#include "task_audio.h"
+#include "pff.h"
+#include "kozos.h"
+#include "lib.h"
+
+static int play(const char *filename)
+{
+    FRESULT r = pf_open("splash.mp3");
+    if (r != FR_OK) {
+        return 1;
+    }
+    WORD cnt;
+    const int siz = 32;
+    do {
+        puts("o");
+        void *buf = kz_kmalloc(siz);
+        pf_read(buf, siz, &cnt);
+        audio_play(buf, cnt);
+    } while (cnt == siz);
+    return 0;
+}
+
+int task_menu(int argc, char *argv[])
+{
+#if 0
+  FATFS fatfs;
+  DIR dir;
+  FILINFO filinfo;
+
+  while (1) {
+      if (pf_mount(&fatfs)) {
+          continue;
+      }
+      while (1) {
+          if (pf_opendir(&dir, "")) {
+              break;
+          }
+          while (!pf_readdir(&dir, &filinfo) && filinfo.fname[0]) {
+              if (!(filinfo.fattrib & (AM_DIR | AM_HID))) {
+                  if (play(filinfo.fname)) {
+                      break;
+                  }
+              }
+          }
+      }
+  }
+#else
+  while (1) {
+    kz_wait();
+  }
+#endif
+
+  return 0;
+}
+
diff --git a/firm/sample/sample1/os/task_menu.h b/firm/sample/sample1/os/task_menu.h
new file mode 100644 (file)
index 0000000..0b933c9
--- /dev/null
@@ -0,0 +1,8 @@
+
+#ifndef _TASK_MENU_H_
+#define _TASK_MENU_H_
+
+int task_menu(int argc, char *argv[]);
+
+#endif
+
index aea8677..7622b25 100644 (file)
@@ -2,7 +2,6 @@
 #include "vs1011e.h"
 #include "portconf.h"
 #include "spi.h"
-#include "kozos.h"
 
 #define VS1011E_OPCODE_READ    0x03
 #define VS1011E_OPCODE_WRITE   0x02
@@ -186,6 +185,7 @@ void vs1011e_volume_write(const uint8 left, const uint8 right)
 
 void vs1011e_play(
         void *buf, int siz,
+        int (*waitfunc)(void),
         int (*readfunc)(void * buf, const int len))
 {
     int i;
@@ -203,7 +203,9 @@ void vs1011e_play(
         spi_select(SpiTarget_VS1011E_DATA);
         for (i = 0; i < n; i++) {
             while (VS1011E_CHK_DREQ()) {
-                kz_wait();
+                if (waitfunc() <= 0) {
+                    return;
+                }
             }
             spi_tx(*((char *)buf + i));
         }
@@ -211,6 +213,21 @@ void vs1011e_play(
     }
 }
 
+void vs1011e_play_with_data(void *buf, int siz)
+{
+    int i;
+    /*
+     * Send the data.
+     */
+    spi_select(SpiTarget_VS1011E_DATA);
+    for (i = 0; i < siz; i++) {
+        while (VS1011E_CHK_DREQ()) {
+        }
+        spi_tx(*((char *)buf + i));
+    }
+    spi_deselect();
+}
+
 void vs1011e_decodetime_read(uint16 * sec)
 {
     vs1011e_read(REGADDR_DECODE_TIME, sec);
index 7380b5d..afd1200 100644 (file)
@@ -13,7 +13,9 @@ void vs1011e_volume_read(uint8 * left, uint8 * right);
 void vs1011e_volume_write(const uint8 left, const uint8 right);
 void vs1011e_play(
         void *buf, int siz,
+        int (*waitfunc)(void),
         int (*readfunc)(void * buf, const int len));
+void vs1011e_play_with_data(void *buf, int siz);
 void vs1011e_decodetime_read(uint16 * sec);
 void vs1011e_decodetime_write(const uint16 sec);
 void vs1011e_register_print(void);