main.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <string.h>
#include <linux/fb.h>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
int main(int argc, char* args[])
{
SDL_Window *sdlWindow = NULL;
SDL_Renderer *sdlRenderer = NULL;
SDL_Init(SDL_INIT_VIDEO);
SDL_CreateWindowAndRenderer(480, 320, SDL_WINDOW_SHOWN, &sdlWindow, &sdlRenderer);
SDL_Surface *screen = SDL_CreateRGBSurface(SDL_SWSURFACE, 480, 320, 16, 0, 0, 0, 0);
SDL_Texture *sdlTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, 480, 320);
int col = 0xf800;
int x, y, z = 600;
while (z--) {
uint16_t *s = screen->pixels;
for (y = 0; y < 320; y++) {
for (x = 0; x < 480; x++) {
*s++ = col;
}
}
SDL_UpdateTexture(sdlTexture, NULL, screen->pixels, screen->pitch);
SDL_RenderClear(sdlRenderer);
SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, NULL);
SDL_RenderPresent(sdlRenderer);
switch (col) {
case 0xf800:
col = 0x7e0;
break;
case 0x7e0:
col = 0x1f;
break;
case 0x1f:
col = 0xf800;
break;
}
SDL_Delay(1000 / 60);
}
SDL_FreeSurface(screen);
SDL_DestroyTexture(sdlTexture);
SDL_DestroyRenderer(sdlRenderer);
SDL_DestroyWindow(sdlWindow);
SDL_Quit();
return 0;
}
編譯
$ cd $ wget https://github.com/steward-fu/website/releases/download/zpg-pro/toolchain-x64.tar.gz $ tar xvf toolchain-x64.tar.gz $ sudo mv gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu /opt/zpg-sdk $ export PATH=$PATH:/opt/zpg-sdk/bin $ /opt/zpg-sdk/bin/aarch64-none-linux-gnu-gcc main.c -o sdltest -lSDL2 -I/opt/zpg-sdk/aarch64-none-linux-gnu/include/SDL2 -Wl,-rpath-link=/opt/zpg-sdk/aarch64-none-linux-gnu/lib -Wl,-rpath-link=/opt/zpg-sdk/aarch64-none-linux-gnu/lib/pulseaudio