Portuvačky vecí pre ProlinOS terminály
- Morc Offline
- Posts: 73
- Joined: Fri Jul 19, 2024 12:23 pm
- Description: 19 | tatar z Biskupovej
Ak som sa volade omýleu tak na mňa kričte. - Contact:
Portuvačky vecí pre ProlinOS terminály
"nelegálne a nepodpísané" portuvačky pre PAX S920, dodatky k týmto Linuxovým terminálom a iné srandy, lebo ja zabúdam
Volačo špecificky k našim exemplárom
Keďže na našich termináloch ide už ProlinOS V2.4.144.7795R tak sa zdá, že číňani medzičasom poríšili a opravili póvodný root access exploit a to s potenciálnym vysvetlením, že iba zapali IPv6 a tým pádom ten póvodný xtables modprobe trik znefunkčnili. Možno keby aj bolo IPv6 vypaté tak by to nešlo aj tak, jakože čil to je jedno. Momentálne roota extra moc nepotrebujeme, keby ho treba tak asi nájdeme alternatívu ako k nemu dojsť.
Toolchainové srání a šteluvačky k hax-pax
Na kompiluvačky pod macOSom (keré nepotrebujú volačo s GLIBC) stačí jakýkoľvek arm-unknown-linux-gnueabi-aarch64-darwin.tar.gz alebo arm-unknown-linux-gnueabi-x86_64-darwin.tar.gz na Inteloch z toť tohoto GitHub repozitára.
Pod Linuxom je to s toolchainmi podobná situácia, stačí v podstate bárjaký toolchain čo targetuje armv6, lenže tam je zas a znova šanca naraziť na ten istý GLIBC problém jak pri tom macOSovom.
Z tohto dóvodu kóli okolnosťám jako je GLIBC 2.15 a iným možným dependom sa najlepším zaťál osvedčeu zrovna ten, s kerým boli kompiluvané póvodné veci pre PAX a tým je Sourcery CodeBench Lite 2012.03-57. Jedná sa o arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu kerý ide spokojne aj na najaktuálnejšom 64bitovom Debiane, samozrejme ak sú v ňom nainštaluvané bežné dependy pre púšťaní 32bitových binárek.
Dodatek - Adam: sourcery toolchain dodaný jak príloha k postu, link na dl z póvodnej stránky zjavne prestal ísť
Čo sa týka hax-pax vecí, quick-start má v sebe defaultne apt inštalačkuvačky. Toto keď sa obejde a nainštaluje sa šecko ostatné, python knižnice, M4Crypto a šecko naokolo tak sa dá pekne do PAXu aj tlačiť bez ohľadu na host systém.
GitHuboviny
Spoločné 370networkom vybastlené veci sú na GitHube s tagom paxdevs aby sa predišlo bordelu s repozitármi.
Čil momentálne tam je pax-s920 repozitár s užitočným bordelom jako napríklad pax-docs se zhrabanými PDFkami ohľadom PAXov, ProlinOS-u a k šeckému tomuto relevantnému. Podobne je aj pax-build zložka v kerej sa nachádzajú dodatky, headery k libosal a libxui a podobné užitočné sprostosti keré samozrejme majú svoj popis pekne hentam.
Samozrejme nachádzajú sa tam aj iné repozitáre, hlavne forky a porty knižníc a iných vecí. Kto je zvedavý a číta, zisťuje a chce, tak nájde.
Volačo špecificky k našim exemplárom
Keďže na našich termináloch ide už ProlinOS V2.4.144.7795R tak sa zdá, že číňani medzičasom poríšili a opravili póvodný root access exploit a to s potenciálnym vysvetlením, že iba zapali IPv6 a tým pádom ten póvodný xtables modprobe trik znefunkčnili. Možno keby aj bolo IPv6 vypaté tak by to nešlo aj tak, jakože čil to je jedno. Momentálne roota extra moc nepotrebujeme, keby ho treba tak asi nájdeme alternatívu ako k nemu dojsť.
Toolchainové srání a šteluvačky k hax-pax
Na kompiluvačky pod macOSom (keré nepotrebujú volačo s GLIBC) stačí jakýkoľvek arm-unknown-linux-gnueabi-aarch64-darwin.tar.gz alebo arm-unknown-linux-gnueabi-x86_64-darwin.tar.gz na Inteloch z toť tohoto GitHub repozitára.
Pod Linuxom je to s toolchainmi podobná situácia, stačí v podstate bárjaký toolchain čo targetuje armv6, lenže tam je zas a znova šanca naraziť na ten istý GLIBC problém jak pri tom macOSovom.
Z tohto dóvodu kóli okolnosťám jako je GLIBC 2.15 a iným možným dependom sa najlepším zaťál osvedčeu zrovna ten, s kerým boli kompiluvané póvodné veci pre PAX a tým je Sourcery CodeBench Lite 2012.03-57. Jedná sa o arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu kerý ide spokojne aj na najaktuálnejšom 64bitovom Debiane, samozrejme ak sú v ňom nainštaluvané bežné dependy pre púšťaní 32bitových binárek.
Dodatek - Adam: sourcery toolchain dodaný jak príloha k postu, link na dl z póvodnej stránky zjavne prestal ísť
Čo sa týka hax-pax vecí, quick-start má v sebe defaultne apt inštalačkuvačky. Toto keď sa obejde a nainštaluje sa šecko ostatné, python knižnice, M4Crypto a šecko naokolo tak sa dá pekne do PAXu aj tlačiť bez ohľadu na host systém.
GitHuboviny
Spoločné 370networkom vybastlené veci sú na GitHube s tagom paxdevs aby sa predišlo bordelu s repozitármi.
Čil momentálne tam je pax-s920 repozitár s užitočným bordelom jako napríklad pax-docs se zhrabanými PDFkami ohľadom PAXov, ProlinOS-u a k šeckému tomuto relevantnému. Podobne je aj pax-build zložka v kerej sa nachádzajú dodatky, headery k libosal a libxui a podobné užitočné sprostosti keré samozrejme majú svoj popis pekne hentam.
Samozrejme nachádzajú sa tam aj iné repozitáre, hlavne forky a porty knižníc a iných vecí. Kto je zvedavý a číta, zisťuje a chce, tak nájde.
- Attachments
-
- arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
- (88.32 MiB) Downloaded 5 times
Re: Portuvačky vecí pre ProlinOS terminály
Ja dodám, že včera sa nám podarilo už spustit SDL1.2 na zariadení. Fígeľ bol v tom, že SDLko zo základu kontroluje prítomnosť klávesnice a myši, a pokial sa nenajde (čo nenajde, lebo platobný terminál nemá klávesnicu), vyhodí chybu. Myška sa síce dala vypnuť, ale kód na kontrolu klávesnice musel byť nasilu vykomentovaný z SDLka.
dodatek - Morc:
poupravím Milana, kód na kompletnú kontrolu klávesnice (kerý ríšeu že koľko klávesov má, jaký typ a podobné sprostosti) síce zakomentovaný je, ale SDLko stále ďalej s keypadom na PAXe našťastí funguje jak má. Podrobnejší popis sem vyhodím neskór časom keď sa doríša ďalšé okolnosti.
dodatek - Morc:
poupravím Milana, kód na kompletnú kontrolu klávesnice (kerý ríšeu že koľko klávesov má, jaký typ a podobné sprostosti) síce zakomentovaný je, ale SDLko stále ďalej s keypadom na PAXe našťastí funguje jak má. Podrobnejší popis sem vyhodím neskór časom keď sa doríša ďalšé okolnosti.
- Morc Offline
- Posts: 73
- Joined: Fri Jul 19, 2024 12:23 pm
- Description: 19 | tatar z Biskupovej
Ak som sa volade omýleu tak na mňa kričte. - Contact:
Problematické portuvaní SDLka s MilkyTrackerom
post dávam ako jeden ale zároveň je rozdelený na dve časti, SDL a MilkyTracker. Má to svoje opodstatnení keďže vývoj jedného portu závisel od druhého, bez jedného som nevedel došteluvať druhé a tak podobne.
SDL 1.2
Najprv sa naskytá otázka, prečo som išóv do SDL 1.2?
Odpoveď je jednoduchá. Chcel som najprv tú. Druhou vecou by sa dalo povedať že by bolo dóvodom to, že to je smíšne a treťou vecou to, že SDL 1.2 rovno podporuje fbcon na priame framebuffer vykresluvaní a dsp na priame tlačení do zvukovky. A zároveň je to staršá a pomerne používaná SDL 1.2, čo neni zlé mať v repertoári medzi existujúcimi portmi knižníc.
Ano, mohol som ríšiť SDL 2ku alebo rovno SDL 3ku, tak ale tam úplne čil momentálne nevím jak je poríšený fbdev, dsp a nechcelo sa mi momentálne s tým zapodívať keďže som túto dependenciu pre MilkyTracker stel mať relatívne friško z krku.
Ve výsledku je tento fork/port zdokumentovaný natoľko, aby som hlavne ja nezabudov že jak som ho vlastne vykompiluval. Opätovné kompiluvačky by polla správnosti už nemali byť treba, ve forku je dohodená narychlo a sprosto spravená keypad podpora, narychlo a sprosto spravená tp touchscreen podpora. Upozorňujem ale, že póvodná podpora pre klávesnice, napríklad po OTG, tam čil neni. Aj tak si nemyslím že by sa oplatilo do PAXu takto po OTGčku rvať periferie.
Takže ešte raz:
Pre už existujúce porty by malo stačiť natlačiť hotovú .so knižnicu na svoje dané místo pekne na /data/app/MAINAPP/lib/libSDL-1.2.so.0. Táto cesta by sa teoreticky nemala meniť, každopádne treba postupuvať polla portov.
Pre záležitosti ďalších nových portov, malo by stačiť normálne nahodiť include súbory a lib, plus dohodiť
aby portuvaná vec vedela že má preferuvať fbcon a dsp pre obraz a zvuk. Samozrejme portuvaná vec možno nebude spolupracuvať a bude treba pomeniť aj inakšé veci v porte, tak ale to je vec portuvanej veci. SDLko by malo byť v tomto ohľade dobre.
Ve výsledku ma celkom teší že poríšiť port SDL 1.2ky išóv celkom ruka v ruke a neboli veci čo by mi spósobuvali extra problémy. Aj keď ano, ze začátku boli veci typu "SDLko padá", tak ale to sa časom vyžehlilo a doladilo keď som pozisťuval že čo jako vlastne funguje a že čo má jak funguvať.
Repo: https://github.com/370network/SDL-1.2-pax/
MilkyTracker v0.90.86
Najprv sa naskytá zas tá istá otázka, prečo som išóv do MilkyTracker v0.90.86?
Odpoveď je zas a znova jednoduchá. Je to posledná verzia čo používa SDL 1.2. Ano, jak som hore spomenul, mohol som ísť do SDL 2ky, tak ale išóv som na veci mierne vypočítavo a spraveu som kombináciu takú, aby som mal friško šecko za sebou.
Samozrejme pri MilkyTrackeri to tak jednoduché úplne nebolo, ten totižto používal najprv autotools (autoconf, automake blá blá) kerý bol voláky rozpannutý a už moc ísť nestev. Našťastí toto som poríšeu s preportuvaním CMake buildsystému z novších verzií MilkyTrackeru a následnou úpravou aby chápal že treba používať crosscompile toolchain, aby chápal že tu vlastne SDL 2 neni, a teda kopa tých cést je tak nešťastne zahardcoduvaných. Našťastí to neni ništ čo by sa nedalo za volákych 5 minút poprehadzuvať tak, jak treba.
Verzia a buildsystém za nami. Čo ešte ostáva? Problémy. Buildsystém mi ešte pár problémov narobeu, nakonec som to ale voláko ukočíruval a ve výsledku sa ždy vykompiluje libppui.so, libmilkyplay.so a libmilkytracker.so.
Týmto sa dá prehlásiť že tento port je zaťál jediným na zemeguli čo je v0.90.86 s SDL 1.2, zároveň CMake, zároveň ukazuje do framebufferu a hrá do dsp a aby toho nebolo málo, je to asi jediný port čo je vykompiluvaný vlastne jak knižnica a né jak klasická executable binárka.
Ešte dodám že MilkyTracker samotný mi hádzal pár problémov pod nohy, ale to boli iba detaily ohľadom zvuku jako napríklad buffer srandy a potom počet kanálov, keré v našom prípade sú neni dva na stereo ale iba jeden na mono.
Celý ten výsledný port neni bezchybný, to zas né že ne. Ale povedzme že to je taký nezvyčajný jennorožec medzi vecami na zemeguli existujúcimi.
Repo: https://github.com/370network/MilkyTrackerPAX/
Dodatek, alebo čo si z toho zebrať na záver
Moja frustrácia z celého tohoto dvojprojektu nebola zrovna malá. Aj keď síce... keď sa na to celé kuknem čil spätne, keď vidím že koľko vecí som ve výsledku nakonec meneu v obidvoch repozitároch a keď sa kuknem na celé tí build procesy, tak ve výsledku to nebolo zas až také zlé jak sa to počas tých portuvačék zdalo.
Zdání klame a ešte raz som rád, že to vyšlo jak to vyšlo.
SDL 1.2
Najprv sa naskytá otázka, prečo som išóv do SDL 1.2?
Odpoveď je jednoduchá. Chcel som najprv tú. Druhou vecou by sa dalo povedať že by bolo dóvodom to, že to je smíšne a treťou vecou to, že SDL 1.2 rovno podporuje fbcon na priame framebuffer vykresluvaní a dsp na priame tlačení do zvukovky. A zároveň je to staršá a pomerne používaná SDL 1.2, čo neni zlé mať v repertoári medzi existujúcimi portmi knižníc.
Ano, mohol som ríšiť SDL 2ku alebo rovno SDL 3ku, tak ale tam úplne čil momentálne nevím jak je poríšený fbdev, dsp a nechcelo sa mi momentálne s tým zapodívať keďže som túto dependenciu pre MilkyTracker stel mať relatívne friško z krku.
Ve výsledku je tento fork/port zdokumentovaný natoľko, aby som hlavne ja nezabudov že jak som ho vlastne vykompiluval. Opätovné kompiluvačky by polla správnosti už nemali byť treba, ve forku je dohodená narychlo a sprosto spravená keypad podpora, narychlo a sprosto spravená tp touchscreen podpora. Upozorňujem ale, že póvodná podpora pre klávesnice, napríklad po OTG, tam čil neni. Aj tak si nemyslím že by sa oplatilo do PAXu takto po OTGčku rvať periferie.
Takže ešte raz:
Pre už existujúce porty by malo stačiť natlačiť hotovú .so knižnicu na svoje dané místo pekne na /data/app/MAINAPP/lib/libSDL-1.2.so.0. Táto cesta by sa teoreticky nemala meniť, každopádne treba postupuvať polla portov.
Pre záležitosti ďalších nových portov, malo by stačiť normálne nahodiť include súbory a lib, plus dohodiť
Code: Select all
SDL_putenv("SDL_VIDEODRIVER=fbcon");
SDL_putenv("SDL_FBDEV=/dev/fb");
SDL_putenv("SDL_AUDIODRIVER=dsp");
SDL_putenv("SDL_PATH_DSP=/dev/snd/dsp");
Ve výsledku ma celkom teší že poríšiť port SDL 1.2ky išóv celkom ruka v ruke a neboli veci čo by mi spósobuvali extra problémy. Aj keď ano, ze začátku boli veci typu "SDLko padá", tak ale to sa časom vyžehlilo a doladilo keď som pozisťuval že čo jako vlastne funguje a že čo má jak funguvať.
Repo: https://github.com/370network/SDL-1.2-pax/
MilkyTracker v0.90.86
Najprv sa naskytá zas tá istá otázka, prečo som išóv do MilkyTracker v0.90.86?
Odpoveď je zas a znova jednoduchá. Je to posledná verzia čo používa SDL 1.2. Ano, jak som hore spomenul, mohol som ísť do SDL 2ky, tak ale išóv som na veci mierne vypočítavo a spraveu som kombináciu takú, aby som mal friško šecko za sebou.
Samozrejme pri MilkyTrackeri to tak jednoduché úplne nebolo, ten totižto používal najprv autotools (autoconf, automake blá blá) kerý bol voláky rozpannutý a už moc ísť nestev. Našťastí toto som poríšeu s preportuvaním CMake buildsystému z novších verzií MilkyTrackeru a následnou úpravou aby chápal že treba používať crosscompile toolchain, aby chápal že tu vlastne SDL 2 neni, a teda kopa tých cést je tak nešťastne zahardcoduvaných. Našťastí to neni ništ čo by sa nedalo za volákych 5 minút poprehadzuvať tak, jak treba.
Verzia a buildsystém za nami. Čo ešte ostáva? Problémy. Buildsystém mi ešte pár problémov narobeu, nakonec som to ale voláko ukočíruval a ve výsledku sa ždy vykompiluje libppui.so, libmilkyplay.so a libmilkytracker.so.
Týmto sa dá prehlásiť že tento port je zaťál jediným na zemeguli čo je v0.90.86 s SDL 1.2, zároveň CMake, zároveň ukazuje do framebufferu a hrá do dsp a aby toho nebolo málo, je to asi jediný port čo je vykompiluvaný vlastne jak knižnica a né jak klasická executable binárka.
Ešte dodám že MilkyTracker samotný mi hádzal pár problémov pod nohy, ale to boli iba detaily ohľadom zvuku jako napríklad buffer srandy a potom počet kanálov, keré v našom prípade sú neni dva na stereo ale iba jeden na mono.
Celý ten výsledný port neni bezchybný, to zas né že ne. Ale povedzme že to je taký nezvyčajný jennorožec medzi vecami na zemeguli existujúcimi.
Repo: https://github.com/370network/MilkyTrackerPAX/
Dodatek, alebo čo si z toho zebrať na záver
Moja frustrácia z celého tohoto dvojprojektu nebola zrovna malá. Aj keď síce... keď sa na to celé kuknem čil spätne, keď vidím že koľko vecí som ve výsledku nakonec meneu v obidvoch repozitároch a keď sa kuknem na celé tí build procesy, tak ve výsledku to nebolo zas až také zlé jak sa to počas tých portuvačék zdalo.
Zdání klame a ešte raz som rád, že to vyšlo jak to vyšlo.
- šňupať kýbel Offline
- Site Admin
- Posts: 36
- Joined: Fri Jun 21, 2024 7:53 pm
- Description: keď je to posrate icte sa sťažuvať na lampareň
Žuja je zakon!
SDL2 a Rust - jak sa zajác na PAXa dostal
portuvacé omáčky k release postu
Nakolko mi nápad portuvať Bobbyho na PAXa vŕtal a vŕtal v gebuli som sa pustil do prieskumu jak by to najlepšie bolo spraviť. Hra je J2ME ale celú JVM s podporou J2ME som moc chuť portuvať nemal, tak som sa kukol na opensource prerábky klasického starého zajáca. Napriek tomu že póvodná mobilná hra je z 2004 tak sa z nevysvetlitelného dóvodu v nedávnej dobe roztrhlo vreco s remakami ešte k tomu v šelijakých "trenduvacích" moderných jazykoch. Už dlhší som vedel o tomto odinovom ale keďže sa jenná o jazyk o kerom nikdy nikdo nepočul a ešte to vyzeralo aj dosť vázané na windows, tak som sa poobzíral ďalej.
Našov som toto čínske repo, ktoré obsahuje port zajáca v Ruste, Zigu a v Haxe (zas voláky neznámy moderný jazyk). Rozhodol som sa zamerať na Rustovú verziu hlavne kóli lákavému SDL2 v mene a tomu že to bude asi najpodporuvanejší a najvyzretejší jazyk z ponúkaných možností.
SDL2 "DRIVERLESS"
SDL2 síce zní jak ulahčení roboty, no SDL2 neni SDL1.2 (ktoré už máme funkčné). Problém je hlavne v tom, že dvojka už nemá podporu pre priamy výstup do framebuffera (fbcon v 1.2ke) a na PAXovi je len framebuffer. Pri snahe nájsť ríšení tohoto problému som narazev na tento post. Autor mal podobný problém, a vyríšev ho celkom originálne a jennoducho ešte aj bez potreby zásahu do SDLka!
Fígel bol celkom jennoduchý, video driver z SDLka uplne vyradíme a sami budeme valiť pixely ze SDL surface rovno do framebuffera z nášho aplikačného kódu. Toť je ukážka kódu z og postu:
Code: Select all
def refresh():
# We open the TFT screen's framebuffer as a binary file. Note that we will write bytes into it, hence the "wb" operator
f = open("/dev/fb1","wb")
# According to the TFT screen specs, it supports only 16bits pixels depth
# Pygame surfaces use 24bits pixels depth by default, but the surface itself provides a very handy method to convert it.
# once converted, we write the full byte buffer of the pygame surface into the TFT screen framebuffer like we would in a plain file:
f.write(lcd.convert(16,0).get_buffer())
# We can then close our access to the framebuffer
f.close()
time.sleep(0.1)
Ohurený touto ideou (kerá neni voláka revolučná ale mňa by to hneď nenapallo lebo já som sprostý) som sťáhol SDL 2ku zdroják a vykompiluval ho s túto konfiguráciu:
Code: Select all
CC='/home/parallels/arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/arm-2012.03/bin/arm-none-linux-gnueabi-gcc' ./configure --disable-audio --disable-video --disable-joystick --disable-haptic --disable-hidapi --disable-sensor --disable-video-vulkan --disable-dbus --prefix=/home/parallels/sdlout/ --host=arm-none-linux-gnueabi
CC='/home/parallels/arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/arm-2012.03/bin/arm-none-linux-gnueabi-gcc' make
CC='/home/parallels/arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/arm-2012.03/bin/arm-none-linux-gnueabi-gcc' make install
Prvotná próba s jennoduchým Cčkovým test kódom bola úspešná, pocit eufórie značný:
Code: Select all
#include "./SDL2/SDL.h"
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
__attribute__((constructor))
int app_start() {
SDL_Surface *surface = SDL_CreateRGBSurface(0, 320, 240, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);
SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 0, 0, 0));
SDL_Rect rect = { 50, 50, 100, 100 }; // x, y, width, height
SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, 255, 0, 0));
SDL_Surface *convertedsurface = SDL_ConvertSurface(surface, SDL_AllocFormat(SDL_PIXELFORMAT_RGB565),0);
int fb = open("/dev/fb", O_RDWR);
write(fb, convertedsurface->pixels, surface->pitch * surface->h);
close(fb);
SDL_FreeSurface(surface);
SDL_Quit();
return 0;
}
Z imagea som nehal len hlavné obrázkové formáty, bmp, gif, jpg, png, neh tam neni kadejaký webp a podobný bordel čo moc treba nebolo. Kompiluval som takto:
Code: Select all
CC='/home/parallels/arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/arm-2012.03/bin/arm-none-linux-gnueabi-gcc' ./configure --disable-avif --disable-jpg-shared --disable-jxl --disable-png-shared --disable-svg --disable-tif --disable-xcf --disable-xpm --disable-xv --disable-webp --disable-qoi --disable-lbm --disable-pcx --disable-sdltest --with-sdl-prefix=/home/parallels/sdlout/ -prefix=/home/parallels/sdlout/ --host=arm-none-linux-gnueabi
CC='/home/parallels/arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/arm-2012.03/bin/arm-none-linux-gnueabi-gcc' make
CC='/home/parallels/arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/arm-2012.03/bin/arm-none-linux-gnueabi-gcc' make install
Code: Select all
# Decode aliases for certain CPU-COMPANY combinations.
case $basic_machine in
# Recognize the basic CPU types without company name.
# Some are omitted here because they have special meanings below.
1750a | 580 \
| a29k \
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
| am33_2.0 \
| arc | arm| aarch64 | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
| be32 | be64 \
| bfin \
Code: Select all
CC='/home/parallels/arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/arm-2012.03/bin/arm-none-linux-gnueabi-gcc' ./configure --with-sdl-prefix=/home/parallels/sdlout/ -prefix=/home/parallels/sdlout/ --disable-mmx --host=arm-none-linux-gnueabi --build=aarch64-linux-gnu
CC='/home/parallels/arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/arm-2012.03/bin/arm-none-linux-gnueabi-gcc' make
CC='/home/parallels/arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/arm-2012.03/bin/arm-none-linux-gnueabi-gcc' make install
Na sťáhnutí ponúkam vykompiluvané knižnice s headermi. gfx a img aj zdílané ale samotné SDLko len statické, keďže s takúto podivnú implementáciu je lepšé systém radšej nešpiniť a nalinkuvať si ju staticky len do vlastnej aplikácie de víme, o čo sa jedná
Rust (na nepodporuvanom systéme )
SDLko máme poríšené (divne ale máme), no na kompletného zajáca treba aj Rust. Keď sa kukneme na podporuvané platformy v dokumentácii tak to moc ružovo nevyzerá. Čo Čil? Nemáme na to ani správnu verziu jadra a ani glibc. Crosscompile v Ruste je celkom jednoduchý, stačí pridať podporu pre target
Code: Select all
rustup target add arm-unknown-linux-gnueabi
Code: Select all
[lib]
crate-type = ["cdylib"]
Ríšením sa ukázalo použiť místo gnueabi arm-unknown-linux-musleabi a musl staticky nalinkuvať. Tým pádom obijdeme potrebu nového glibc. No prúser 2, rust nesťel vyrobiť cdylib knižnicu pri použití musleabi. Ríšení sa ukázalo byť celkom zaujímavým spósobom. V ruste vykompilujeme jak statickú knižnicu a nalinkujeme si to do dynamickej knižnice ručne pomocou gcc.
Cargo.toml treba zmeniť takto:
Code: Select all
[lib]
crate-type = ["staticlib"]
Code: Select all
cargo build --release --target=arm-unknown-linux-musleabi
zalinkujeme to do .so knižnice takto:
Code: Select all
/home/parallels/arm-linux-musleabi-cross/bin/arm-linux-musleabi-gcc -shared -fPIC -o sharedlib.so -Wl,--whole-archive libfromrust.a -Wl,--no-whole-archive -nostartfiles -static
Poďme s tým na zajáca
cargo.toml som upravil aby místo normálnej binárky urobil knižnicu, tú potom načítavame pre zjednodušení ešte z loader medziknižnice kóli špecifikáciám spúšťaňá vecí v PAXe. Zdroják zajáca som upravil tak aby rval sdl surface do framebuffera a čítal klávesy místo cez SDLko rovno z /dev/keypad evdevu. Renderuvaní obrazu bolo treba otočiť o devadesát stupňov aby to bolo správne na výšku. Nesťem moc ten rust kód popisuvať, nakolko je dosť chujovo spravený a nerozumím sa do toho, bolo to skór len pokus omyl. Každý si ho móže prečítať ve zdrojáku. Na záver zajáca vykompilujeme takto:
Code: Select all
RUSTFLAGS='-L /home/parallels/sdlout/lib' cargo build --release --target=arm-unknown-linux-musleabi
/home/parallels/arm-linux-musleabi-cross/bin/arm-linux-musleabi-gcc -shared -fPIC -o rustbobbytest.so -Wl,--whole-archive '/home/parallels/bobby-carrot/rust-sdl2/target/arm-unknown-linux-musleabi/release/libbobby_carrot.a' '/home/parallels/sdlout/lib/libSDL2_gfx.a' '/home/parallels/sdlout/lib/libSDL2_image.a' -Wl,--no-whole-archive -nostartfiles -static
ostatné knižnice ale ten debil nezapakuje, preto su zas špecifikuvané ve finálnom linkuvacom príkaze, keďže som sťel šecky sdlkoviny mať staticky
pre kompletnosť ešte príkaz na skompiluvaní loader medziknižnice:
Code: Select all
/home/parallels/arm-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/arm-2012.03/bin/arm-none-linux-gnueabi-gcc -shared -fPIC -o rustload.so rustload.c -nostartfiles -ldl
- Morc Offline
- Posts: 73
- Joined: Fri Jul 19, 2024 12:23 pm
- Description: 19 | tatar z Biskupovej
Ak som sa volade omýleu tak na mňa kričte. - Contact:
Jak sa "reverseengineeruvali" headery dvoch ProlinOS knižníc
alebo, jak idem robiť volačo, čo som nikdy nerobeu. Aj keď to je zaťál vačšina vecí spojených s PAXom.
Mať dosah na libosal.so a libxui.so by bola velice pekná vec. Preto bolo treba vyskladať headery pre obidve knižnice, aby bolo jak funkcie z týchto knižníc používať.
Títo knižnice samé o sebe sú celkom užitočné lebo sa starajú o istú časť abstrakcie medzi hardwarom na PAXoch a "boilerplate kódom" kerý by mosel človek bez prístupu ke knižnicám písať. Ve výsledku teda logicky šetrá čas pri vývoji srandičék. Do by to bol povedal, že?
Jak to len spraviť?
Zakál osal.h poslal Milan (a ten neni ešte úplne vyplnený funkciami, časom sa možno doplňá ak bude treba), tak xui.h som vyskladal manuálne ja. Proces vyskladávaňá headera to bol v skutku celkom smíšny a keďže som mal po ruke PDFká ohľadom obidvoch knižníc v kerých boli pekne vypísané definície makier, štruktúr a funkcií tak nič mi v podstate neprekážalo pomaly ale isto začať vyskladávať z toho header. A to je aj to, čo som spraveu.
Rekonštrukcia headera po Biskupovsky
Keďže už bol osal.h od Milana po ruke, tak som ho zebral a polla neho spraveu ten header pre xui.h. Najprv bolo treba cez nm -D --defined-only ~/hax-pax/libxui.so nehať vypluť šecky symboly, títo som si prekopíruval do nového headeru a polla toho existujúceho PDFka som začal pracne a ručne prepisuvať šecko čo sa dalo. To čo sa dalo prešlo 1:1 se 100% presnosťou, to čo som nevedel porišiť som dal jak mi pasuvalo, to čo pri testuvaní nešlo sa poupravilo aby to začalo funguvať a ve výsledku ostali iba dve funkcie keré v PDFkách neboli a by som ich mosel komplet úplne vytipuvať. Ve výsledku fakt nevím či som to robeu šecko dobre, doví či to vóbec išlo aj voláko zautomatizuvať. Každopádne podstatné ale je, že celá robota nešla na zmar lebo výsledek je taký že s tým idú robiť nové veci.
A samozrejme aby toho nebolo málo, k headeru prikladám aj osal_test.c a xui_test.c zdrojáky s kerými sa dá funkcionalita otestuvať. Existujú hlavne aj preto, aby sa potenciálny záujemca o využití knižníc vedel aspoň od volačoho odraziť. Testuvačka pre osal je momentálne pomerne planá, celé čo robí je že mení jas cez OsScrBrightness. Narozdíl od toho testuvačka pre XUI je o to zaujímavejšá keďže tá vykreslí XUI okno s textom.
Frajer na záver
A ešte komplet výpis symbolov pre libosal.so a libxui.so:
libosal.so:
libxui.so:
Mať dosah na libosal.so a libxui.so by bola velice pekná vec. Preto bolo treba vyskladať headery pre obidve knižnice, aby bolo jak funkcie z týchto knižníc používať.
Títo knižnice samé o sebe sú celkom užitočné lebo sa starajú o istú časť abstrakcie medzi hardwarom na PAXoch a "boilerplate kódom" kerý by mosel človek bez prístupu ke knižnicám písať. Ve výsledku teda logicky šetrá čas pri vývoji srandičék. Do by to bol povedal, že?
Jak to len spraviť?
Zakál osal.h poslal Milan (a ten neni ešte úplne vyplnený funkciami, časom sa možno doplňá ak bude treba), tak xui.h som vyskladal manuálne ja. Proces vyskladávaňá headera to bol v skutku celkom smíšny a keďže som mal po ruke PDFká ohľadom obidvoch knižníc v kerých boli pekne vypísané definície makier, štruktúr a funkcií tak nič mi v podstate neprekážalo pomaly ale isto začať vyskladávať z toho header. A to je aj to, čo som spraveu.
Rekonštrukcia headera po Biskupovsky
Keďže už bol osal.h od Milana po ruke, tak som ho zebral a polla neho spraveu ten header pre xui.h. Najprv bolo treba cez nm -D --defined-only ~/hax-pax/libxui.so nehať vypluť šecky symboly, títo som si prekopíruval do nového headeru a polla toho existujúceho PDFka som začal pracne a ručne prepisuvať šecko čo sa dalo. To čo sa dalo prešlo 1:1 se 100% presnosťou, to čo som nevedel porišiť som dal jak mi pasuvalo, to čo pri testuvaní nešlo sa poupravilo aby to začalo funguvať a ve výsledku ostali iba dve funkcie keré v PDFkách neboli a by som ich mosel komplet úplne vytipuvať. Ve výsledku fakt nevím či som to robeu šecko dobre, doví či to vóbec išlo aj voláko zautomatizuvať. Každopádne podstatné ale je, že celá robota nešla na zmar lebo výsledek je taký že s tým idú robiť nové veci.
A samozrejme aby toho nebolo málo, k headeru prikladám aj osal_test.c a xui_test.c zdrojáky s kerými sa dá funkcionalita otestuvať. Existujú hlavne aj preto, aby sa potenciálny záujemca o využití knižníc vedel aspoň od volačoho odraziť. Testuvačka pre osal je momentálne pomerne planá, celé čo robí je že mení jas cez OsScrBrightness. Narozdíl od toho testuvačka pre XUI je o to zaujímavejšá keďže tá vykreslí XUI okno s textom.
Frajer na záver
A ešte komplet výpis symbolov pre libosal.so a libxui.so:
libosal.so:
Code: Select all
richardgracik@Richards-MacBook-Pro-2021 pax-build % nm -D --defined-only ~/hax-pax/libosal.so
0000f9f4 T OsAES
0003b424 T OsBaseCheck
0003b510 T OsBaseClose
0003b31c T OsBaseConnect
0003b3a8 T OsBaseDisconnect
0003b5b8 T OsBaseInfo
0003b458 T OsBaseOpen
0003b2bc T OsBaseScan
0003b558 T OsBaseUpdate
0002ca1c T OsBeep
0002b660 T OsBootUpgrade
00039b20 T OsCameraCapture
00039b04 T OsCameraClose
00039b14 T OsCameraGetParam
00039af8 T OsCameraOpen
00039b08 T OsCameraSetParam
0002e360 T OsCheckBMSMode
0002d7b8 T OsCheckBattery
0002e1a0 T OsCheckPowerStatus
0002d8bc T OsCheckPowerSupply
000361cc T OsCloseFont
00036284 T OsCodeConvert
0002d064 T OsCryptFormat
0002d1b4 T OsCryptMount
0002d2f0 T OsCryptUmount
0000f810 T OsDES
0002c588 T OsEnableCrashReports
000353d8 T OsEnumFont
0002b5a4 T OsFirmwareGetVersion
0002b5e0 T OsFirmwareUpgrade
0002acb0 T OsGetAppExitCode
0002c0b8 T OsGetAppInfo
00035878 T OsGetFontDot
0002c1d8 T OsGetOptInfo
0001838c T OsGetRandom
0002bfc0 T OsGetSysVer
0002c91c T OsGetTickCount
0002c8a8 T OsGetTime
0003a17c T OsGpsClose
00039e8c T OsGpsOpen
0003a048 T OsGpsRead
0001e918 T OsIccClose
0001e994 T OsIccDetect
0001e8cc T OsIccExchange
0001e63c T OsIccGetFd
0001e670 T OsIccInit
0001ebcc T OsIccLockCard
0001eaa4 T OsIccOpen
0001ebd8 T OsIccUnlockCard
0002b328 T OsInstallFile
0002d6a4 T OsKbBacklight
0003a868 T OsLed
0002c5d4 T OsLog
0002c590 T OsLogSetTag
0000dd24 T OsMifareAuthority
0000de9c T OsMifareOperate
00028d00 T OsModemCheck
0002920c T OsModemClose
00028ad8 T OsModemConnect
00029064 T OsModemExCmd
00028750 T OsModemGetUart
000291e8 T OsModemHangup
0002890c T OsModemOpen
00028eb4 T OsModemRecv
00028d30 T OsModemSend
000288a4 T OsModemSwitchPower
0002d384 T OsMount
00035024 T OsMsrClose
00034ef4 T OsMsrOpen
00035060 T OsMsrRead
000350a4 T OsMsrReadEx
000350e8 T OsMsrReadJIS
000350f4 T OsMsrReadTest
00035150 T OsMsrReset
00035100 T OsMsrSwiped
0001f8fc T OsNetAddArp
0001f338 T OsNetCheckDhcp
0001f648 T OsNetCheckDhcp6
0001f008 T OsNetDelRouteTable
0001eda8 T OsNetDns
0001ee38 T OsNetDnsEx
0001f288 T OsNetGetConfig
0001f724 T OsNetGetIPv6Addr
0001ef0c T OsNetGetRoute
0001f514 T OsNetGetRouteAdvertise6
0001f0a4 T OsNetGetRouteTable
0001f8a0 T OsNetGetRouteTable6
0001ec88 T OsNetPing
0001f42c T OsNetPing6
0001ed10 T OsNetPingEx
0001f0fc T OsNetSetConfig
0001f590 T OsNetSetDns
0001f780 T OsNetSetIPv6Addr
0001eec8 T OsNetSetRoute
0001ef38 T OsNetSetRouteTable
0001f800 T OsNetSetRouteTable6
0001f2dc T OsNetStartDhcp
0001f5e4 T OsNetStartDhcp6
0001f3e0 T OsNetStopDhcp
0001f6dc T OsNetStopDhcp6
0003b3f0 T OsOnBase
0003561c T OsOpenFont
00032644 T OsPedAdminInjectTLK
00032528 T OsPedAdminLogon
000325bc T OsPedAdminModifyPwd
000326cc T OsPedAdminOutputLog
0003276c T OsPedAdminUartDownload
00032b0c T OsPedAes
00030390 T OsPedCancelPinEntry
0002fc34 T OsPedClose
00030828 T OsPedCustomKeypad
00033e34 T OsPedDFAuthDiver
00033e98 T OsPedDFAuthMerge
000315f8 T OsPedDeriveKey
000316e0 T OsPedDeriveKeyExt
00031104 T OsPedDes
00031a74 T OsPedDesDukpt
0003135c T OsPedDesExt
00030440 T OsPedEndPinEntry
00030254 T OsPedEraseKey
000301cc T OsPedEraseKeys
00033ae8 T OsPedExportIdKey
00032c9c T OsPedGenSM2Pair
00033a38 T OsPedGetIdKeyState
000314ac T OsPedGetKcv
00031d80 T OsPedGetKsnDukpt
00030ffc T OsPedGetMac
00031940 T OsPedGetMacDukpt
00031244 T OsPedGetMacExt
0003367c T OsPedGetMacSM
000309a4 T OsPedGetPinBlock
00030b5c T OsPedGetPinBlockJIS
0003381c T OsPedGetPinBlockSM4
000317a8 T OsPedGetPinDukpt
00033cd8 T OsPedGetPinLength
0002fce8 T OsPedGetVer
00033bac T OsPedIdKeyCalc
00031e44 T OsPedIncreaseKsnDukpt
000323a8 T OsPedMsrKeyEncDec
0002fa24 T OsPedOpen
0003050c T OsPedPinKeyNotify
0003220c T OsPedReadCipherRsaKey
00031ed8 T OsPedReadRsaKey
000320f4 T OsPedRsaRecover
00033d70 T OsPedSM2CertExport
00033290 T OsPedSM2Recover
00032f8c T OsPedSM2Sign
0003311c T OsPedSM2Verify
000333cc T OsPedSM3
000334e4 T OsPedSM4
000327c4 T OsPedSetAsteriskLayout
000302fc T OsPedSetFunctionKey
0003399c T OsPedSetIdKeyState
0002fd94 T OsPedSetInterval
00033d24 T OsPedSetOfflinePin
00030cd0 T OsPedSetPinBg
000328cc T OsPedSetPinIconLayout
00031bf8 T OsPedSymCalcDukpt
00030e98 T OsPedUpdatePinBlock
0002ffc8 T OsPedVerifyCipherPin
0002fe28 T OsPedVerifyPlainPin
00032a58 T OsPedWriteAesKey
000322c8 T OsPedWriteCipherRsaKey
00032e58 T OsPedWriteCipherSM2Key
00030548 T OsPedWriteKey
0003057c T OsPedWriteKeyEx
00030724 T OsPedWriteKeyVar
00031fe0 T OsPedWriteRsaKey
00032d80 T OsPedWriteSM2Key
0003066c T OsPedWriteTIK
0000d54c T OsPiccActive
0000d508 T OsPiccAntiSel
0000d160 T OsPiccApplePoll
0000d050 T OsPiccClose
0000d8a4 T OsPiccGetParam
0000e060 T OsPiccGetUserConfig
0000dc14 T OsPiccInitFelica
0000daa8 T OsPiccInitIso15693
0000d6f4 T OsPiccIsoCommand
0000d104 T OsPiccOffCarrier
0000cefc T OsPiccOpen
0000d4cc T OsPiccPoll
0000d490 T OsPiccPollForIdentity
0000d730 T OsPiccRemove
0000d0a8 T OsPiccResetCarrier
0000d9a4 T OsPiccSetParam
0000dfb4 T OsPiccSetUserConfig
0000d6a8 T OsPiccTransfer
0000f178 T OsPlayAudio
0000f1ec T OsPlayWave
0002ee78 T OsPmGetEvent
0002eeac T OsPmRequest
0002a630 T OsPortCheckTx
0002a0fc T OsPortClose
00029920 T OsPortOpen
0002a324 T OsPortRecv
0002a554 T OsPortReset
0002a1b8 T OsPortSend
0002dcb0 T OsPowerOff
00020380 T OsPppDirectCheck
0002031c T OsPppDirectLogin
000203f4 T OsPppDirectLogout
0001fdc8 T OsPppoeCheck
0001fd84 T OsPppoeLogin
0001fe3c T OsPppoeLogout
0001feb4 T OsPppomCheck
0001fe60 T OsPppomLogin
0001ff28 T OsPppomLogout
0001ab08 T OsPrnCheck
0001ac70 T OsPrnClose
0001aec8 T OsPrnClrBuf
00019cec T OsPrnFeed
0001ac08 T OsPrnGetDotLine
00019594 T OsPrnOpen
00019d18 T OsPrnPrintf
0001a368 T OsPrnPutImage
0001ac4c T OsPrnReset
00019c6c T OsPrnSelectFontSize
00019b0c T OsPrnSetDirection
000199c8 T OsPrnSetFont
00019c1c T OsPrnSetGray
00019b40 T OsPrnSetIndent
0001af5c T OsPrnSetParam
00019cb0 T OsPrnSetReversal
00019a48 T OsPrnSetSize
00019bc4 T OsPrnSetSpace
0001a50c T OsPrnStart
0003a7fc T OsProfileConfig
0000f8cc T OsRSA
0000f928 T OsRSAKeyGen
0002db7c T OsReboot
0003dc4c T OsRecordCheck
0003dc58 T OsRecordClose
0003dc28 T OsRecordOpen
0003dc34 T OsRecordStart
0003dc40 T OsRecordStop
0002b978 T OsRegGetValue
0002ba34 T OsRegSetValue
0002a720 T OsRunApp
0000fad4 T OsSHA
0002c58c T OsSaveCrashReport
00039a64 T OsScanClose
00039aec T OsScanDecodeBuf
00038fb8 T OsScanOpen
000399e0 T OsScanRead
00039a9c T OsScanSetParam
0002d414 T OsScrBrightness
0002d55c T OsScrGetSize
0002c658 T OsSetTime
0002cae4 T OsSleep
0002021c T OsSlipAttachEx
000202e0 T OsSlipDetachEx
0000f1bc T OsStopPlayAudio
0000f7e8 T OsStopPlayWave
0002e05c T OsSysSleep
0002dde4 T OsSysSleepEx
0002e064 T OsSysSleepTime
0002c380 T OsTerminalConsumeInfo
0002c9a0 T OsTimerCheck
0002c95c T OsTimerSet
0002d3d8 T OsUmount
0002b4c0 T OsUninstallFile
0002c38c T OsVerifySign
0002c47c T OsVerifySignExternal
0002e124 T OsWakeupSource
000200c4 T OsWifiCheck
0001ffd0 T OsWifiClose
00020194 T OsWifiCmd
0002005c T OsWifiConnect
00020098 T OsWifiDisconnect
0001ff54 T OsWifiOpen
00020028 T OsWifiScan
0001fff4 T OsWifiSwitchPower
000201e0 T OsWifiWpsConnect
0001fb88 T OsWlCheck
0001fa54 T OsWlGetSignal
0001fa0c T OsWlInit
0001fc28 T OsWlInitEx
0001f9ac T OsWlLock
0001fab4 T OsWlLogin
0001fb18 T OsWlLoginEx
0001fbfc T OsWlLogout
0001fcb0 T OsWlReAttachGprs
0001fd44 T OsWlSelSim
0001fa80 T OsWlSwitchPower
0001fd04 T OsWlSwitchSleep
0001f9e8 T OsWlUnLock
0002045c T PanTapClose
00020420 T PanTapOpen
000366b8 T PasswordCheckSDCard
000365c4 T PasswordClearSDCard
000364d0 T PasswordLockSDCard
0001df48 T emv_atr_parse
0000a8e4 T iso14443_3a_antisel
0000ac3c T iso14443_3a_halt
0000acc0 T iso14443_3a_rats
0000a5f4 T iso14443_3a_req
0000a7f0 T iso14443_3a_wup
0000b6f4 T iso14443_3b_attri
0000b844 T iso14443_3b_halt
0000b2bc T iso14443_3b_req
0000b4d0 T iso14443_3b_wup
0000bf68 T iso14443_4_s_request
0000b90c T iso14443_4_transfer
0001db2c T iso7816_atr_parse
0001d010 T iso7816_ocs
0001c354 T iso7816_pps
0001bf7c T iso7816_t0_exchange
0001d540 T iso7816_t1_exchange
0001d9e8 T iso7816_t1_ifsd_request
0001c7e0 T sci_close
0001cd54 T sci_cold_reset
0001cfcc T sci_detect
0001c718 T sci_get_dcb
0001c6f4 T sci_get_fd
0001c810 T sci_lock
0001c68c T sci_open
0001c880 T sci_powerdown
0001c878 T sci_powerup
0001c760 T sci_read
0001c73c T sci_set_dcb
0001c844 T sci_unlock
0001c8e8 T sci_warm_reset
0001c7a0 T sci_write
Code: Select all
richardgracik@Richards-MacBook-Pro-2021 pax-build % nm -D --defined-only ~/hax-pax/libxui.so
00021b64 T XuiBidiStrdup
00020258 T XuiButtonRegisterKey
00020194 T XuiButtonSetKey
00020020 T XuiButtonSetStat
00021cfc T XuiCameraCapture
00021cf4 T XuiCameraSetStat
00020e2c T XuiCanvasAnimation
0001f61c T XuiCanvasDrawImg
0001f6e4 T XuiCanvasDrawRect
0001f29c T XuiCanvasDrawText
0001f320 T XuiCanvasDrawTextEx
0001fa2c T XuiCanvasMoveToY
0001f530 T XuiCanvasSetBackground
00020cf8 T XuiCaptureCanvas
00020c4c T XuiCaptureScreen
0001f688 T XuiClearArea
00020ec0 T XuiClearGesture
0001fd3c T XuiClearKey
0001f088 T XuiClose
0001ff10 T XuiCreateButton
00021cec T XuiCreateCamera
0001f7f0 T XuiCreateCanvas
0001f900 T XuiCreateCanvasEx
0001f180 T XuiCreateFont
0001fd68 T XuiCreateGif
00021d04 T XuiCreateScaner
00020318 T XuiCreateSignatureBoard
0001f224 T XuiDestroyFont
0001fac4 T XuiDestroyWindow
000214a8 T XuiFrameBufferToImg
00020e58 T XuiGetGesture
000247cc T XuiGetHzString
0001fcf0 T XuiGetKey
00023cc4 T XuiGetString
0001fcbc T XuiHasKey
00020ee8 T XuiImgCompose
00020c18 T XuiImgFree
00020830 T XuiImgLoadFromFile
00020738 T XuiImgLoadFromMem
00021a60 T XuiImgResize
00020ab8 T XuiImgSaveToFile
00021284 T XuiImgToBgr24
00021628 T XuiImgToFrameBuffer
000211e8 T XuiImgToGray8
00021148 T XuiImgToRgba
00021674 T XuiImgTransform
0001ef30 T XuiIsRunning
0001ede4 T XuiOpen
0001f018 T XuiResume
0002103c T XuiRgbaToImg
0001f120 T XuiRootCanvas
00021d0c T XuiScanerDecode
00020e94 T XuiSetGestureRect
00021ca8 T XuiSetStatusbarIcon
0001fbec T XuiShowSoftKeyboard
0001fb64 T XuiShowWindow
000205c8 T XuiSigBoardImg
00020428 T XuiSigBoardSetStat
00020698 T XuiSigBoardSignData
0001f150 T XuiStatusbarCanvas
0001ef60 T XuiSuspend
0001f3a4 T XuiTextWidth
0001f460 T XuiTextWidthEx
0001edb8 T XuiTsUpdate