// From FigEdit. ushort DskBlkRd(ushort page) { // SerialFlashReadBlock(ushort block, byte *dest); ushort next=0; next=VDskFind(VDskEmptyBlk,gVideoBuff); ushort phys=-2; phys=VDskRead(page,gVideoBuff); if(phys==next) Cls(); // return an empty screen if it was an empty block. PrintAt(1,20+1); DotHex(page); Emit('@'); DotHex(phys); Emit('!'); DotHex(next); #if _DEBUGFLASHID__ PrintAt(0,kMaxEditHeight+2); DotHex(VDskBaseBlock()); Emit(' '); DotHex(SerialFlashID()); Emit('!'); DotHex(next); #endif return next; }
void Lcd_t::Init(void) { BckLt.Init(LCD_BCKLT_GPIO, LCD_BCKLT_PIN, LCD_BCKLT_TMR, LCD_BCKLT_CHNL, LCD_TOP_BRIGHTNESS); // Remap Timer15 to PB14 & PB15 AFIO->MAPR2 |= 0x00000001; // ==== GPIOs ==== // Configure LCD_XRES, LCD_XCS, LCD_SCLK & LCD_SDA as Push-Pull output PinSetupOut(LCD_GPIO, LCD_XRES, omPushPull); PinSetupOut(LCD_GPIO, LCD_XRES, omPushPull); PinSetupOut(LCD_GPIO, LCD_XCS, omPushPull); PinSetupOut(LCD_GPIO, LCD_SCLK, omPushPull); PinSetupOut(LCD_GPIO, LCD_SDA, omPushPull); // ========================= Init LCD ====================================== SCLK_Lo(); XCS_Hi(); // Reset display XRES_Lo(); chThdSleepMilliseconds(7); XRES_Hi(); WriteCmd(0xAF); // display ON // Reset display again XRES_Lo(); chThdSleepMilliseconds(7); XRES_Hi(); chThdSleepMilliseconds(7); // Initial commands WriteCmd(0xAF); // display ON WriteCmd(0xA4); // Set normal display mode WriteCmd(0x2F); // Charge pump on WriteCmd(0x40); // Set start row address = 0 WriteCmd(0xC8); // Mirror Y axis //WriteCmd(0xA1); // Mirror X axis // Set x=0, y=0 WriteCmd(0xB0); // Y axis initialization WriteCmd(0x10); // X axis initialisation1 WriteCmd(0x00); // X axis initialisation2 Cls(); // clear LCD buffer // ====================== Switch to USART + DMA ============================ PinSetupAlterFuncOutput(LCD_GPIO, LCD_SCLK, omPushPull); PinSetupAlterFuncOutput(LCD_GPIO, LCD_SDA, omPushPull); // Workaround hardware bug with disabled CK3 when SPI2 is enabled SPI2->CR2 |= SPI_CR2_SSOE; // ==== USART init ==== clock enabled, idle low, first edge, enable last bit pulse rccEnableUSART3(FALSE); USART3->CR1 = USART_CR1_UE; // Enable USART3->BRR = Clk.APB1FreqHz / LCD_UART_SPEED; USART3->CR2 = USART_CR2_CLKEN | USART_CR2_LBCL; // Enable clock, enable last bit clock USART3->CR1 = USART_CR1_UE | USART_CR1_M | USART_CR1_TE; USART3->CR3 = USART_CR3_DMAT; // Enable DMA at transmitter // DMA dmaStreamAllocate (LCD_DMA, IRQ_PRIO_LOW, nullptr, NULL); dmaStreamSetPeripheral(LCD_DMA, &USART3->DR); dmaStreamSetMemory0 (LCD_DMA, IBuf); dmaStreamSetTransactionSize(LCD_DMA, LCD_VIDEOBUF_SIZE); dmaStreamSetMode (LCD_DMA, LCD_DMA_TX_MODE); // Start transmission XCS_Lo(); dmaStreamEnable(LCD_DMA); }
void Console::Print(char* fmt,...) { #ifdef _DEBUG if (Self && _Active) { char Buff[LENGTH_STRING_BUFF] = { 0 }; va_list argp; va_start(argp,fmt); vsprintf_s(Buff,LENGTH_STRING_BUFF,fmt,argp); va_end(argp); if (Cursor.Y >= 135) { Cls(); } int cnt = 0,num = 0; while (1) { if (Buff[cnt] == '\n') { Cursor.Y++; num++; } if (Buff[cnt] == '\0' || cnt >= LENGTH_STRING_BUFF) { break; } cnt++; } if (num == 0){ Cursor.Y++; } printf(Buff); SetConsoleCursorPosition(ConsoleHandle,Cursor); } #endif }
void Display_Title(void) //プログラムタイトル表示を関数化 040928 { Cls(); Setcolor(CYAN,BLACK); printf(" Weight Bearing Control Program\n"); printf(" Copyright All Reserved by Fujie Lab. 2005\n\n"); Restore(); }
void TestForth(void) { Cls(); ForthCopyBootStrap(); Emit('T'); Emit('F'); //KeyHeart(); //ForthDumpVars(); // @TODO, we can't show the results yet. //ForthDumpVars(); }
void ForthCopyBootStrap(void) { ushort labels[4]; // only allowed 4 labels. ushort dst=0; byte *src=(byte *)gTestProg; DotQuote("FB"); KeyHeart(); do { byte b=GetPgmByte(*src); src++; switch(b) { case kFigLblDef: b=GetPgmByte(*src); // get label value. src++; // next byte. labels[b]=dst; // save. break; case kFigLblFRef: { ushort ref; Emit('.'); // label! b=GetPgmByte(*src); // get offset value. src++; // next byte. ref=0x8000+dst+2+(char)b; // sign extend. DotHex(ref); SramAbsWr(dst++,(byte)(ref>>8)); // big-endian. SramAbsWr(dst++,(byte)(ref&255)); // low-byte. } break; case kFigLblRef: b=GetPgmByte(*src); // get label value. src++; // next byte. SramAbsWr(dst++,(byte)(labels[b]>>8)); // big-endian. SramAbsWr(dst++,(byte)(labels[b]&255)); // low-byte. case kFigLitWord: SramAbsWr(dst++,GetPgmByte(*src++)); // big-endian. SramAbsWr(dst++,GetPgmByte(*src++)); // low-byte. break; default: SramAbsWr(dst++, b); break; } }while(src<&gTestProgEnd); Emit(kKeyEnter); // cr. Emit('a'); dst=0; src=(byte *)gTestProg; do { Dot(SramAbsRd(dst++)); src++; }while(src<&gTestProgEnd); KeyHeart(); Cls(); }
void Console::Sys(char* command) { #ifdef _DEBUG if (Self) { if (Cursor.Y >= 135) { Cls(); } system(command); Cursor.Y++; SetConsoleCursorPosition(ConsoleHandle,Cursor); } #endif }
///// メニュー関連関数 ///////////////////////////////////////////////////////// void Main_Menu(void) { int Flag=1; int KeyInput; while(Flag){ Cls(); Display_Title(); Setcolor(CYAN,BLACK); printf(" <Select Menu>\n\n"); Restore(); Sensors_Display(); printf(" 1) Sensors Check \n"); printf(" 2) DA Value Check \n"); printf(" 3) Velocity Check \n"); printf(" 4) Velocity Step Response \n"); printf(" 5) Constant Force Control\n"); printf(" 6) Constant Force Control(default)\n"); // printf(" 7) Constant Force Control(range)\n"); printf("\n"); printf(" i) Initialize AD Value\n"); printf("\n"); printf(" s> Back to QNX\n\n"); printf(" >>"); KeyInput = Char_Stdin(); switch(KeyInput){ case '1': Sensors_Check(); break; case '2': DA_Value_Check(); break; case '3': Velocity_Check(); break; case '4': Velocity_Step(); break; case '5': Force_Const(); break; case '6': Force_Const_2(); break; case '7': BWS_and_Compliance(); break; case 'i': AD_Initialize(); break; case 's': printf("\nBack to Qnx\n"); Flag=0; break; default:printf("You Typed Invalid Command!!\n"); break; } } }
void Bmscr::Init( int p_sx, int p_sy ) { // bitmap buffer make // flag = BMSCR_FLAG_INUSE; objmax = 0; mem_obj = NULL; sx = p_sx; sy = p_sy; sx2 = sx; Cls(0); imgbtn = -1; objmode = 1; fl_dispw = 0; fl_dispw = 1; fl_udraw = 1; resname[0] = 0; }
LPDIRECTDRAWSURFACE TAGameAreaReDrawer::InitOwnSurface (LPDIRECTDRAW TADD) { if (NULL!=GameAreaSurfaceFront_ptr) { GameAreaSurfaceFront_ptr->Release ( ); GameAreaSurfaceFront_ptr= NULL; } if (NULL!=GameAreaSurfaceBack_ptr) { GameAreaSurfaceBack_ptr->Release ( ); GameAreaSurfaceBack_ptr= NULL; } RECT GameAreaRect; if (TADD) { TAWGameAreaRect ( &GameAreaRect); DDSURFACEDESC ddsd; DDRAW_INIT_STRUCT(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = GameAreaRect.right- GameAreaRect.left; ddsd.dwHeight = GameAreaRect.bottom- GameAreaRect.top; TADD->CreateSurface( &ddsd, &GameAreaSurfaceFront_ptr, NULL); TADD->CreateSurface( &ddsd, &GameAreaSurfaceBack_ptr, NULL); Cls ( ); } return GameAreaSurfaceFront_ptr; }
unsigned int InputArea(char* sCodArea) { int scrl_speed, w_delay; unsigned int status; DFT_STRUCT accept_dft ; DFT_STRUCT *screen; static char fieldstr[5]; // store data as character strs // unsigned int fieldinteger; // store data into integer /// unsigned long fieldlong; // store data into long static char *prompt1= "AREA: "; // static char *prompt2= "ACCEPT LEFT TO RT"; // static char *prompt3= "ACCEPT RT TO LEFT"; static char *mask1= "____"; // static char *mask2= "__________"; // static char *mask3= "__________"; Cls(); // Resetta il campo (spero) memset(fieldstr, ' ', 8); w_delay = WBEEPDEFAULT; // set wand beep delay scrl_speed = 10; // set the scroll speed for edit setdelayvals(scrl_speed, w_delay); // set delay values once // #1 PROMPT screen = &accept_dft; screen->df1 = WANDABLE; // Inverse video prompt, wand screen->df2 = ALPNUM_DATA | EDIT_DATA; // Alpha/Numeric, edit screen->prompt_str = prompt1; // setup the data format table screen->prompt_len = strlen(prompt1); // get the length of prompt1 screen->mask_str = mask1; screen->mask_str_len = strlen(mask1); // get the length of mask1 screen->prompt_col = 0; // col 1, row 2, zero relative screen->prompt_row = 1; screen->mask_col = 8; // screen->mask_row = 2; // col 9, row 3, zero relative screen->mask_row = 1; screen->default_str_len = 0; // no default data screen->min_input = 1; // min/max range screen->max_input = CODAREA_LEN; // define the storage type screen->field.fieldchar = fieldstr; // pointer to character string screen->field_len = CODAREA_LEN+1; // maximum length of the field screen->clear_start_line = 0; // line num zero relative screen->clear_end_line = 20; screen->status_line = 20; // status line num zero relative status = acceptscreen(screen); // accept the data // evalstatus(status,FALSE); // check return status if (status == GOOD_DATA) { #ifdef _DEBUG printf("%s\n", fieldstr); #endif CopiaStr(sCodArea,fieldstr,0,CODAREA_LEN); } /********************************************************************** // #2 PROMPT screen->df1 = WANDABLE; // Wandable prompt screen->df2 = NUMERIC_DATA | EDIT_DATA; // Numeric, edit screen->prompt_str = prompt2; // setup the data format table screen->prompt_len = 0x00; // use 0 for null terminated prompt strings screen->mask_str = mask2; screen->mask_str_len = strlen(mask2); // setup length of mask2 // use the same col, row default_str_len, min/max field pointer, clr lines and status line info screen->field.fieldint = &fieldinteger; // pointer to integer field screen->field_len = 1; // store into 1 integer status = acceptscreen(screen); // accept the data evalstatus(status); // check return status if (status = GOOD_DATA) printf("%s\n", fieldstr); // #3 PROMPT screen->df1 = WANDABLE | INV_PROMPT | INV_ACCEPTSCR; screen->df2 = ALPNUM_DATA | EDIT_DATA; screen->prompt_str = prompt3; screen->prompt_len = 0x00; // use 0 for null terminated screen->mask_str = mask3; screen->mask_str_len = strlen(mask3); // setup length of mask2 // use the same col, row default_str_len, min/max field pointer, clr lines and status line info screen->field.fieldint = &fieldinteger; // pointer to integer field screen->field_len = 1; // store into 1 integer status = acceptscreen(screen); // go accept the data evalstatus(status); if (status = GOOD_DATA) printf("%s\n", fieldstr); ***********************************************************/ return status; }
void Lcd_t::Init(void) { BckLt.Init(); // ==== GPIOs ==== // Configure LCD_XRES, LCD_XCS, LCD_SCLK & LCD_SDA as Push-Pull output PinSetupOut(LCD_GPIO, LCD_XRES, omPushPull); PinSetupOut(LCD_GPIO, LCD_XCS, omPushPull); PinSetupOut(LCD_GPIO, LCD_SCLK, omPushPull); PinSetupOut(LCD_GPIO, LCD_SDA, omPushPull); // ========================= Init LCD ====================================== SCLK_Lo(); XCS_Hi(); // Reset display XRES_Lo(); chThdSleepMilliseconds(7); XRES_Hi(); IWriteCmd(0xAF); // display ON // Reset display again XRES_Lo(); chThdSleepMilliseconds(7); XRES_Hi(); chThdSleepMilliseconds(7); // Initial commands IWriteCmd(0xAF); // display ON IWriteCmd(0xA4); // Set normal display mode IWriteCmd(0x2F); // Charge pump on IWriteCmd(0x40); // Set start row address = 0 #if LCD_MIRROR_Y_AXIS IWriteCmd(0xC8); // Mirror Y axis #endif #if LCD_MIRROR_X_AXIS IWriteCmd(0xA1); // Mirror X axis #endif // Set x=0, y=0 IWriteCmd(0xB0); // Y axis initialization IWriteCmd(0x10); // X axis initialisation1 IWriteCmd(0x00); // X axis initialisation2 Cls(); #if LCD_DMA_BASED // ================ Switch to USART + DMA ==================== PinSetupAlterFunc(LCD_GPIO, LCD_SCLK, omPushPull, pudNone, AF7, ps40MHz); PinSetupAlterFunc(LCD_GPIO, LCD_SDA, omPushPull, pudNone, AF7, ps40MHz); // ==== USART init ==== clock enabled, idle low, first edge, enable last bit pulse rccEnableUSART3(FALSE); USART3->CR1 = USART_CR1_UE; // Enable USART3->BRR = Clk.APB1FreqHz / LCD_UART_SPEED; USART3->CR2 = USART_CR2_CLKEN | USART_CR2_LBCL; // Enable clock, enable last bit clock USART3->CR1 = USART_CR1_UE | USART_CR1_M | USART_CR1_TE; USART3->CR3 = USART_CR3_DMAT; // Enable DMA at transmitter // DMA dmaStreamAllocate (LCD_DMA, IRQ_PRIO_LOW, nullptr, NULL); dmaStreamSetPeripheral(LCD_DMA, &USART3->DR); dmaStreamSetMemory0 (LCD_DMA, IBuf); dmaStreamSetTransactionSize(LCD_DMA, LCD_VIDEOBUF_SIZE); dmaStreamSetMode (LCD_DMA, LCD_DMA_TX_MODE); // Start transmission XCS_Lo(); dmaStreamEnable(LCD_DMA); #else #endif chSemInit(&semLcd, 1); }
int kmain(UInt32 initial_stack, MultibootHeader* mboot, UInt32 mboot_magic) { initial_esp = initial_stack; CLI_Init(); Cls(); UInt32 initrd_end = *(UInt32*)(mboot->mods_addr+4); placement_address = (Pointer) initrd_end; // Set up our new stack here. //UInt32 stack = (UInt32) kmalloc_a(8192, TRUE); MultibootHeader* mboot_hdr = mboot; //kmalloc(sizeof(MultibootHeader)); //memcpy(mboot_hdr, mboot, sizeof(MultibootHeader)); kprintf("Starting init...\n"); //new_start(stack, mboot_hdr); GDT_Init(); IDT_Init(); ISR_Init(); asm volatile("sti"); kprintf("Basics\t\t\t[OK]\n"); PIT_Init(PIT_MSTIME); kprintf("PIT\t\t\t[OK]\n"); init_kheap(); InitPaging((mboot_hdr->mem_lower+mboot_hdr->mem_upper)&~3); InitKernelHeap(); kprintf("Heap\t\t\t[OK]\n"); VFS_Init(); DevFS_Init(); kprintf("VFS\t\t\t[OK]\n"); DriversInit(); kprintf("Drivers\t\t\t[OK]\n"); Screen_Init(); FloppyInit(); checkAllBuses(); DumpPCIDeviceData(); kprintf("PCI\t\t\t[OK]\n"); /*kprintf("Keyboard Init... "); KB_Init(0); kprintf("[ok]\n");*/ FAT12_Init(FAT12_GetContext(FloppyGetDevice()), "/", "sys"); InitTasking(); KernelSymbolsLoad(); //Cls(); kprintf("kOS v0.6.13\n"); VFS_Node* rd = GetNodeFromFile(GetFileFromPath("/sys")); kprintf("rd = %x\n", rd); ArrayList* list = ListFiles(rd); ALIterator* itr = ALGetItr(list); while(ALItrHasNext(itr)) { VFS_Node* node = ALItrNext(itr); kprintf("file: %s\n", node->name); } ALFreeItr(itr); ALFreeList(list); //kprintf("kprintf symbol = %x\n", getKernelSymbol("kprintf")); File* initScript = GetFileFromPath("/sys/init.script"); FileSeek(0, initScript); // Due to these being global objects, we have to do such ugly things as this. #ifdef INIT_DEBUG kprintf("initScript=%x\n", initScript); #endif char* lineBuf = kalloc(256); int doBreak = 0; while(!doBreak) { if(fgetline(initScript, lineBuf, 256, '\n')==-1) { if(strlen(lineBuf) > 0) { doBreak = 1; } else { break; // We've processed everything that needs to be processed. } } // Now parse it. char* tok = strtok(lineBuf, " "); kprintf("%s, %x\n", tok,tok); if(!strcmp(tok, "load_driver")) { #ifdef INIT_DEBUG kprintf("load_driver "); #endif tok = strtok(NULL, " "); // Load the driver specified. File* drv = GetFileFromPath(tok); if(drv != NULL) { int drvLength = FileSeek(SEEK_EOF, drv); FileSeek(0, drv); void* drvBuf = kalloc(drvLength); #ifdef INIT_DEBUG kprintf("%s\n", GetNodeFromFile(drv)->name); #endif ReadFile(drvBuf, drvLength, drv); ELF* elf = LoadKernelDriver(drvBuf); #ifdef INIT_DEBUG kprintf("elf->start=%x\n", elf->start); #endif if(elf->error == 0) { void (*driverInit)() = (void (*)()) elf->start; driverInit(); } kfree(drvBuf); drvBuf = NULL; CloseFile(drv); } } } CloseFile(initScript); kfree(lineBuf); kprintf("Kernel init done...\n"); File* elf = GetFileFromPath("/sys/helloworld"); FileSeek(SEEK_EOF, elf); int length = FileTell(elf); FileSeek(0, elf); UInt8* elfBuf = kalloc(length); ReadFile(elfBuf, length, elf); ELF* elfExe = Parse_ELF(elfBuf); CreateTaskFromELF(elfExe); // Kernel main logic loop while(1) { asm volatile("hlt"); } return 0; }
void FBGfx::Cls(Color clear_color) { glClearColor(clear_color.r, clear_color.g, clear_color.b, clear_color.a); Cls(); }
/*--------------------------------------------------------------------------*/ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG Msg; EmuState.WindowInstance = hInstance; char temp1[MAX_PATH]=""; char temp2[MAX_PATH]=" Running on "; unsigned threadID; HANDLE hEvent, // SetPriorityClass(GetCurrentProcess(),ABOVE_NORMAL_PRIORITY_CLASS ); // SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_ABOVE_NORMAL); // CoInitializeEx(NULL,COINIT_MULTITHREADED); // CoInitialize(NULL); // InitializeCriticalSection(); OleInitialize(NULL); //Work around fixs app crashing in "Open file" system dialogs (related to Adobe acrobat 7+ LoadString(hInstance, IDS_APP_TITLE,g_szAppName, MAX_LOADSTRING); if ( strlen(lpCmdLine) !=0) { strcpy(QuickLoadFile,lpCmdLine); strcpy(temp1,lpCmdLine); PathStripPath(temp1); strlwr(temp1); temp1[0]=toupper(temp1[0]); strcat (temp1,temp2); strcat(temp1,g_szAppName); strcpy(g_szAppName,temp1); } EmuState.WindowSize.x=640; EmuState.WindowSize.y=480; InitInstance (hInstance, nCmdShow); if (!CreateDDWindow(&EmuState)) { MessageBox(0,"Can't create primary Window","Error",0); exit(0); } Cls(0,&EmuState); DynamicMenuCallback( "",0, 0); DynamicMenuCallback( "",1, 0); LoadConfig(&EmuState); //Loads the default config file Vcc.ini from the exec directory EmuState.ResetPending=2; SetClockSpeed(1); //Default clock speed .89 MHZ BinaryRunning = true; EmuState.EmulationRunning=AutoStart; if (strlen(lpCmdLine)!=0) { Qflag=255; EmuState.EmulationRunning=1; } hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ) ; if (hEvent==NULL) { MessageBox(0,"Can't create Thread!!","Error",0); return(0); } hEMUThread = (HANDLE)_beginthreadex( NULL, 0, &EmuLoop, hEvent, 0, &threadID ); if (hEMUThread==NULL) { MessageBox(0,"Can't Start main Emulation Thread!","Ok",0); return(0); } WaitForSingleObject( hEvent, INFINITE ); SetThreadPriority(hEMUThread,THREAD_PRIORITY_NORMAL); // InitializeCriticalSection(&FrameRender); while (BinaryRunning) { if (FlagEmuStop==TH_WAITING) //Need to stop the EMU thread for screen mode change { //As it holds the Secondary screen buffer open while running FullScreenToggle(); FlagEmuStop=TH_RUNNING; } GetMessage(&Msg,NULL,0,0); //Seems if the main loop stops polling for Messages the child threads stall TranslateMessage(&Msg); DispatchMessage(&Msg) ; } CloseHandle( hEvent ) ; CloseHandle( hEMUThread ) ; timeEndPeriod(1); UnloadDll(); SoundDeInit(); WriteIniFile(); //Save Any changes to ini File return Msg.wParam; }
void Lcd_t::Init(void) { // ==== Backlight: Timer15 Ch2 ==== // Setup pin klGpioSetupByMsk(GPIOB, GPIO_Pin_15, GPIO_Mode_AF_PP); // Remap Timer15 to PB14 & PB15 AFIO->MAPR2 |= 0x00000001; // Setup timer15 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM15, ENABLE); TIM15->CR1 = 0x01; // Enable timer TIM15->CR2 = 0; TIM15->PSC = 0; // Do not divide input freq TIM15->ARR = 100; // Autoreload register: full brightness=100 TIM15->BDTR = 0xC000; // Main output Enable TIM15->CCMR1 = 0x6000; // PWM mode1 on Ch2 enabled TIM15->CCER = 0x0010; // Output2 enabled, polarity not inverted // ==== GPIOs ==== // Configure LCD_XRES, LCD_XCS, LCD_SCLK & LCD_SDA as Push-Pull output klGpioSetupByMsk(LCD_GPIO, LCD_XRES | LCD_XCS | LCD_SCLK | LCD_SDA, GPIO_Mode_Out_PP); // ========================= Init LCD ====================================== SCLK_Lo(); XCS_Hi(); // Reset display XRES_Lo(); Delay.ms(7); XRES_Hi(); WriteCmd(0xAF); // display ON // Reset display again XRES_Lo(); Delay.ms(7); XRES_Hi(); Delay.ms(7); // Initial commands WriteCmd(0xAF); // display ON WriteCmd(0xA4); // Set normal display mode WriteCmd(0x2F); // Charge pump on WriteCmd(0x40); // Set start row address = 0 WriteCmd(0xC8); // mirror Y axis //WriteCmd(0xA1); // Mirror X axis // Set x=0, y=0 WriteCmd(0xB0); // Y axis initialization WriteCmd(0x10); // X axis initialisation1 WriteCmd(0x00); // X axis initialisation2 Cls(); // clear LCD buffer draw_mode = OVERWRITE; // ====================== Switch to USART + DMA ============================ klGpioSetupByMsk(LCD_GPIO, LCD_SCLK | LCD_SDA, GPIO_Mode_AF_PP); // Workaround hardware bug with disabled CK3 when SPI2 is enabled SPI2->CR2 |= SPI_CR2_SSOE; // ==== USART init ==== RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); // Usart clock: enabled, idle low, first edge, enable last bit pulse USART_ClockInitTypeDef USART_ClockInitStructure; USART_ClockInitStructure.USART_Clock = USART_Clock_Enable; USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; USART_ClockInitStructure.USART_CPHA = USART_CPHA_1Edge; USART_ClockInitStructure.USART_LastBit = USART_LastBit_Enable; USART_ClockInit(USART3, &USART_ClockInitStructure); // Usart itself USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 100000; USART_InitStructure.USART_WordLength = USART_WordLength_9b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); // Enable USART USART_Cmd(USART3, ENABLE); // ==== DMA ==== RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel2); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&IBuf[0]; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = LCD_VIDEOBUF_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_Low; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel2, &DMA_InitStructure); // Enable USARTy DMA TX request USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE); // Start transmission XCS_Lo(); DMA_Cmd(DMA1_Channel2, ENABLE); // Enable USARTy DMA TX Channel }
void Lcd_t::Init() { // ==== Backlight: Timer15 Ch2 ==== // Setup pin PinSetupAlterFuncOutput(LCD_GPIO, LCD_BCKLT, omPushPull, ps50MHz); // Remap Timer15 to PB14 & PB15 AFIO->MAPR2 |= 0x00000001; // Setup timer15 rccEnableAPB2(RCC_APB2ENR_TIM15EN, false); TIM15->CR1 = 0x01; // Enable timer TIM15->CR2 = 0; TIM15->PSC = 0; // Do not divide input freq TIM15->ARR = 100; // Autoreload register: full brightness=100 TIM15->BDTR = 0xC000; // Main output Enable TIM15->CCMR1 = 0x6000; // PWM mode1 on Ch2 enabled TIM15->CCER = 0x0010; // Output2 enabled, polarity not inverted BackligthValue = 0; // ==== GPIOs ==== // Configure LCD_XRES, LCD_XCS, LCD_SCLK & LCD_SDA as Push-Pull output InitGpios(); // ========================= Init LCD ====================================== SCLK_Lo(); XCS_Hi(); // Reset display XRES_Lo(); chThdSleepMilliseconds(9); XRES_Hi(); WriteCmd(0xAF); // display ON // Reset display again XRES_Lo(); chThdSleepMilliseconds(7); XRES_Hi(); chThdSleepMilliseconds(7); // Initial commands WriteCmd(0xAF); // display ON WriteCmd(0xA4); // Set normal display mode WriteCmd(0x2F); // Charge pump on WriteCmd(0x40); // Set start row address = 0 // WriteCmd(0xC8); // mirror Y axis // WriteCmd(0xA1); // Mirror X axis // Set x=0, y=0 WriteCmd(0xB3); // Y axis initialization WriteCmd(0x10); // X axis initialisation1 WriteCmd(0x08); // X axis initialisation2 Cls(); // clear LCD buffer draw_mode = OVERWRITE; // ====================== Switch to USART + DMA ============================ #ifdef ENABLE_DMAUSART_MODE PinSetupAlterFuncOutput(LCD_GPIO, LCD_SCLK, omPushPull, ps50MHz); PinSetupAlterFuncOutput(LCD_GPIO, LCD_SDA, omPushPull, ps50MHz); // Workaround hardware bug with disabled CK3 when SPI2 is enabled SPI2->CR2 |= SPI_CR2_SSOE; // ==== USART init ==== rccEnableUSART3(false); // Usart clock: enabled, idle low, first edge, enable last bit pulse // Usart itself LCD_USART->BRR = Clk.APB1FreqHz / 100000; LCD_USART->CR1 = USART_CR1_TE | /* Transmitter enabled */ \ USART_CR1_M; /* 9 bit */ LCD_USART->CR2 = USART_CR2_CLKEN | \ USART_CR2_LBCL; LCD_USART->CR3 = USART_CR3_DMAT; // Enable DMA at transmitter LCD_USART->CR1 |= USART_CR1_UE; // Enable USART // ==== DMA ==== rccEnableDMA1(); dmaStreamAllocate(LCD_DMA, IRQ_PRIO_MEDIUM, LcdDmaCompIrq, NULL); dmaStreamSetPeripheral(LCD_DMA, &USART3->DR); dmaStreamSetMemory0(LCD_DMA, (uint32_t)&IBuf[0]); dmaStreamSetMode (LCD_DMA, LCD_DMA_MODE); // Start transmission XCS_Lo(); // DMA_Cmd(DMA1_Channel2, ENABLE); // Enable USARTy DMA TX Channel #else for(int i=0; i < 864; i++) WriteData(0x00); // Clear all screen #endif Backlight(0); chThdCreateStatic(waLcdThread, sizeof(waLcdThread), NORMALPRIO, (tfunc_t)LcdThread, NULL); }