void __attribute__((naked,noinline)) capt_seq_hook_raw_here() { asm volatile("STMFD SP!, {R0-R12,LR}\n"); raw_save_stage = RAWDATA_AVAILABLE; core_rawdata_available(); while (raw_save_stage != RAWDATA_SAVED){ _SleepTask(10); } asm volatile("LDMFD SP!, {R0-R12,PC}\n"); }
void shutdown() { //***TODO*** /* volatile long *p = (void*)0xC022001C; asm( "MRS R1, CPSR\n" "AND R0, R1, #0x80\n" "ORR R1, R1, #0x80\n" "MSR CPSR_cf, R1\n" :::"r1","r0" ); *p = 0x44; // power off. */ while(1) _SleepTask(500); }
/* called by ptp task (via remotecap.c code) to fetch chunks of jpeg data */ int filewrite_get_jpeg_chunk(char **addr,int *size,unsigned n,int *pos) { *pos=-1; #if !defined(CAM_FILEWRITETASK_MULTIPASS) // TODO null should probably be an error if (n >= MAX_CHUNKS_FOR_JPEG || jpeg_chunks == NULL) { *addr=(char *)0xFFFFFFFF; // signals last chunk *size=0; return REMOTECAP_JPEG_CHUNK_STATUS_LAST; // last chunk } *addr=(char *)jpeg_chunks[n].address; *size=jpeg_chunks[n].length; if (n < MAX_CHUNKS_FOR_JPEG-1) { if (jpeg_chunks[n+1].length==0) { return REMOTECAP_JPEG_CHUNK_STATUS_LAST; // last chunk } return REMOTECAP_JPEG_CHUNK_STATUS_MORE; // not last chunk } return REMOTECAP_JPEG_CHUNK_STATUS_LAST; // last chunk #else if ( jpeg_chunks == NULL ) { //do we have a valid queue? int m=50; while (m>0) { //wait for at most 500ms _SleepTask(10); m--; if ( jpeg_chunks != NULL ) break; } if ( jpeg_chunks == NULL ) { //timeout, error *addr=(char *)0; *size=0; return REMOTECAP_JPEG_CHUNK_STATUS_LAST; } } *addr=(char *)jpeg_chunks[jpeg_curr_session_chunk].address; *size=jpeg_chunks[jpeg_curr_session_chunk].length; #ifdef CAM_FILEWRITETASK_SEEKS if ( n == 0 ) { // first chunk for this shot jpeg_bytes_left = jpeg_full_size; } jpeg_bytes_left -= *size; if (jpeg_curr_session_chunk == 0) { *pos=jpeg_file_offset; //only post file offset for the first chunk in the current queue } #else if ((jpeg_curr_session_chunk==0) && (jpeg_last_session)) { *pos=0; //only post file offset for the first chunk in the last queue } #endif jpeg_curr_session_chunk++; #ifdef CAM_FILEWRITETASK_SEEKS if (jpeg_bytes_left>0) { if ( jpeg_curr_session_chunk < MAX_CHUNKS_FOR_JPEG ) { if (jpeg_chunks[jpeg_curr_session_chunk].length==0) { //last chunk of the current queue return REMOTECAP_JPEG_CHUNK_STATUS_SESS_LAST; } return REMOTECAP_JPEG_CHUNK_STATUS_MORE; //not last } else { return REMOTECAP_JPEG_CHUNK_STATUS_SESS_LAST; } } #else if ( jpeg_curr_session_chunk < MAX_CHUNKS_FOR_JPEG ) { if (jpeg_chunks[jpeg_curr_session_chunk].length==0) { //last chunk of the current queue if (jpeg_last_session) { return REMOTECAP_JPEG_CHUNK_STATUS_LAST; } else { return REMOTECAP_JPEG_CHUNK_STATUS_SESS_LAST; } } return REMOTECAP_JPEG_CHUNK_STATUS_MORE; //not last } else { if (jpeg_last_session) { return REMOTECAP_JPEG_CHUNK_STATUS_LAST; } else { return REMOTECAP_JPEG_CHUNK_STATUS_SESS_LAST; } } #endif return REMOTECAP_JPEG_CHUNK_STATUS_LAST; //last #endif //CAM_FILEWRITETASK_MULTIPASS }
void msleep(long msec) { _SleepTask(msec); }