summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/mpeg.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index 4a7d37e8f8..7f2d1d4738 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -64,6 +64,7 @@ static int get_unswapped_space(void);
64#define MPEG_TRACK_CHANGE 101 64#define MPEG_TRACK_CHANGE 101
65#define MPEG_SAVE_DATA 102 65#define MPEG_SAVE_DATA 102
66#define MPEG_STOP_DONE 103 66#define MPEG_STOP_DONE 103
67#define MPEG_REC_TIMEOUT 104
67 68
68enum 69enum
69{ 70{
@@ -643,19 +644,31 @@ static void dma_tick(void)
643 else 644 else
644 { 645 {
645 int i; 646 int i;
647 int x;
646 int num_bytes = 0; 648 int num_bytes = 0;
647 if(recording && (PBDR & 0x4000)) 649 if(recording && (PBDR & 0x4000))
648 { 650 {
649 timing_info[timing_info_index++] = current_dma_tick; 651 timing_info[timing_info_index++] = current_dma_tick;
650 TCNT2 = 0; 652 TCNT2 = 0;
651 for(i = 0;i < 30;i++) 653 for(i = 0;i < 30 && (PBDR & 0x4000);i++)
652 { 654 {
653 if(read_hw_mask() & PR_ACTIVE_HIGH) 655 if(read_hw_mask() & PR_ACTIVE_HIGH)
654 PADR |= 0x800; 656 PADR |= 0x800;
655 else 657 else
656 PADR &= ~0x800; 658 PADR &= ~0x800;
659
660 for(x = 2000;PBDR & 0x8000 && x;x--) {};
661
662 if(x == 0)
663 {
664 queue_post(&mpeg_queue, MPEG_REC_TIMEOUT, (void *)0);
665 if(read_hw_mask() & PR_ACTIVE_HIGH)
666 PADR &= ~0x800;
667 else
668 PADR |= 0x800;
669 break;
670 }
657 671
658 while(PBDR & 0x8000) {};
659 mp3buf[mp3buf_write] = *(unsigned char *)0x4000000; 672 mp3buf[mp3buf_write] = *(unsigned char *)0x4000000;
660 673
661 if(read_hw_mask() & PR_ACTIVE_HIGH) 674 if(read_hw_mask() & PR_ACTIVE_HIGH)
@@ -668,7 +681,17 @@ static void dma_tick(void)
668 mp3buf_write = 0; 681 mp3buf_write = 0;
669 682
670 num_bytes++; 683 num_bytes++;
671 while(!(PBDR & 0x8000)) {}; 684
685 for(x = 2000;!(PBDR & 0x8000) && x;x--) {};
686 if(x == 0)
687 {
688 queue_post(&mpeg_queue, MPEG_REC_TIMEOUT, (void *)1);
689 if(read_hw_mask() & PR_ACTIVE_HIGH)
690 PADR &= ~0x800;
691 else
692 PADR |= 0x800;
693 break;
694 }
672 } 695 }
673 timing_info[timing_info_index++] = TCNT2 + (num_bytes << 16); 696 timing_info[timing_info_index++] = TCNT2 + (num_bytes << 16);
674 697
@@ -1569,6 +1592,12 @@ static void mpeg_thread(void)
1569 stop_pending = true; 1592 stop_pending = true;
1570 queue_post(&mpeg_queue, MPEG_SAVE_DATA, 0); 1593 queue_post(&mpeg_queue, MPEG_SAVE_DATA, 0);
1571 break; 1594 break;
1595
1596 case MPEG_REC_TIMEOUT:
1597 if(mpeg_file >= 0)
1598 close(mpeg_file);
1599 panicf("Timeout: %d", (int)ev.data);
1600 break;
1572 1601
1573 case MPEG_STOP_DONE: 1602 case MPEG_STOP_DONE:
1574 DEBUGF("MPEG_STOP_DONE\n"); 1603 DEBUGF("MPEG_STOP_DONE\n");