Changeset 810 for trunk/softs/giet_tsar
- Timestamp:
- Sep 19, 2014, 2:53:18 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/softs/giet_tsar/stdio.c
r744 r810 72 72 #define in_drivers __attribute__((section (".drivers"))) 73 73 #define in_unckdata __attribute__((section (".unckdata"))) 74 #define cacheline_aligned __attribute__((aligned(64))) 74 75 75 76 ////////////////////////////////////////////////////////////// … … 92 93 static in_unckdata int volatile _ioc_status; 93 94 94 static in_unckdata char volatile _tty_get_buf[NB_TTY_CHANNELS]; 95 static in_unckdata int volatile _tty_get_full[NB_TTY_CHANNELS] = { [0 ... NB_TTY_CHANNELS-1] = 0 }; 95 static volatile in_unckdata struct cacheline_aligned { 96 int lock; 97 int get_full; 98 char get_buf; 99 char __padding[55]; 100 } _tty_channel[NB_TTY_CHANNELS]; 96 101 97 102 //////////////////////////////////////////////////////////////////////////////////////// … … 141 146 in_drivers void _extended_memcpy( unsigned int dst_cluster, 142 147 unsigned int dst_address, 148 unsigned int src_cluster, 143 149 unsigned int src_address, 144 150 unsigned int length ) … … 157 163 for ( i = 0 ; i < length ; i = i+4 ) 158 164 { 159 word = _word_extended_read( src_cluster, (src_address + i));160 _word_extended_write( dst_cluster, (dst_address + i), word );165 word = _word_extended_read( src_cluster, src_address + i ); 166 _word_extended_write( dst_cluster, dst_address + i, word ); 161 167 } 162 168 } … … 545 551 in_drivers void _tty_get_lock( unsigned int channel ) 546 552 { 547 unsigned int base = (unsigned int)&seg_tty_base; 548 unsigned int offset = (TTY_CONFIG + channel*TTY_SPAN) << 2; 549 while ( _word_extended_read( CLUSTER_IO, base + offset ) ); 553 register unsigned int* plock = (unsigned int*)&_tty_channel[channel].lock; 554 555 asm volatile ( 556 "1: \n" 557 "ll $2, 0(%0) \n" // $2 <= _tty_lock 558 "bnez $2, 1b \n" // retry if busy 559 "li $3, 1 \n" // prepare argument for sc 560 "sc $3, 0(%0) \n" // try to set _tty_busy 561 "beqz $3, 1b \n" // retry if not atomic 562 ::"r"(plock) :"$2","$3"); 550 563 } 551 564 … … 556 569 in_drivers void _tty_release_lock( unsigned int channel ) 557 570 { 558 unsigned int base = (unsigned int)&seg_tty_base; 559 unsigned int offset = (TTY_CONFIG + channel*TTY_SPAN) << 2; 560 _word_extended_write( CLUSTER_IO, base + offset, 0 ); 571 _tty_channel[channel].lock = 0; 561 572 } 562 573 … … 813 824 unsigned int offset = (index*TTY_SPAN + TTY_READ) << 2; 814 825 815 _tty_ get_buf[index]= _byte_extended_read(CLUSTER_IO, base + offset);816 _tty_ get_full[index]= 1; // signals character available826 _tty_channel[index].get_buf = _byte_extended_read(CLUSTER_IO, base + offset); 827 _tty_channel[index].get_full = 1; // signals character available 817 828 } 818 829 … … 872 883 // reset the _ioc_done variable to zero, and releases the _ioc_lock variable. 873 884 /////////////////////////////////////////////////////////////////////////////////////// 874 // If USE_ RAMDISK is set, we access a "virtual" block device controlerimplemented885 // If USE_IOC_RDK is set, we access a "virtual" block device controler implemented 875 886 // as a memory-mapped segment in cluster [0,0] at address seg_ramdisk_base. 876 887 // The tranfer being fully synchronous, the IOC interrupt is not activated. … … 910 921 _ioc_get_lock(); 911 922 912 if ( USE_ RAMDISK ) // we use an extended_memcpy923 if ( USE_IOC_RDK ) // we use an extended_memcpy 913 924 { 914 925 unsigned int src_address = (unsigned int)buffer; … … 953 964 _ioc_get_lock(); 954 965 955 if ( USE_ RAMDISK ) // we use an extended_memcpy966 if ( USE_IOC_RDK ) // we use an extended_memcpy 956 967 { 957 968 unsigned int dst_address = (unsigned int)buffer;
Note: See TracChangeset
for help on using the changeset viewer.