uint32_t ft_nf_ind_exe_cmd(uint8_t cmd[], uint8_t cmdnr, void *buf, uint32_t size, uint32_t dir) { bool ddrmode, dummy_rbb_en; uint16_t indirect_ctrl; ddrmode = NFI.flashIntfConfig.bits.nfif == 1; ddrmode = 0; switch (cmd[0]) { case NFC_CMD_GET_FEATURE: case NFC_CMD_READ_ID: case NFC_CMD_READ_STATUS: dummy_rbb_en = true; break; default: dummy_rbb_en = false; break; } ft_nf_prepare_cmd(cmd, ddrmode ? (size << 1) : size); indirect_ctrl = (dir == DIR_OUT) ? NFC_INDIRECT_OUT : 0; indirect_ctrl |= dummy_rbb_en ? 0 : NFC_INDIRECT_DUMMY_RBB; indirect_ctrl |= NFC_INDIRECT_ACCESS_START | (cmdnr -1); NFI.indirAcesConfig.all = indirect_ctrl; /* If dummy_rbb_en, need set dummy_rbb_en signal */ if (dummy_rbb_en) { ft_udelay(10); NFI.indirAcesConfig.bits.dummy_RBB = 1; } if (size) { if (dir == DIR_OUT) { return push_data(buf, size, ddrmode); } else { if (wait_for_op_done()) return -1; else return pop_data(buf, size, ddrmode); } } return 0; }
/* ** 'discard' removes an item from the Basic stack, carrying out any ** work needed to undo the effects of that item */ static void discard(stackitem item) { basicstring temp; #ifdef DEBUG if (basicvars.debug_flags.stack) fprintf(stderr, "Drop '%s' entry at %p\n", entryname(item), basicvars.stacktop.bytesp); #endif switch(item) { case STACK_STRTEMP: temp = pop_string(); free_string(temp); break; case STACK_LOCAL: /* Restore local variable to its old value */ restore(1); break; case STACK_RETPARM: /* Deal with a 'return' parameter and restore local parameter */ restore_retparm(1); break; case STACK_GOSUB: /* Clear 'GOSUB' block from stack */ (void) pop_gosub(); break; case STACK_PROC: /* Clear 'PROC' block */ (void) pop_proc(); break; case STACK_FN: /* Clear 'FN' block */ (void) pop_fn(); break; case STACK_ERROR: /* Restore old Basic error handler */ basicvars.error_handler = pop_error(); break; case STACK_DATA: /* Restore old Basic data pointer */ basicvars.datacur = pop_data(); break; case STACK_LOCARRAY: /* Local numeric array */ basicvars.stacktop.bytesp+=entrysize[STACK_LOCARRAY]+basicvars.stacktop.locarraysp->arraysize; break; case STACK_LOCSTRING: /* Local string array */ discard_strings(basicvars.stacktop.bytesp+entrysize[STACK_LOCARRAY], basicvars.stacktop.locarraysp->arraysize); basicvars.stacktop.bytesp+=entrysize[STACK_LOCARRAY]+basicvars.stacktop.locarraysp->arraysize; break; default: if (item==STACK_UNKNOWN || item>=STACK_HIGHEST) error(ERR_BROKEN, __LINE__, "stack"); basicvars.stacktop.bytesp+=entrysize[item]; } }
// allocates space for copy of the first msg in int mtb_dequeue(int index,void **addr, size_t *ret_size){ int ret = -1; *ret_size = 0; if(index >= _N_BUFFER || index < 0 ){ //buffer index check ret = -1; // printf("in %d %d %d\n",ret,index,_N_BUFFER); } else{ pthread_mutex_lock(&(mtbs[index].mutex)); int pop_size = pop_node_check_n_msg(index); if( pop_size > 0 ){ char* msg; msg = malloc(pop_size); pop_data(index,msg,pop_size); *addr = msg; // copy msg pointer value to ret addr *ret_size = pop_size; ret = 1; } pthread_mutex_unlock(&(mtbs[index].mutex)); } return ret; }
static ssize_t emd_dev_read(struct file *file, char *buf, size_t count, loff_t *ppos) { emd_dev_client_t *client=(emd_dev_client_t *)file->private_data; int ret=0,size, data; WARN_ON(client==NULL); do{ size=pop_data(client,&data); if( sizeof(int) == size){ EMD_MSG_INF("chr","client%d get data:%08x, ret=%d\n", client->sub_dev_id, data, ret); if( copy_to_user(buf,&data,sizeof(int)) ){ EMD_MSG_INF("chr","copy_to_user fialed\n"); ret = -EFAULT; goto _OUT; }else{ ret = size; goto _OUT; } }else{ if (file->f_flags & O_NONBLOCK){ ret = -EAGAIN; goto _OUT; }else{ ret = wait_event_interruptible(client->wait_q, !kfifo_is_empty(&client->fifo)); if(ret == -ERESTARTSYS) { EMD_MSG_INF("chr","Interrupted syscall.signal_pend=0x%llx\n", *(long long *)current->pending.signal.sig); ret = -EINTR; goto _OUT; } } } }while(ret==0); _OUT: return ret; }
/* button handling using XFORM_DO */ int handle_button( int button, WORD *msg ) { OBJECT *tree = (OBJECT *)rs_trindex[GENERAL]; int done = FALSE; BOOLEAN click_flag = FALSE; MRETS mk; int ox, oy; if( ( button != -1 ) && ( button & 0x8000 ) ) { click_flag = TRUE; button &= 0x7FFF; } switch( button ) { case GSAVE: if( (*xcpb->XGen_Alert)( SAVE_DEFAULTS ) ) { (*xcpb->CPX_Save)( &cur_value, sizeof( GEN ) ); push_data(); Set_Data(); } XDeselect( tree, GSAVE ); break; case GOK: done = TRUE; Set_Data(); Deselect( GOK ); break; case GCANCEL: done = TRUE; pop_data(); Deselect( GCANCEL ); break; case STATUS: graf_mkstate( &mk.x, &mk.y, &mk.buttons, &mk.kstate ); if( objc_find( tree, ROOT, MAX_DEPTH, mk.x, mk.y ) == STATUS ) do_status(); break; case BELL: keybell_handle( BELLICON, &cur_value.bell ); break; case KEYCLICK:keybell_handle( KEYICON, &cur_value.keyclick ); break; case M0: case M1: case M2: case M3: case M4: Dclick_Select( button ); break; case DOUBLE: Dclick_Handle( click_flag, button ); break; case KREPEAT: (*xcpb->MFsave )( MFSAVE, &Other ); if( AES_Version >= 0x0320 ) graf_mouse( FLAT_HAND, 0L ); if(( AES_Version >= 0x0330 ) && ( numcol > LWHITE ) ) XSelect( tree, KREPEAT ); graf_mkstate( &ox, &mk.y, &mk.buttons, &mk.kstate ); do { graf_mkstate( &mk.x, &mk.y, &mk.buttons, &mk.kstate ); }while( mk.buttons && ( mk.x == ox )); if( mk.buttons && ( mk.x != ox )) { (*xcpb->Sl_dragx)( tree, REPTBASE, KREPEAT, KEYMIN, KEYMAX, &cur_value.repeat, KRepeat ); Set_Kbrate(); } if(( AES_Version >= 0x0330 ) && ( numcol > LWHITE ) ) XDeselect( tree, KREPEAT ); (*xcpb->MFsave)( MFRESTORE, &Other ); break; case KRESPONS: (*xcpb->MFsave)( MFSAVE, &Other ); if( AES_Version >= 0x0320 ) graf_mouse( FLAT_HAND, 0L ); if(( AES_Version >= 0x0330 ) && ( numcol > LWHITE ) ) XSelect( tree, KRESPONS ); graf_mkstate( &ox, &mk.y, &mk.buttons, &mk.kstate ); do { graf_mkstate( &mk.x, &mk.y, &mk.buttons, &mk.kstate ); }while( mk.buttons && ( mk.x == ox )); if( mk.buttons && ( mk.x != ox )) { (*xcpb->Sl_dragx)( tree, RESPBASE, KRESPONS, KEYMIN, KEYMAX, &cur_value.response, KResponse ); Set_Kbrate(); } if(( AES_Version >= 0x0330 ) && ( numcol > LWHITE ) ) XDeselect( tree, KRESPONS ); (*xcpb->MFsave)( MFRESTORE, &Other ); break; case RRESP: (*xcpb->Sl_arrow)( tree, RESPBASE, KRESPONS, RRESP, 1, KEYMIN, KEYMAX, &cur_value.response, HORIZONTAL, KResponse ); Set_Kbrate(); break; case LRESP: (*xcpb->Sl_arrow)( tree, RESPBASE, KRESPONS, LRESP, -1, KEYMIN, KEYMAX, &cur_value.response, HORIZONTAL, KResponse ); Set_Kbrate(); break; case RREPEAT: (*xcpb->Sl_arrow)( tree, REPTBASE, KREPEAT, RREPEAT, 1, KEYMIN, KEYMAX, &cur_value.repeat, HORIZONTAL, KRepeat ); Set_Kbrate(); break; case LREPEAT: (*xcpb->Sl_arrow)( tree, REPTBASE, KREPEAT, LREPEAT, -1, KEYMIN, KEYMAX, &cur_value.repeat, HORIZONTAL, KRepeat ); Set_Kbrate(); break; case REPTBASE: Graf_mkstate( &mk ); objc_offset( tree, KREPEAT, &ox, &oy ); oy = (( mk.x < ox ) ? ( -3 ) : ( 3 ) ); (*xcpb->Sl_arrow)( tree, REPTBASE, KREPEAT, -1, oy, KEYMIN, KEYMAX, &cur_value.repeat, HORIZONTAL, KRepeat ); Set_Kbrate(); break; case RESPBASE: Graf_mkstate( &mk ); objc_offset( tree, KRESPONS, &ox, &oy ); oy = (( mk.x < ox ) ? ( -3 ) : ( 3 )); (*xcpb->Sl_arrow)( tree, RESPBASE, KRESPONS, -1, oy, KEYMIN, KEYMAX, &cur_value.response, HORIZONTAL, KResponse ); Set_Kbrate(); break; case BLK1BUTT: Do_Speed(); break; case BLK2BUTT: Do_Block2(); default: if( button == -1 ) { switch( msg[0] ) { case WM_REDRAW: Redraw_Objects(); break; case AC_CLOSE: done = TRUE; pop_data(); break; case WM_CLOSED: done = TRUE; Set_Data(); break; default: break; } } break; } return( done ); }
/* cpx_call() *========================================================================== * Execute the cpx using Xform_do */ BOOLEAN cdecl cpx_call( GRECT *rect ) { int button; int quit = 0; OBJECT *tree = (OBJECT *)rs_trindex[PRINTER]; WORD msg[8]; GRECT xrect; ObX( ROOT ) = rect->g_x; ObY( ROOT ) = rect->g_y; set_objects(); Objc_draw( tree, ROOT, MAX_DEPTH, NULL ); do { button = (*xcpb->Xform_do)( tree, 0, msg ); switch( button ) { case PSAVE: if( (*xcpb->XGen_Alert)( SAVE_DEFAULTS ) ) { (*xcpb->CPX_Save)( &cur_value, sizeof( PRT ) ); push_data(); Set_Printer( &cur_value ); } Deselect( PSAVE ); xrect = ObRect( PSAVE ); objc_offset( tree, PSAVE, &xrect.g_x, &xrect.g_y ); xrect.g_x -= 2; xrect.g_y -= 2; xrect.g_w += 4; xrect.g_h += 4; Objc_draw( tree, PSAVE, MAX_DEPTH, &xrect ); #if 0 deselect( tree, PSAVE ); #endif break; case POK: quit = POK; Set_Printer( &cur_value ); Deselect( POK ); break; case PCANCEL: quit = PCANCEL; pop_data(); Deselect( PCANCEL ); break; #if GERMAN case PTYPE: Pop_Handle( PTYPE, type_array, 2, &cur_value.cur_type, IBM, 11 ); break; #endif #if FRENCH | SPAIN | SWEDEN | ITALY case PTYPE: Pop_Handle( PTYPE, type_array, 2, &cur_value.cur_type, IBM, 10 ); break; #endif #if USA | UK case PTYPE: Pop_Handle( PTYPE, type_array, 2, &cur_value.cur_type, IBM, 8 ); break; #endif #if FRENCH case COLOR: Pop_Handle( COLOR, color_array, 2, &cur_value.cur_color, IBM, 10 ); break; #endif #if ITALY case COLOR: Pop_Handle( COLOR, color_array, 2, &cur_value.cur_color, IBM, 9 ); break; #endif #if USA | UK | SPAIN | GERMAN | SWEDEN case COLOR: Pop_Handle( COLOR, color_array, 2, &cur_value.cur_color, IBM, 8 ); break; #endif case PIXLINE: Pop_Handle( PIXLINE, pix_array, 2, &cur_value.cur_pixel, IBM, 8 ); break; #if GERMAN | FRENCH | ITALY case QUALITY: Pop_Handle( QUALITY, quality_array, 2, &cur_value.cur_quality, IBM, 10 ); break; #endif #if SWEDEN case QUALITY: Pop_Handle( QUALITY, quality_array, 2, &cur_value.cur_quality, IBM, 9 ); break; #endif #if USA | UK | SPAIN case QUALITY: Pop_Handle( QUALITY, quality_array, 2, &cur_value.cur_quality, IBM, 8 ); break; #endif #if ITALY case PAPER: Pop_Handle( PAPER, paper_array, 2, &cur_value.cur_paper, IBM, 10 ); break; #endif #if USA | UK | SPAIN | GERMAN | FRENCH case PAPER: Pop_Handle( PAPER, paper_array, 2, &cur_value.cur_paper, IBM, 9 ); break; #endif #if SWEDEN case PAPER: Pop_Handle( PAPER, paper_array, 2, &cur_value.cur_paper, IBM, 8 ); break; #endif #if ITALY case PORT: Pop_Handle( PORT, port_array, 2, &cur_value.cur_port, IBM, 9 ); break; #else case PORT: Pop_Handle( PORT, port_array, 2, &cur_value.cur_port, IBM, 10 ); break; #endif default: if( button == -1 ) { switch( msg[0] ) { case WM_REDRAW: Redraw_Objects(); break; case AC_CLOSE: quit = PCANCEL; pop_data(); break; case WM_CLOSED: quit = POK; Set_Printer( &cur_value ); break; default: break; } } break; } }while( !quit); return( FALSE ); }
/* cpx_call() *========================================================================== * Execute the cpx using Xform_do() */ BOOLEAN cdecl cpx_call( GRECT *rect ) { int button; int quit = 0; OBJECT *tree = (OBJECT *)rs_trindex[RS232]; WORD msg[8]; int temp; int temp_port; long filesize; char *a,*b; GRECT xrect; set_objects( cur_port ); if( IsSTE() ) { a = port_array[ PORT_C ]; b = port_array[ PORT_D ]; strcpy( a, b ); } ObX( ROOT ) = rect->g_x; ObY( ROOT ) = rect->g_y; Objc_draw( tree, ROOT, MAX_DEPTH, NULL ); do { button = (*xcpb->Xform_do)( tree, 0, msg ); switch( button ) { /* if on a TT, we write out structure for 4 ports * but on an ST/STE/Mega, we write out just ONE! * And on a MEGA STE, we write out 3 */ case SAVE: if( (*xcpb->XGen_Alert)( SAVE_DEFAULTS ) ) { filesize = sizeof( MDEFAULT ); (*xcpb->CPX_Save)( &Modem, filesize ); Select_Ok(); } Deselect( SAVE ); xrect = ObRect( SAVE ); objc_offset( tree, SAVE, &xrect.g_x, &xrect.g_y ); xrect.g_x -= 2; xrect.g_y -= 2; xrect.g_w += 4; xrect.g_h += 4; Objc_draw( tree, SAVE, MAX_DEPTH, &xrect ); #if 0 deselect( tree, SAVE ); #endif break; case RS232OK: quit = RS232OK; Select_Ok(); Deselect( RS232OK ); break; case RS232CAN: quit = RS232CAN; pop_data(); Deselect( RS232CAN ); break; case BAUD: Pop_Handle( BAUD, baud_array, 16, &Modem.modem[ cur_port ].cur_baud, IBM, 8 ); break; case FLOW: Pop_Handle( FLOW, flow_array, 3, &Modem.modem[ cur_port ].cur_flow, IBM, 11 ); break; #if FRENCH | ITALY case PARITY: Pop_Handle( PARITY, parity_array, 3, &Modem.modem[ cur_port ].cur_parity, IBM, 10 ); break; #endif #if GERMAN case PARITY: Pop_Handle( PARITY, parity_array, 3, &Modem.modem[ cur_port ].cur_parity, IBM, 11 ); break; #endif #if USA | UK | SPAIN | SWEDEN case PARITY: Pop_Handle( PARITY, parity_array, 3, &Modem.modem[ cur_port ].cur_parity, IBM, 8 ); break; #endif case BITSCHAR: Pop_Handle( BITSCHAR, bits_array, 4, &Modem.modem[ cur_port ].cur_bits, IBM, 8 ); break; case STOPX: if( !Modem.modem[ cur_port ].cur_stop ) Pop_Handle( STOPX, stop_array, 4, &Modem.modem[ cur_port ].cur_stop, IBM, 8 ); else { temp = Modem.modem[ cur_port ].cur_stop; temp -= 1; Pop_Handle( STOPX, &stop_array[1], 3, &temp, IBM, 8 ); Modem.modem[ cur_port ].cur_stop = temp + 1; } break; case PORT: if( !IsDisabled( PORT ) ) { /* Select number of ports based on * LAN TT and MEGA STE * If on TT the LAN * is ACTIVE AND we are using CHANNEL A, * then set port to ST SERIAL using * Bconmap call. * * For the Popup, we set the number of ports and also * the default 'old_port' which is set by Set_Active_Port() */ temp_port = Get_Active_Port(); Modem.cur_port = Set_Active_Port( temp_port ); Pop_Handle( PORT, port_array, Num_Ports, &old_port, IBM, 11 ); if( old_port != cur_port ) { cur_port = old_port; Modem.cur_port = Set_Active_Port( cur_port ); set_objects( cur_port ); Objc_draw( tree, BAUD, 0, NULL ); Objc_draw( tree, FLOW, 0, NULL ); Objc_draw( tree, PARITY, 0, NULL ); Objc_draw( tree, BITSCHAR, 0, NULL ); Objc_draw( tree, STOPX, 0, NULL ); } } break; default: if( button == -1 ) { switch( msg[0] ) { case WM_REDRAW: Redraw_Objects(); break; case AC_CLOSE: quit = RS232CAN; pop_data(); break; case WM_CLOSED: quit = RS232OK; Select_Ok(); break; default: break; } } break; } }while( !quit); return( FALSE ); }