static void gpio_init(void) { // setup power and eject button hollywood IRQ for PPC mask32(HW_GPIO1OWNER, 0, 0x41); // set GPIO owner to PPC irq_hw_enable(IRQ_HW_GPIO1B); mask32(HW_GPIO1BINTENABLE, 0, 0x41); mask32(HW_GPIO1BINTLVL, 0, 0x41); }
void lcd_init(void) { _Bool ok = init_app("LCD", NULL, SDL_INIT_VIDEO) && SDL_SetVideoMode(WIDTH, HEIGHT, 24, SDL_HWSURFACE); assert(ok); data_sf = SDL_CreateRGBSurfaceFrom( buffer, WIDTH, HEIGHT, 24, WIDTH * 3, mask32(0), mask32(1), mask32(2), 0); }
static int recv_bits(int bits) { int res = 0; while (bits--) { res <<= 1; mask32(HW_GPIO1OUT, 0, GP_EEP_CLK); eeprom_delay(); mask32(HW_GPIO1OUT, GP_EEP_CLK, 0); eeprom_delay(); res |= !!(read32(HW_GPIO1IN) & GP_EEP_MISO); } return res; }
static void send_bits(int b, int bits) { while (bits--) { if (b & (1 << bits)) mask32(HW_GPIO1OUT, 0, GP_EEP_MOSI); else mask32(HW_GPIO1OUT, GP_EEP_MOSI, 0); eeprom_delay(); mask32(HW_GPIO1OUT, 0, GP_EEP_CLK); eeprom_delay(); mask32(HW_GPIO1OUT, GP_EEP_CLK, 0); eeprom_delay(); } }
static const char* cmask32(const char *mb_c, const char *me_c) { static char cmask[32]; ut32 mb = 32; ut32 me = 32; if (mb_c) mb += strtol (mb_c, NULL, 16); if (me_c) me += strtol (me_c, NULL, 16); snprintf (cmask, sizeof (cmask), "0x%"PFMT32x"", mask32 (mb, me)); return cmask; }
static const char* inv_mask32(const char *mb_c, const char *sh) { static char cmask[32]; ut32 mb = 0; ut32 me = 0; if (mb_c) mb = atol (mb_c); if (sh) me = atol (sh); snprintf (cmask, sizeof (cmask), "0x%"PFMT32x"", mask32 (mb, ~me)); return cmask; }
void InitVideo() { VIDEO_Init(); // If WiiU - Force 16:9 aspect ratio based on WiiU settings if(isWiiU() && Settings.widescreen) { write32(0xd8006a0, 0x30000004), mask32(0xd8006a8, 0, 2); } vmode = VIDEO_GetPreferredMode(NULL); // get default video mode vmode->viWidth = Settings.widescreen ? 708 : 694; if (Settings.PAL50) { vmode->viXOrigin = (VI_MAX_WIDTH_PAL - vmode->viWidth) / 2; } else { vmode->viXOrigin = (VI_MAX_WIDTH_NTSC - vmode->viWidth) / 2; } VIDEO_Configure(vmode); screenheight = 480; screenwidth = vmode->fbWidth; // Allocate the video buffers xfb[0] = (u32 *) MEM_K0_TO_K1 ( SYS_AllocateFramebuffer ( vmode ) ); xfb[1] = (u32 *) MEM_K0_TO_K1 ( SYS_AllocateFramebuffer ( vmode ) ); // Clear framebuffers etc. VIDEO_ClearFrameBuffer(vmode, xfb[0], COLOR_BLACK); VIDEO_ClearFrameBuffer(vmode, xfb[1], COLOR_BLACK); VIDEO_SetNextFramebuffer(xfb[0]); VIDEO_Flush(); VIDEO_WaitVSync(); if (vmode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); // Initialize GX GXColor background = { 0, 0, 0, 0xff }; gp_fifo = (u8 *) memalign(32, GP_FIFO_SIZE); memset (gp_fifo, 0, GP_FIFO_SIZE); GX_Init (gp_fifo, GP_FIFO_SIZE); GX_SetCopyClear (background, 0x00ffffff); GX_SetDispCopyGamma (GX_GM_1_0); GX_SetCullMode (GX_CULL_NONE); ResetVideo_Menu(); VIDEO_SetBlack(FALSE); // Finally, the video is up and ready for use :) }
static ut32 mask32(ut32 mb, ut32 me) { int i; ut32 mask = 0; if (mb > 31 || me > 31) { return mask; } if (mb < (me + 1)) { for (i = mb; i <= me; i++) { mask = mask | (ut32) (1LL << (31 - i)); } } else if (mb == (me + 1)) { mask = 0xffffffffu; } else if (mb > (me + 1)) { ut32 lo = mask32 (0, me); ut32 hi = mask32 (mb, 31); mask = lo | hi; } return mask; }
int main(int argc, char **argv) { dev_name = "/dev/video0"; setpriority(PRIO_PROCESS, 0, -10); generate_YCbCr_to_RGB_lookup(); open_device(); init_device(); atexit(SDL_Quit); if (SDL_Init(SDL_INIT_VIDEO) < 0) return 1; SDL_WM_SetCaption(filter_names[filter_no], NULL); buffer_sdl = (uint8_t*)malloc(WIDTH*HEIGHT*3); SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_DOUBLEBUF|SDL_ASYNCBLIT|SDL_HWACCEL|SDL_HWSURFACE); data_sf = SDL_CreateRGBSurfaceFrom(buffer_sdl, WIDTH, HEIGHT, 24, WIDTH * 3, mask32(0), mask32(1), mask32(2), 0); SDL_SetEventFilter(sdl_filter); start_capturing(); mainloop(); stop_capturing(); uninit_device(); close_device(); SDL_FreeSurface(data_sf); free(buffer_sdl); exit(EXIT_SUCCESS); return 0; }
int add_addr4_ptp(char* ifname, struct sockaddr_in *addr, struct sockaddr_in *dstaddr) { struct ifaliasreq req; bzero(&req, sizeof(req)); strlcpy(req.ifra_name, ifname, sizeof(req.ifra_name)); memcpy(&req.ifra_addr, addr, sizeof(struct sockaddr_in)); memcpy(&req.ifra_broadaddr, dstaddr, sizeof(struct sockaddr_in)); mask32((struct sockaddr_in *)&req.ifra_mask); return ioctl(ioctl_fd4, SIOCAIFADDR, &req); }
int seeprom_read(void *dst, int offset, int size) { int i; u16 *ptr = (u16 *)dst; u16 recv; if (size & 1) return -1; mask32(HW_GPIO1OUT, GP_EEP_CLK, 0); mask32(HW_GPIO1OUT, GP_EEP_CS, 0); eeprom_delay(); for (i = 0; i < size; i++) { mask32(HW_GPIO1OUT, 0, GP_EEP_CS); send_bits((0x600 | (offset + i)), 11); recv = recv_bits(16); *ptr++ = recv; mask32(HW_GPIO1OUT, GP_EEP_CS, 0); eeprom_delay(); } return size; }
int videodev_start (void) { printf("videocapture: init\n"); dev_name = "/dev/video0"; generate_YCbCr_to_RGB_lookup(); open_device(); if (video_ok == 0) { return 0; } init_device(); if (video_ok == 0) { return 0; } buffer_sdl = (uint8_t*)malloc(WIDTH*HEIGHT*3); data_sf = SDL_CreateRGBSurfaceFrom(buffer_sdl, WIDTH, HEIGHT, 24, WIDTH * 3, mask32(0), mask32(1), mask32(2), 0); start_capturing(); return 0; }
int main (int argc, char *argv[]) { int n123, niter, order, nj1,nj2, i, j, liter, dim; int n[SF_MAX_DIM], rect[3], nr, ir; float p0, *u, *p, pmin, pmax, eps; float **allu, **allp, d1, d2, d3, o1, o2, o3, *sendbuf, *recvbuf; bool verb, **mm; sf_file in, out, mask, dip0; int cpuid, numprocs, nrpad, iturn; MPI_Comm comm=MPI_COMM_WORLD; sf_init(argc,argv); MPI_Init(&argc, &argv); MPI_Comm_rank(comm, &cpuid); MPI_Comm_size(comm, &numprocs); in = sf_input ("--input"); out = sf_output ("--output"); if (SF_FLOAT != sf_gettype(in)) sf_error("Need float type"); if (cpuid==0) sf_warning("numprocs=%d", numprocs); dim = sf_filedims(in,n); if (dim < 2) n[1]=1; n123 = n[0]*n[1]; nr = 1; for (j=2; j < dim; j++) { nr *= n[j]; } n[2]= 1; rect[2]=1; nj2=1; if(nr%numprocs==0) nrpad=nr; else nrpad=(nr/numprocs+1)*numprocs; /* set up output dimension */ if(cpuid==0){ if (!sf_histfloat(in, "d1", &d1)) sf_error("No d1= in input"); if (!sf_histfloat(in, "o1", &o1)) sf_error("No o1= in input"); if (!sf_histfloat(in, "d2", &d2)) sf_error("No d2= in input"); if (!sf_histfloat(in, "o2", &o2)) sf_error("No o2= in input"); if (!sf_histfloat(in, "d3", &d3)) sf_error("No d3= in input"); if (!sf_histfloat(in, "o3", &o3)) sf_error("No o3= in input"); sf_putint(out, "n1", n[0]); sf_putfloat(out, "d1", d1); sf_putfloat(out, "o1", o1); sf_putstring(out, "label1", "Depth"); sf_putstring(out, "unit1", "m"); sf_putint(out, "n2", n[1]); sf_putfloat(out, "d2", d2); sf_putfloat(out, "o2", o2); sf_putstring(out, "label2", "Offset"); sf_putstring(out, "unit2", "m"); sf_putint(out, "n3", nr); sf_putfloat(out, "d3", d3); sf_putfloat(out, "o3", o3); sf_putstring(out, "label3", "CIGs"); sf_putstring(out, "unit3", "m"); } if (!sf_getint("niter",&niter)) niter=5; /* number of iterations */ if (!sf_getint("liter",&liter)) liter=20; /* number of linear iterations */ if (!sf_getint("rect1",&rect[0])) rect[0]=1; /* dip smoothness on 1st axis */ if (!sf_getint("rect2",&rect[1])) rect[1]=1; /* dip smoothness on 2nd axis */ if (!sf_getfloat("p0",&p0)) p0=0.; /* initial dip */ if (!sf_getint("order",&order)) order=1; /* accuracy order */ if (!sf_getint("nj1",&nj1)) nj1=1; /* antialiasing */ if (!sf_getbool("verb",&verb)) verb = false; /* verbosity flag */ if (!sf_getfloat("pmin",&pmin)) pmin = -FLT_MAX; /* minimum dip */ if (!sf_getfloat("pmax",&pmax)) pmax = +FLT_MAX; /* maximum dip */ if (!sf_getfloat("eps",&eps)) eps=0.0f; /* regularization */ /* initialize dip estimation */ dip3_init(n[0], n[1], n[2], rect, liter, eps, false); /* initial dip file */ if(NULL != sf_getstring("dip0")){ dip0=sf_input("dip0"); }else{ dip0=NULL; } if(cpuid==0){ allu=sf_floatalloc2(n123, nrpad); sf_floatread(allu[0], n123*nr, in); for(ir=nr; ir<nrpad; ir++) for(i=0; i<n123; i++) allu[ir][i]=0.; allp=sf_floatalloc2(n123, nrpad); if(NULL != dip0){ sf_floatread(allp[0], n123*nr, dip0); for(ir=nr; ir<nrpad; ir++) for(i=0; i<n123; i++) allp[ir][i]=0.; } } u = sf_floatalloc(n123); p = sf_floatalloc(n123); /* masking operator */ if(NULL != sf_getstring("mask")) { mm = sf_boolalloc2(n123,2); mask = sf_input("mask"); if(cpuid==0) sf_floatread(u, n123, mask); MPI_Bcast(u, n123, MPI_FLOAT, 0, comm); mask32 (false, order, nj1, nj2, n[0], n[1], n[2], u, mm); }else{ mm = (bool**) sf_alloc(2,sizeof(bool*)); mm[0] = mm[1] = NULL; } /* loop over third dimension */ for(iturn=0; iturn*numprocs<nrpad; iturn++){ ir=iturn*numprocs+cpuid; if (cpuid==0 && verb) sf_warning("slice %d of %d;", ir+1, nr); /* image data */ if(cpuid==0){ sendbuf=allu[iturn*numprocs]; recvbuf=u; }else{ sendbuf=NULL; recvbuf=u; } MPI_Scatter(sendbuf, n123, MPI_FLOAT, recvbuf, n123, MPI_FLOAT, 0, comm); /* initialize t-x dip */ if(NULL != dip0) { if(cpuid==0){ sendbuf=allp[iturn*numprocs]; recvbuf=p; }else{ sendbuf=NULL; recvbuf=p; } MPI_Scatter(sendbuf, n123, MPI_FLOAT, recvbuf, n123, MPI_FLOAT, 0, comm); }else{ for(i=0; i < n123; i++) { p[i] = p0; } } /* estimate t-x dip */ if(ir<nr) dip3(false, 1, niter, order, nj1, u, p, mm[0], pmin, pmax); if(cpuid==0){ sendbuf=p; recvbuf=allp[iturn*numprocs]; }else{ sendbuf=p; recvbuf=NULL; } MPI_Gather(sendbuf, n123, MPI_FLOAT, recvbuf, n123, MPI_FLOAT, 0, comm); } if(cpuid==0) sf_floatwrite(allp[0], n123*nr, out); MPI_Finalize(); exit (0); }
void *decode_video_thread(void *arg) { INFO("Started decode video thread!"); av_session_t *_phone = arg; _phone->running_decvid = 1; //CodecState *cs = get_cs_temp(_phone->av); //cs->video_stream = 0; //int recved_size; //uint8_t dest[RTP_PAYLOAD_SIZE]; //int dec_frame_finished; //AVFrame *r_video_frame; //r_video_frame = avcodec_alloc_frame(); //AVPacket dec_video_packet; //av_new_packet (&dec_video_packet, 65536); int width = 0; int height = 0; while (_phone->running_decvid) { //recved_size = toxav_recv_rtp_payload(_phone->av, TypeVideo, dest); //if (recved_size) { vpx_image_t *image; if (toxav_recv_video(_phone->av, &image) == 0) { //memcpy(dec_video_packet.data, dest, recved_size); //dec_video_packet.size = recved_size; //avcodec_decode_video2(cs->video_decoder_ctx, r_video_frame, &dec_frame_finished, &dec_video_packet); //if (dec_frame_finished) { /* Check if size has changed */ if (image->d_w != width || image->d_h != height) { width = image->d_w; height = image->d_h; printf("w: %d h: %d \n", width, height); screen = SDL_SetVideoMode(width, height, 0, 0); //if (_phone->video_picture.bmp) // SDL_FreeYUVOverlay(_phone->video_picture.bmp); //_phone->video_picture.bmp = SDL_CreateYUVOverlay(width, height, SDL_YV12_OVERLAY, screen); // _phone->sws_SDL_r_ctx = sws_getContext(width, height, cs->video_decoder_ctx->pix_fmt, width, height, PIX_FMT_YUV420P, // SWS_BILINEAR, NULL, NULL, NULL); } uint8_t *rgb_image = malloc(width * height * 3); convert_to_rgb(image, rgb_image); SDL_Surface *img_surface = SDL_CreateRGBSurfaceFrom(rgb_image, width, height, 24, width * 3, mask32(0), mask32(1), mask32(2), 0); if (SDL_BlitSurface(img_surface, NULL, screen, NULL) == 0) SDL_UpdateRect(screen, 0, 0, 0, 0); /* SDL_LockYUVOverlay(_phone->video_picture.bmp); memcpy(_phone->video_picture.bmp->pixels[0], image->planes[VPX_PLANE_Y], _phone->video_picture.bmp->pitches[0] * height); memcpy(_phone->video_picture.bmp->pixels[1], image->planes[VPX_PLANE_V], _phone->video_picture.bmp->pitches[1] * height / 2); memcpy(_phone->video_picture.bmp->pixels[2], image->planes[VPX_PLANE_U], _phone->video_picture.bmp->pitches[2] * height / 2); SDL_Rect rect; rect.x = 0; rect.y = 0; rect.w = width; rect.h = height; SDL_DisplayYUVOverlay(_phone->video_picture.bmp, &rect);*/ free(rgb_image); //display_received_frame(_phone, image); } //else { /* TODO: request the sender to create a new i-frame immediatly */ //printf("Bad video packet\n"); //} //} usleep(1000); } /* clean up codecs */ //av_free(r_video_frame); //pthread_mutex_lock(&cs->ctrl_mutex); //avcodec_close(cs->video_decoder_ctx); //pthread_mutex_unlock(&cs->ctrl_mutex); _phone->running_decvid = -1; pthread_exit ( NULL ); }
//u32 Loopmode=0; int _main( int argc, char *argv[] ) { s32 ret = 0; u8 MessageHeap[0x10]; //u32 MessageQueue=0xFFFFFFFF; BootStatus(0, 0, 0); thread_set_priority( 0, 0x79 ); // do not remove this, this waits for FS to be ready! thread_set_priority( 0, 0x50 ); thread_set_priority( 0, 0x79 ); //MessageQueue = ES_Init( MessageHeap ); ES_Init( MessageHeap ); BootStatus(1, 0, 0); #ifndef NINTENDONT_USB BootStatus(2, 0, 0); ret = SDHCInit(); if(!ret) { dbgprintf("SD:SDHCInit() failed:%d\r\n", ret ); BootStatusError(-2, ret); mdelay(2000); Shutdown(); } #endif BootStatus(3, 0, 0); fatfs = (FATFS*)malloca( sizeof(FATFS), 32 ); s32 res = f_mount( 0, fatfs ); if( res != FR_OK ) { dbgprintf("ES:f_mount() failed:%d\r\n", res ); BootStatusError(-3, res); mdelay(2000); Shutdown(); } BootStatus(4, 0, 0); BootStatus(5, 0, 0); int MountFail = 0; s32 fres = -1; while(fres != FR_OK) { fres = f_open(&GameFile, "/bladie", FA_READ|FA_OPEN_EXISTING); switch(fres) { case FR_OK: f_close(&GameFile); case FR_NO_PATH: case FR_NO_FILE: { fres = FR_OK; } break; default: case FR_DISK_ERR: { f_mount(0, 0); //unmount drive todo: retry could never work MountFail++; if(MountFail == 10) { BootStatusError(-5, fres); mdelay(2000); Shutdown(); } mdelay(5); } break; } } #ifdef NINTENDONT_USB BootStatus(6, s_size, s_cnt); s32 r = LoadModules(55); //dbgprintf("ES:ES_LoadModules(%d):%d\r\n", 55, r ); if( r < 0 ) { BootStatusError(-6, r); mdelay(2000); Shutdown(); } #endif BootStatus(7, s_size, s_cnt); ConfigInit(); BootStatus(8, s_size, s_cnt); SDisInit = 1; memset32((void*)0x13002800, 0, 0x30); sync_after_write((void*)0x13002800, 0x30); u32 HID_Thread = 0; bool UseHID = ConfigGetConfig(NIN_CFG_HID); if( UseHID ) { ret = HIDInit(); if(ret < 0 ) { dbgprintf("ES:HIDInit() failed\r\n" ); BootStatusError(-8, ret); mdelay(2000); Shutdown(); } write32(0x13003004, 0); sync_after_write((void*)0x13003004, 0x20); memset32((void*)0x13003420, 0, 0x1BE0); sync_after_write((void*)0x13003420, 0x1BE0); HID_Thread = thread_create(HID_Run, NULL, (u32*)0x13003420, 0x1BE0, 0x78, 1); thread_continue(HID_Thread); } BootStatus(9, s_size, s_cnt); DIinit(); BootStatus(10, s_size, s_cnt); EXIInit(); BootStatus(11, s_size, s_cnt); SIInit(); //fixes issues in some japanese games if((ConfigGetGameID() & 0xFF) == 'J') write32(HW_PPCSPEED, 0x2A9E0); //Tell PPC side we are ready! cc_ahbMemFlush(1); mdelay(1000); BootStatus(0xdeadbeef, s_size, s_cnt); /* write32( HW_PPCIRQFLAG, read32(HW_PPCIRQFLAG) ); write32( HW_ARMIRQFLAG, read32(HW_ARMIRQFLAG) ); set32( HW_PPCIRQMASK, (1<<31) ); set32( HW_IPC_PPCCTRL, 0x30 ); */ u32 Now = read32(HW_TIMER); u32 PADTimer = Now; bool SaveCard = false; if( ConfigGetConfig(NIN_CFG_LED) ) { set32(HW_GPIO_ENABLE, GPIO_SLOT_LED); clear32(HW_GPIO_DIR, GPIO_SLOT_LED); clear32(HW_GPIO_OWNER, GPIO_SLOT_LED); } write32(0xd8006a0, 0x30000004), mask32(0xd8006a8, 0, 2); while (1) { _ahbMemFlush(0); if(EXI_IRQ == true) { if(EXICheckTimer()) EXIInterrupt(); } if(SI_IRQ == true) { if((read32(HW_TIMER) - PADTimer) >= 65000) // about 29 times a second { SIInterrupt(); PADTimer = read32(HW_TIMER); } } if(DI_IRQ == true) { if(DI_Args->Buffer == 0xdeadbeef) DIInterrupt(); } else if(SaveCard == true) /* DI IRQ indicates we might read async, so dont write at the same time */ { if((read32(HW_TIMER) - Now) / 1898437 > 2) /* after 3 second earliest */ { EXISaveCard(); SaveCard = false; } } udelay(10); //wait for other threads //Baten Kaitos save hax if( read32(0) == 0x474B4245 ) { if( read32( 0x0073E640 ) == 0xFFFFFFFF ) { write32( 0x0073E640, 0 ); } } if( Streaming ) { if( (read32(HW_TIMER) * 19 / 10) - StreamTimer >= 5000000 ) { // dbgprintf("."); StreamOffset += 64*1024; if( StreamOffset >= StreamSize ) { StreamOffset = StreamSize; Streaming = 0; } StreamTimer = read32(HW_TIMER) * 19 / 10; } } if( DiscChangeIRQ ) { if( read32(HW_TIMER) * 128 / 243000000 > 2 ) { //dbgprintf("DIP:IRQ mon!\r\n"); set32( DI_SSTATUS, 0x3A ); sync_after_write((void*)DI_SSTATUS, 4); DIInterrupt(); DiscChangeIRQ = 0; } } _ahbMemFlush(1); DIUpdateRegisters(); EXIUpdateRegistersNEW(); SIUpdateRegisters(); if(EXICheckCard()) { Now = read32(HW_TIMER); SaveCard = true; } if(read32(DI_SCONFIG) == 0x1DEA) { while(DI_Args->Buffer != 0xdeadbeef) udelay(100); break; } cc_ahbMemFlush(1); } if( UseHID ) { /* we're done reading inputs */ thread_cancel(HID_Thread, 0); } thread_cancel(DI_Thread, 0); write32( DI_SCONFIG, 0 ); sync_after_write( (void*)DI_SCONFIG, 4 ); /* reset time */ while(1) { _ahbMemFlush(0); sync_before_read( (void*)DI_SCONFIG, 4 ); if(read32(DI_SCONFIG) == 0x2DEA) break; wait_for_ppc(1); cc_ahbMemFlush(1); } if( ConfigGetConfig(NIN_CFG_LED) ) clear32(HW_GPIO_OUT, GPIO_SLOT_LED); if( ConfigGetConfig(NIN_CFG_MEMCARDEMU) ) EXIShutdown(); IOSBoot((char*)0x13003020, 0, read32(0x13003000)); return 0; }
int _main( int argc, char *argv[] ) { //BSS is in DATA section so IOS doesnt touch it, we need to manually clear it //dbgprintf("memset32(%08x, 0, %08x)\n", &__bss_start, &__bss_end - &__bss_start); memset32(&__bss_start, 0, &__bss_end - &__bss_start); sync_after_write(&__bss_start, &__bss_end - &__bss_start); s32 ret = 0; u32 DI_Thread = 0; u8 MessageHeap[0x10]; BootStatus(0, 0, 0); thread_set_priority( 0, 0x79 ); // do not remove this, this waits for FS to be ready! thread_set_priority( 0, 0x50 ); thread_set_priority( 0, 0x79 ); //Disable AHBPROT EnableAHBProt(-1); //Load IOS Modules ES_Init( MessageHeap ); //Early HID for loader HIDInit(); //Enable DVD Access write32(HW_DIFLAGS, read32(HW_DIFLAGS) & ~DI_DISABLEDVD); dbgprintf("Sending signal to loader\r\n"); BootStatus(1, 0, 0); mdelay(10); //Loader running, selects games while(1) { sync_before_read((void*)RESET_STATUS, 0x20); vu32 reset_status = read32(RESET_STATUS); if(reset_status != 0) { if(reset_status == 0x0DEA) break; //game selected else if(reset_status == 0x1DEA) goto DoIOSBoot; //exit write32(RESET_STATUS, 0); sync_after_write((void*)RESET_STATUS, 0x20); } HIDUpdateRegisters(1); mdelay(10); } ConfigSyncBeforeRead(); u32 UseUSB = ConfigGetConfig(NIN_CFG_USB); SetDiskFunctions(UseUSB); BootStatus(2, 0, 0); if(UseUSB) { ret = USBStorage_Startup(); dbgprintf("USB:Drive size: %dMB SectorSize:%d\r\n", s_cnt / 1024 * s_size / 1024, s_size); } else { s_size = PAGE_SIZE512; //manually set s_size ret = SDHCInit(); } if(ret != 1) { dbgprintf("Device Init failed:%d\r\n", ret ); BootStatusError(-2, ret); mdelay(4000); Shutdown(); } //Verification if we can read from disc if(memcmp(ConfigGetGamePath(), "di", 3) == 0) RealDI_Init(); //will shutdown on fail BootStatus(3, 0, 0); fatfs = (FATFS*)malloca( sizeof(FATFS), 32 ); s32 res = f_mount( fatfs, fatDevName, 1 ); if( res != FR_OK ) { dbgprintf("ES:f_mount() failed:%d\r\n", res ); BootStatusError(-3, res); mdelay(4000); Shutdown(); } BootStatus(4, 0, 0); BootStatus(5, 0, 0); FIL fp; s32 fres = f_open_char(&fp, "/bladie", FA_READ|FA_OPEN_EXISTING); switch(fres) { case FR_OK: f_close(&fp); case FR_NO_PATH: case FR_NO_FILE: { fres = FR_OK; } break; default: case FR_DISK_ERR: { BootStatusError(-5, fres); mdelay(4000); Shutdown(); } break; } if(!UseUSB) //Use FAT values for SD s_cnt = fatfs->n_fatent * fatfs->csize; BootStatus(6, s_size, s_cnt); BootStatus(7, s_size, s_cnt); ConfigInit(); if (ConfigGetConfig(NIN_CFG_LOG)) SDisInit = 1; // Looks okay after threading fix dbgprintf("Game path: %s\r\n", ConfigGetGamePath()); BootStatus(8, s_size, s_cnt); memset32((void*)RESET_STATUS, 0, 0x20); sync_after_write((void*)RESET_STATUS, 0x20); memset32((void*)0x13002800, 0, 0x30); sync_after_write((void*)0x13002800, 0x30); memset32((void*)0x13160000, 0, 0x20); sync_after_write((void*)0x13160000, 0x20); memset32((void*)0x13026500, 0, 0x100); sync_after_write((void*)0x13026500, 0x100); BootStatus(9, s_size, s_cnt); DIRegister(); DI_Thread = thread_create(DIReadThread, NULL, ((u32*)&__di_stack_addr), ((u32)(&__di_stack_size)) / sizeof(u32), 0x78, 1); thread_continue(DI_Thread); DIinit(true); BootStatus(10, s_size, s_cnt); GCAMInit(); EXIInit(); BootStatus(11, s_size, s_cnt); SIInit(); StreamInit(); PatchInit(); //Tell PPC side we are ready! cc_ahbMemFlush(1); mdelay(1000); BootStatus(0xdeadbeef, s_size, s_cnt); mdelay(1000); //wait before hw flag changes dbgprintf("Kernel Start\r\n"); //write32( 0x1860, 0xdeadbeef ); // Clear OSReport area //sync_after_write((void*)0x1860, 0x20); u32 Now = read32(HW_TIMER); u32 PADTimer = Now; u32 DiscChangeTimer = Now; u32 ResetTimer = Now; u32 InterruptTimer = Now; USBReadTimer = Now; u32 Reset = 0; bool SaveCard = false; if( ConfigGetConfig(NIN_CFG_LED) ) { set32(HW_GPIO_ENABLE, GPIO_SLOT_LED); clear32(HW_GPIO_DIR, GPIO_SLOT_LED); clear32(HW_GPIO_OWNER, GPIO_SLOT_LED); } set32(HW_GPIO_ENABLE, GPIO_SENSOR_BAR); clear32(HW_GPIO_DIR, GPIO_SENSOR_BAR); clear32(HW_GPIO_OWNER, GPIO_SENSOR_BAR); set32(HW_GPIO_OUT, GPIO_SENSOR_BAR); //turn on sensor bar write32( HW_PPCIRQMASK, (1<<30) ); write32( HW_PPCIRQFLAG, read32(HW_PPCIRQFLAG) ); //This bit seems to be different on japanese consoles u32 ori_ppcspeed = read32(HW_PPCSPEED); if((ConfigGetGameID() & 0xFF) == 'J') set32(HW_PPCSPEED, (1<<17)); else clear32(HW_PPCSPEED, (1<<17)); u32 ori_widesetting = read32(0xd8006a0); if(IsWiiU) { if( ConfigGetConfig(NIN_CFG_WIIU_WIDE) ) write32(0xd8006a0, 0x30000004); else write32(0xd8006a0, 0x30000002); mask32(0xd8006a8, 0, 2); } while (1) { _ahbMemFlush(0); //Does interrupts again if needed if(TimerDiffTicks(InterruptTimer) > 15820) //about 120 times a second { sync_before_read((void*)INT_BASE, 0x80); if((read32(RSW_INT) & 2) || (read32(DI_INT) & 4) || (read32(SI_INT) & 8) || (read32(EXI_INT) & 0x10)) write32(HW_IPC_ARMCTRL, (1 << 0) | (1 << 4)); //throw irq InterruptTimer = read32(HW_TIMER); } #ifdef PATCHALL if (EXI_IRQ == true) { if(EXICheckTimer()) EXIInterrupt(); } #endif if (SI_IRQ != 0) { if ((TimerDiffTicks(PADTimer) > 7910) || (SI_IRQ & 0x2)) // about 240 times a second { SIInterrupt(); PADTimer = read32(HW_TIMER); } } if(DI_IRQ == true) { if(DiscCheckAsync()) DIInterrupt(); else udelay(200); //let the driver load data } else if(SaveCard == true) /* DI IRQ indicates we might read async, so dont write at the same time */ { if(TimerDiffSeconds(Now) > 2) /* after 3 second earliest */ { EXISaveCard(); SaveCard = false; } } else if(UseUSB && TimerDiffSeconds(USBReadTimer) > 149) /* Read random sector every 2 mins 30 secs */ { DIFinishAsync(); //if something is still running DI_CallbackMsg.result = -1; sync_after_write(&DI_CallbackMsg, 0x20); IOS_IoctlAsync( DI_Handle, 2, NULL, 0, NULL, 0, DI_MessageQueue, &DI_CallbackMsg ); DIFinishAsync(); USBReadTimer = read32(HW_TIMER); } udelay(10); //wait for other threads //Baten Kaitos save hax /*if( read32(0) == 0x474B4245 ) { if( read32( 0x0073E640 ) == 0xFFFFFFFF ) { write32( 0x0073E640, 0 ); } }*/ if( WaitForRealDisc == 1 ) { if(RealDI_NewDisc()) { DiscChangeTimer = read32(HW_TIMER); WaitForRealDisc = 2; //do another flush round, safety! } } else if( WaitForRealDisc == 2 ) { if(TimerDiffSeconds(DiscChangeTimer)) { //identify disc after flushing everything RealDI_Identify(false); //clear our fake regs again sync_before_read((void*)DI_BASE, 0x40); write32(DI_IMM, 0); write32(DI_COVER, 0); sync_after_write((void*)DI_BASE, 0x40); //mask and clear interrupts write32( DIP_STATUS, 0x54 ); //disable cover irq which DIP enabled write32( DIP_COVER, 4 ); DIInterrupt(); WaitForRealDisc = 0; } } if ( DiscChangeIRQ == 1 ) { DiscChangeTimer = read32(HW_TIMER); DiscChangeIRQ = 2; } else if ( DiscChangeIRQ == 2 ) { if ( TimerDiffSeconds(DiscChangeTimer) > 2 ) { DIInterrupt(); DiscChangeIRQ = 0; } } _ahbMemFlush(1); DIUpdateRegisters(); #ifdef PATCHALL EXIUpdateRegistersNEW(); GCAMUpdateRegisters(); BTUpdateRegisters(); HIDUpdateRegisters(0); if(DisableSIPatch == 0) SIUpdateRegisters(); #endif StreamUpdateRegisters(); CheckOSReport(); if(EXICheckCard()) { Now = read32(HW_TIMER); SaveCard = true; } sync_before_read((void*)RESET_STATUS, 0x20); vu32 reset_status = read32(RESET_STATUS); if (reset_status == 0x1DEA) { write32(RESET_STATUS, 0); sync_after_write((void*)RESET_STATUS, 0x20); DIFinishAsync(); break; } if (reset_status == 0x3DEA) { if (Reset == 0) { dbgprintf("Fake Reset IRQ\n"); write32( RSW_INT, 0x2 ); // Reset irq sync_after_write( (void*)RSW_INT, 0x20 ); write32(HW_IPC_ARMCTRL, (1 << 0) | (1 << 4)); //throw irq Reset = 1; } } else if (Reset == 1) { write32( RSW_INT, 0x10000 ); // send pressed sync_after_write( (void*)RSW_INT, 0x20 ); ResetTimer = read32(HW_TIMER); Reset = 2; } /* The cleanup is not connected to the button press */ if (Reset == 2) { if (TimerDiffTicks(ResetTimer) > 949219) //free after half a second { write32( RSW_INT, 0 ); // done, clear sync_after_write( (void*)RSW_INT, 0x20 ); Reset = 0; } } if(reset_status == 0x4DEA) PatchGame(); if(reset_status == 0x5DEA) { SetIPL(); PatchGame(); } if(reset_status == 0x6DEA) { SetIPL_TRI(); write32(RESET_STATUS, 0); sync_after_write((void*)RESET_STATUS, 0x20); } if(read32(HW_GPIO_IN) & GPIO_POWER) { DIFinishAsync(); #ifdef PATCHALL BTE_Shutdown(); #endif Shutdown(); } //sync_before_read( (void*)0x1860, 0x20 ); //if( read32(0x1860) != 0xdeadbeef ) //{ // if( read32(0x1860) != 0 ) // { // dbgprintf( (char*)(P2C(read32(0x1860))), // (char*)(P2C(read32(0x1864))), // (char*)(P2C(read32(0x1868))), // (char*)(P2C(read32(0x186C))), // (char*)(P2C(read32(0x1870))), // (char*)(P2C(read32(0x1874))) // ); // } // write32(0x1860, 0xdeadbeef); // sync_after_write( (void*)0x1860, 0x20 ); //} cc_ahbMemFlush(1); } //if( UseHID ) HIDClose(); IOS_Close(DI_Handle); //close game thread_cancel(DI_Thread, 0); DIUnregister(); /* reset time */ while(1) { sync_before_read( (void*)RESET_STATUS, 0x20 ); if(read32(RESET_STATUS) == 0x2DEA) break; wait_for_ppc(1); } if( ConfigGetConfig(NIN_CFG_LED) ) clear32(HW_GPIO_OUT, GPIO_SLOT_LED); if( ConfigGetConfig(NIN_CFG_MEMCARDEMU) ) EXIShutdown(); if (ConfigGetConfig(NIN_CFG_LOG)) closeLog(); #ifdef PATCHALL BTE_Shutdown(); #endif //unmount FAT device free(fatfs); fatfs = NULL; f_mount(NULL, fatDevName, 1); if(UseUSB) USBStorage_Shutdown(); else SDHCShutdown(); //make sure we set that back to the original write32(HW_PPCSPEED, ori_ppcspeed); if(IsWiiU) { write32(0xd8006a0, ori_widesetting); mask32(0xd8006a8, 0, 2); } DoIOSBoot: sync_before_read((void*)0x13003000, 0x420); IOSBoot((char*)0x13003020, 0, read32(0x13003000)); return 0; }
// pick bits [hi,...,lo] from val static inline u_int32_t pick32(u_int32_t val, int hi = 31, int lo = 0) { return (val & mask32(hi, lo)); }
int main(int argc, char **argv) { dev_name = "/dev/video0"; for (;;) { int index; int c; c = getopt_long(argc, argv, short_options, long_options, &index); if (-1 == c) break; switch (c) { case 0: /* getopt_long() flag */ break; case 'd': dev_name = optarg; break; case 'h': usage(stdout, argc, argv); exit(EXIT_SUCCESS); case 'm': io = IO_METHOD_MMAP; break; case 'r': io = IO_METHOD_READ; break; case 'u': io = IO_METHOD_USERPTR; break; case 'x': WIDTH = atoi(optarg); break; case 'y': HEIGHT = atoi(optarg); break; default: usage(stderr, argc, argv); exit(EXIT_FAILURE); } } generate_YCbCr_to_RGB_lookup(); open_device(); init_device(); atexit(SDL_Quit); if (SDL_Init(SDL_INIT_VIDEO) < 0) return 1; SDL_WM_SetCaption("SDL Video viewer", NULL); buffer_sdl = (uint8_t*)malloc(WIDTH*HEIGHT*3); SDL_SetVideoMode(WIDTH, HEIGHT, 24, SDL_HWSURFACE); data_sf = SDL_CreateRGBSurfaceFrom(buffer_sdl, WIDTH, HEIGHT, 24, WIDTH * 3, mask32(0), mask32(1), mask32(2), 0); SDL_SetEventFilter(sdl_filter); start_capturing(); mainloop(); stop_capturing(); uninit_device(); close_device(); SDL_FreeSurface(data_sf); free(buffer_sdl); exit(EXIT_SUCCESS); return 0; }
int _main( int argc, char *argv[] ) { //BSS is in DATA section so IOS doesnt touch it, we need to manually clear it //dbgprintf("memset32(%08x, 0, %08x)\n", &__bss_start, &__bss_end - &__bss_start); memset32(&__bss_start, 0, &__bss_end - &__bss_start); sync_after_write(&__bss_start, &__bss_end - &__bss_start); s32 ret = 0; u32 HID_Thread = 0, DI_Thread = 0; u8 MessageHeap[0x10]; //u32 MessageQueue=0xFFFFFFFF; BootStatus(0, 0, 0); thread_set_priority( 0, 0x79 ); // do not remove this, this waits for FS to be ready! thread_set_priority( 0, 0x50 ); thread_set_priority( 0, 0x79 ); //MessageQueue = ES_Init( MessageHeap ); ES_Init( MessageHeap ); BootStatus(1, 0, 0); #ifndef NINTENDONT_USB BootStatus(2, 0, 0); ret = SDHCInit(); if(!ret) { dbgprintf("SD:SDHCInit() failed:%d\r\n", ret ); BootStatusError(-2, ret); mdelay(2000); Shutdown(); } #endif BootStatus(3, 0, 0); fatfs = (FATFS*)malloca( sizeof(FATFS), 32 ); s32 res = f_mount( 0, fatfs ); if( res != FR_OK ) { dbgprintf("ES:f_mount() failed:%d\r\n", res ); BootStatusError(-3, res); mdelay(2000); Shutdown(); } BootStatus(4, 0, 0); BootStatus(5, 0, 0); int MountFail = 0; s32 fres = -1; FIL fp; while(fres != FR_OK) { fres = f_open(&fp, "/bladie", FA_READ|FA_OPEN_EXISTING); switch(fres) { case FR_OK: f_close(&fp); case FR_NO_PATH: case FR_NO_FILE: { fres = FR_OK; } break; default: case FR_DISK_ERR: { f_mount(0, NULL); //unmount drive todo: retry could never work MountFail++; if(MountFail == 10) { BootStatusError(-5, fres); mdelay(2000); Shutdown(); } mdelay(5); } break; } if(STATUS_ERROR == -7) { // FS check timed out on PPC side dbgprintf("FS check timed out\r\n"); mdelay(3000); Shutdown(); } } #ifndef NINTENDONT_USB s_size = 512; s_cnt = fatfs->n_fatent * fatfs->csize; #endif BootStatus(6, s_size, s_cnt); #ifdef NINTENDONT_USB s32 r = LoadModules(55); //dbgprintf("ES:ES_LoadModules(%d):%d\r\n", 55, r ); if( r < 0 ) { BootStatusError(-6, r); mdelay(2000); Shutdown(); } #endif BootStatus(7, s_size, s_cnt); ConfigInit(); if (ConfigGetConfig(NIN_CFG_LOG)) SDisInit = 1; // Looks okay after threading fix dbgprintf("Game path: %s\r\n", ConfigGetGamePath()); BootStatus(8, s_size, s_cnt); memset32((void*)0x13002800, 0, 0x30); sync_after_write((void*)0x13002800, 0x30); memset32((void*)0x13160000, 0, 0x20); sync_after_write((void*)0x13160000, 0x20); memset32((void*)0x13026500, 0, 0x100); sync_after_write((void*)0x13026500, 0x100); bool UseHID = ConfigGetConfig(NIN_CFG_HID); if( UseHID ) { ret = HIDInit(); if(ret < 0 ) { dbgprintf("ES:HIDInit() failed\r\n" ); BootStatusError(-8, ret); mdelay(2000); Shutdown(); } write32(0x13003004, 0); sync_after_write((void*)0x13003004, 0x20); HID_Thread = thread_create(HID_Run, NULL, HID_ThreadStack, 0x400, 0x78, 1); thread_continue(HID_Thread); } BootStatus(9, s_size, s_cnt); DIRegister(); DI_Thread = thread_create(DIReadThread, NULL, DI_ThreadStack, 0x400, 0x78, 1); thread_continue(DI_Thread); DIinit(true); BootStatus(10, s_size, s_cnt); GCAMInit(); EXIInit(); ret = Check_Cheats(); if(ret < 0 ) { dbgprintf("Check_Cheats failed\r\n" ); BootStatusError(-10, ret); mdelay(4000); Shutdown(); } BootStatus(11, s_size, s_cnt); bool PatchSI = !ConfigGetConfig(NIN_CFG_NATIVE_SI); if (PatchSI) SIInit(); StreamInit(); PatchInit(); //This bit seems to be different on japanese consoles u32 ori_ppcspeed = read32(HW_PPCSPEED); if((ConfigGetGameID() & 0xFF) == 'J') set32(HW_PPCSPEED, (1<<17)); else clear32(HW_PPCSPEED, (1<<17)); //write32( 0x1860, 0xdeadbeef ); // Clear OSReport area //Tell PPC side we are ready! cc_ahbMemFlush(1); mdelay(1000); BootStatus(0xdeadbeef, s_size, s_cnt); u32 Now = read32(HW_TIMER); u32 PADTimer = Now; u32 DiscChangeTimer = Now; u32 ResetTimer = Now; #ifdef NINTENDONT_USB u32 USBReadTimer = Now; #endif u32 Reset = 0; bool SaveCard = false; if( ConfigGetConfig(NIN_CFG_LED) ) { set32(HW_GPIO_ENABLE, GPIO_SLOT_LED); clear32(HW_GPIO_DIR, GPIO_SLOT_LED); clear32(HW_GPIO_OWNER, GPIO_SLOT_LED); } EnableAHBProt(-1); //disable AHBPROT write32(0xd8006a0, 0x30000004), mask32(0xd8006a8, 0, 2); //widescreen fix while (1) { _ahbMemFlush(0); //Check this. Purpose is to send another interrupt if wasn't processed /*if (((read32(0x14) != 0) || (read32(0x13026514) != 0)) && (read32(HW_ARMIRQFLAG) & (1 << 30)) == 0) { write32(HW_IPC_ARMCTRL, (1 << 0) | (1 << 4)); //throw irq }*/ #ifdef PATCHALL if (EXI_IRQ == true) { if(EXICheckTimer()) EXIInterrupt(); } #endif if ((PatchSI) && (SI_IRQ != 0)) { if (((read32(HW_TIMER) - PADTimer) > 7910) || (SI_IRQ & 0x2)) // about 240 times a second { SIInterrupt(); PADTimer = read32(HW_TIMER); } } if(DI_IRQ == true) { if(DI_CallbackMsg.result == 0) DIInterrupt(); } else if(SaveCard == true) /* DI IRQ indicates we might read async, so dont write at the same time */ { if((read32(HW_TIMER) - Now) / 1898437 > 2) /* after 3 second earliest */ { EXISaveCard(); SaveCard = false; } } #ifdef NINTENDONT_USB else if((read32(HW_TIMER) - USBReadTimer) / 1898437 > 9) /* Read random sector after about 10 seconds */ { DI_CallbackMsg.result = -1; sync_after_write(&DI_CallbackMsg, 0x20); IOS_IoctlAsync( DI_Handle, 2, NULL, 0, NULL, 0, DI_MessageQueue, &DI_CallbackMsg ); while(DI_CallbackMsg.result) { udelay(10); //wait for other threads BTUpdateRegisters(); } USBReadTimer = read32(HW_TIMER); } #endif udelay(10); //wait for other threads //Baten Kaitos save hax /*if( read32(0) == 0x474B4245 ) { if( read32( 0x0073E640 ) == 0xFFFFFFFF ) { write32( 0x0073E640, 0 ); } }*/ if ( DiscChangeIRQ == 1 ) { DiscChangeTimer = read32(HW_TIMER); DiscChangeIRQ = 2; } else if ( DiscChangeIRQ == 2 ) { if ( (read32(HW_TIMER) - DiscChangeTimer ) > 2 * 243000000 / 128) { //dbgprintf("DIP:IRQ mon!\r\n"); set32( DI_SSTATUS, 0x3A ); sync_after_write((void*)DI_SSTATUS, 4); DIInterrupt(); DiscChangeIRQ = 0; } } _ahbMemFlush(1); DIUpdateRegisters(); #ifdef PATCHALL EXIUpdateRegistersNEW(); GCAMUpdateRegisters(); BTUpdateRegisters(); #endif StreamUpdateRegisters(); CheckOSReport(); if(EXICheckCard()) { Now = read32(HW_TIMER); SaveCard = true; } if (PatchSI) { SIUpdateRegisters(); if (read32(DIP_IMM) == 0x1DEA) { DIFinishAsync(); break; } if (read32(DIP_IMM) == 0x3DEA) { if (Reset == 0) { dbgprintf("Fake Reset IRQ\n"); write32(EXI2DATA, 0x2); // Reset irq write32(HW_IPC_ARMCTRL, (1 << 0) | (1 << 4)); //throw irq Reset = 1; } } else if (Reset == 1) { write32(EXI2DATA, 0x10000); // send pressed ResetTimer = read32(HW_TIMER); Reset = 2; } /* The cleanup is not connected to the button press */ if (Reset == 2) { if ((read32(HW_TIMER) - ResetTimer) / 949219 > 0) //free after half a second { write32(EXI2DATA, 0); // done, clear write32(DIP_IMM, 0); Reset = 0; } } } if(read32(DIP_IMM) == 0x4DEA) PatchGame(); CheckPatchPrs(); if(read32(HW_GPIO_IN) & GPIO_POWER) { DIFinishAsync(); #ifdef PATCHALL BTE_Shutdown(); #endif Shutdown(); } //sync_before_read( (void*)0x1860, 0x20 ); //if( read32(0x1860) != 0xdeadbeef ) //{ // if( read32(0x1860) != 0 ) // { // dbgprintf( (char*)(P2C(read32(0x1860))), // (char*)(P2C(read32(0x1864))), // (char*)(P2C(read32(0x1868))), // (char*)(P2C(read32(0x186C))), // (char*)(P2C(read32(0x1870))), // (char*)(P2C(read32(0x1874))) // ); // } // write32(0x1860, 0xdeadbeef); // sync_after_write( (void*)0x1860, 0x20 ); //} cc_ahbMemFlush(1); } if( UseHID ) { /* we're done reading inputs */ thread_cancel(HID_Thread, 0); } IOS_Close(DI_Handle); //close game thread_cancel(DI_Thread, 0); DIUnregister(); write32( DIP_IMM, 0 ); /* reset time */ while(1) { if(read32(DIP_IMM) == 0x2DEA) break; wait_for_ppc(1); } if( ConfigGetConfig(NIN_CFG_LED) ) clear32(HW_GPIO_OUT, GPIO_SLOT_LED); if( ConfigGetConfig(NIN_CFG_MEMCARDEMU) ) EXIShutdown(); if (ConfigGetConfig(NIN_CFG_LOG)) closeLog(); #ifdef PATCHALL BTE_Shutdown(); #endif //unmount FAT device f_mount(0, NULL); #ifndef NINTENDONT_USB SDHCShutdown(); #endif //make sure we set that back to the original write32(HW_PPCSPEED, ori_ppcspeed); IOSBoot((char*)0x13003020, 0, read32(0x13003000)); return 0; }
// this is ripped from IOS, because no one can figure out just WTF this thing is doing void _ahb_flush_to(enum AHBDEV dev) { u32 mask = 10; switch(dev) { case AHB_STARLET: mask = 0x8000; break; case AHB_1: mask = 0x4000; break; //case 2: mask = 0x0001; break; case AHB_NAND: mask = 0x0002; break; case AHB_AES: mask = 0x0004; break; case AHB_SHA1: mask = 0x0008; break; //case 6: mask = 0x0010; break; //case 7: mask = 0x0020; break; //case 8: mask = 0x0040; break; case AHB_SDHC: mask = 0x0080; break; //case 10: mask = 0x0100; break; //case 11: mask = 0x1000; break; //case 12: mask = 0x0000; break; default: gecko_printf("ahb_invalidate(%d): Invalid device\n", dev); return; } //NOTE: 0xd8b000x, not 0xd8b400x! u32 val = _mc_read32(0xd8b0008); if(!(val & mask)) { switch(dev) { // 2 to 10 in IOS, add more case AHB_NAND: case AHB_AES: case AHB_SHA1: case AHB_SDHC: while((read32(HW_18C) & 0xF) == 9) set32(HW_188, 0x10000); clear32(HW_188, 0x10000); set32(HW_188, 0x2000000); mask32(HW_124, 0x7c0, 0x280); set32(HW_134, 0x400); while((read32(HW_18C) & 0xF) != 9); set32(HW_100, 0x400); set32(HW_104, 0x400); set32(HW_108, 0x400); set32(HW_10c, 0x400); set32(HW_110, 0x400); set32(HW_114, 0x400); set32(HW_118, 0x400); set32(HW_11c, 0x400); set32(HW_120, 0x400); write32(0xd8b0008, _mc_read32(0xd8b0008) & (~mask)); write32(0xd8b0008, _mc_read32(0xd8b0008) | mask); clear32(HW_134, 0x400); clear32(HW_100, 0x400); clear32(HW_104, 0x400); clear32(HW_108, 0x400); clear32(HW_10c, 0x400); clear32(HW_110, 0x400); clear32(HW_114, 0x400); clear32(HW_118, 0x400); clear32(HW_11c, 0x400); clear32(HW_120, 0x400); clear32(HW_188, 0x2000000); mask32(HW_124, 0x7c0, 0xc0); //0, 1, 11 in IOS, add more case AHB_STARLET: case AHB_1: write32(0xd8b0008, val & (~mask)); // wtfux write32(0xd8b0008, val | mask); write32(0xd8b0008, val | mask); write32(0xd8b0008, val | mask); } } }
int main (int argc, char *argv[]) { int n123, niter, order, nj1,nj2, i,j, liter, dim; int n[SF_MAX_DIM], rect[3], nr, ir; float p0, *u, *p, pmin, pmax, eps; bool verb, **mm; sf_file in, out, mask, idip0; sf_init(argc,argv); in = sf_input ("in"); out = sf_output ("out"); if (SF_FLOAT != sf_gettype(in)) sf_error("Need float type"); dim = sf_filedims(in,n); if (dim < 2) n[1]=1; n123 = n[0]*n[1]; nr = 1; for (j=2; j < dim; j++) { nr *= n[j]; } n[2]= 1; rect[2]=1; nj2=1; if (!sf_getint("niter",&niter)) niter=5; /* number of iterations */ if (!sf_getint("liter",&liter)) liter=20; /* number of linear iterations */ if (!sf_getint("rect1",&rect[0])) rect[0]=1; /* dip smoothness on 1st axis */ if (!sf_getint("rect2",&rect[1])) rect[1]=1; /* dip smoothness on 2nd axis */ if (!sf_getfloat("p0",&p0)) p0=0.; /* initial dip */ if (!sf_getint("order",&order)) order=1; /* accuracy order */ if (!sf_getint("nj1",&nj1)) nj1=1; /* antialiasing */ if (!sf_getbool("verb",&verb)) verb = false; /* verbosity flag */ if (!sf_getfloat("pmin",&pmin)) pmin = -FLT_MAX; /* minimum dip */ if (!sf_getfloat("pmax",&pmax)) pmax = +FLT_MAX; /* maximum dip */ if (!sf_getfloat("eps",&eps)) eps=0.0f; /* regularization */ /* initialize dip estimation */ dip3_init(n[0], n[1], n[2], rect, liter, eps, false); u = sf_floatalloc(n123); p = sf_floatalloc(n123); if (NULL != sf_getstring("mask")) { mm = sf_boolalloc2(n123,2); mask = sf_input("mask"); } else { mm = (bool**) sf_alloc(2,sizeof(bool*)); mm[0] = mm[1] = NULL; mask = NULL; } if (NULL != sf_getstring("idip")) { /* initial in-line dip */ idip0 = sf_input("idip"); } else { idip0 = NULL; } for (ir=0; ir < nr; ir++) { if (verb) sf_warning("slice %d of %d;", ir+1, nr); if (NULL != mask) { sf_floatread(u,n123,mask); mask32 (false, order, nj1, nj2, n[0], n[1], n[2], u, mm); } /* read data */ sf_floatread(u,n123,in); /* initialize t-x dip */ if (NULL != idip0) { sf_floatread(p,n123,idip0); } else { for(i=0; i < n123; i++) { p[i] = p0; } } /* estimate t-x dip */ dip3(false, 1, niter, order, nj1, u, p, mm[0], pmin, pmax); /* write t-x dip */ sf_floatwrite(p,n123,out); } if (verb) sf_warning("."); exit (0); }