diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/mpeg.c | 35 |
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 | ||
68 | enum | 69 | enum |
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"); |