- Timestamp:
- Sep 21, 2018, 10:21:42 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/hal/tsar_mips32/drivers/soclib_mtty.c
r538 r539 48 48 #endif 49 49 50 extern chdev_directory_t chdev_dir; // allocated in the kernel_init.c file. 51 extern spinlock_t txt0_lock; // Initialized in kernel_init.c 50 52 //////////////////////////////////////////////////////////////////////////////////// 51 53 // These global variables implement the MTTY_RX FIFOs (one per channel) … … 538 540 char * buffer = ((txt_sync_args_t *)args)->buffer; 539 541 uint32_t count = ((txt_sync_args_t *)args)->count; 542 uint32_t channel = ((txt_sync_args_t *)args)->channel; 540 543 541 544 // get TXT0 chdev cluster and local pointer … … 554 557 xptr_t status_xp = XPTR( tty_cxy , tty_ptr + MTTY_STATUS ); 555 558 559 reg_t save_sr; 560 556 561 // loop on characters (busy waiting policy) 557 562 for( i = 0 ; i < count ; i++ ) 558 563 { 564 // This is the MTTY multiplexing 565 // Before each character, we send the destination TTY number for this char. 566 // The two bytes (dest number + char) must be sent consecutively, 567 // so to guarantee this atomicity, we use a lock to prevent other 568 // concurrent server DEV threads to write a byte in between our two bytes 569 570 // Get the lock 571 spinlock_lock_busy( &txt0_lock, &save_sr ); 572 573 // Send the destination TTY number 559 574 do 560 575 { … … 564 579 565 580 // transfer one byte if TX buffer empty 581 if ( empty ) hal_remote_sb( write_xp , channel + '0' ); 582 583 } 584 while ( empty == false ); 585 586 // Send the character 587 do 588 { 589 // get MTTY_STATUS 590 status = hal_remote_lw( status_xp ); 591 empty = ( (status & MTTY_STATUS_TX_FULL) == 0 ); 592 593 // transfer one byte if TX buffer empty 566 594 if ( empty ) hal_remote_sb( write_xp , buffer[i] ); 567 595 } 568 596 while ( empty == false ); 597 598 // Release the lock 599 spinlock_unlock_busy( &txt0_lock, save_sr ); 569 600 } 570 601 } // end soclib_mtty_aux() -
trunk/kernel/devices/dev_txt.c
r527 r539 173 173 #endif 174 174 175 // get extended pointer on TXT[0] chdev 176 xptr_t dev_xp = chdev_dir.txt_tx[0]; 177 178 assert( (dev_xp != XPTR_NULL) , __FUNCTION__ , 179 "undefined TXT0 chdev descriptor" ); 180 181 // get TXTO chdev cluster and local pointer 182 cxy_t dev_cxy = GET_CXY( dev_xp ); 183 chdev_t * dev_ptr = (chdev_t *)GET_PTR( dev_xp ); 184 185 // If we use MTTYs (vci_multi_tty), we perform only sync writes 186 if( dev_ptr->impl == IMPL_TXT_MTY ) 187 { 188 // get driver command function 189 dev_aux_t * aux = (dev_aux_t *)hal_remote_lpt( XPTR( dev_cxy , &dev_ptr->aux ) ); 190 191 // build arguments structure 192 txt_sync_args_t args; 193 args.dev_xp = dev_xp; 194 args.buffer = buffer; 195 args.count = count; 196 args.channel = channel; 197 198 // call driver function 199 aux( &args ); 200 201 return 0; 202 } 203 204 // Otherwise, we use vci_tty_tsar so we can use async writes 205 else 206 { 175 207 return dev_txt_access( TXT_WRITE , channel , buffer , count ); 208 } 176 209 177 210 #if DEBUG_DEV_TXT_TX … … 238 271 args.buffer = buffer; 239 272 args.count = count; 273 args.channel = 0; 240 274 241 275 // call driver function -
trunk/kernel/devices/dev_txt.h
r534 r539 106 106 char * buffer; /*! local pointer on characters array */ 107 107 uint32_t count; /*! number of characters in buffer */ 108 uint32_t channel; /*! channel, aka which tty to write to */ 108 109 } 109 110 txt_sync_args_t; -
trunk/kernel/kern/kernel_init.c
r536 r539 88 88 chdev_t txt0_chdev CONFIG_CACHE_LINE_ALIGNED; 89 89 90 // This variable defines the TXT0 lock for writing characters to MTY0 91 __attribute__((section(".kdata"))) 92 spinlock_t txt0_lock CONFIG_CACHE_LINE_ALIGNED; 93 90 94 // This variables define the kernel process0 descriptor 91 95 __attribute__((section(".kdata"))) … … 282 286 dev_tbl = info->int_dev; 283 287 288 // Initialize spinlock for writing to MTY0 289 spinlock_init(&txt0_lock); 290 284 291 // Loop on internal peripherals of cluster (0,0) to find MTY0 285 292 for ( i = 0; i < dev_nr; i++ )
Note: See TracChangeset
for help on using the changeset viewer.