From 77a37381836de85306ad128def744d879c38f95a Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 24 Jul 2005 17:24:33 +0000 Subject: [PATCH] Initial import of xdadeveloper linexec sources --- Makefile | 114 +++++++++++ Makefile.project | 30 +++ ReadMe.txt | 77 ++++++++ ReadMe.wine | 81 ++++++++ StdAfx.cpp | 8 + StdAfx.h | 49 +++++ WhatsNew.txt | 2 + asm/asm-wince.asm | 99 ++++++++++ asm/asm-wince.asm.bz2 | Bin 0 -> 950 bytes asm/asm.asm | 103 ++++++++++ asm/asm.asm.bz2 | Bin 0 -> 902 bytes asm/asmstuff-wince.asm | 70 +++++++ asm/asmstuff-wince.asm.bz2 | Bin 0 -> 805 bytes asm/asmstuff.asm | 78 ++++++++ asm/asmstuff.asm.bz2 | Bin 0 -> 791 bytes asm/test123.asm | 7 + asm/test123.asm.bz2 | Bin 0 -> 156 bytes boot.cpp | 321 ++++++++++++++++++++++++++++++ booting.bmp | Bin 0 -> 232126 bytes config.h | 72 +++++++ gpio.cpp | 119 ++++++++++++ graphics.cpp | 101 ++++++++++ linexec.vcb | Bin 0 -> 58368 bytes linexec.vcl | 52 +++++ linexec.vco | Bin 0 -> 50688 bytes linexec.vcp | 278 ++++++++++++++++++++++++++ linexec.vcw | 32 +++ memory.cpp | 106 ++++++++++ newres.h | 41 ++++ resource.h | 27 +++ setup.h | 278 ++++++++++++++++++++++++++ tester1.aps | Bin 0 -> 95132 bytes tester1.cpp | 389 +++++++++++++++++++++++++++++++++++++ tester1.h | 71 +++++++ tester1.ico | Bin 0 -> 1078 bytes tester1.rc | 153 +++++++++++++++ uart.cpp | 65 +++++++ 37 files changed, 2823 insertions(+) create mode 100644 Makefile create mode 100644 Makefile.project create mode 100644 ReadMe.txt create mode 100644 ReadMe.wine create mode 100644 StdAfx.cpp create mode 100644 StdAfx.h create mode 100644 WhatsNew.txt create mode 100644 asm/asm-wince.asm create mode 100644 asm/asm-wince.asm.bz2 create mode 100644 asm/asm.asm create mode 100644 asm/asm.asm.bz2 create mode 100644 asm/asmstuff-wince.asm create mode 100644 asm/asmstuff-wince.asm.bz2 create mode 100644 asm/asmstuff.asm create mode 100644 asm/asmstuff.asm.bz2 create mode 100644 asm/test123.asm create mode 100644 asm/test123.asm.bz2 create mode 100644 boot.cpp create mode 100644 booting.bmp create mode 100644 config.h create mode 100644 gpio.cpp create mode 100644 graphics.cpp create mode 100644 linexec.vcb create mode 100644 linexec.vcl create mode 100644 linexec.vco create mode 100644 linexec.vcp create mode 100644 linexec.vcw create mode 100644 memory.cpp create mode 100644 newres.h create mode 100644 resource.h create mode 100644 setup.h create mode 100644 tester1.aps create mode 100644 tester1.cpp create mode 100644 tester1.h create mode 100644 tester1.ico create mode 100644 tester1.rc create mode 100644 uart.cpp diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..34412f2 --- /dev/null +++ b/Makefile @@ -0,0 +1,114 @@ +# Makefile for building PocketPC ARM binary from Linux using wine and EVC +# By pigeon +# Inspired by HRET written by anpaza +# Requires GNU Make, wine, and stuff from EVC, read ReadMe.wine + +#============================================== User-defined variables ======# +# The directory where your MSVC for StrongARM and the SDK is installed. +# You should set up WINE (see /etc/wine.reg) so that it "sees" this drive +#BASE=d:\\msvc-arm +BASE=c:\\evc + +#=========================================================== Compilers ======# +# Set some env vars for msvc to use +WINEPATH=$(BASE)\\ +WINE=wine --debugmsg fixme-console + +# Output directory +OUT=out/ + + +# Makefile.project contains sources, target name, and libs +include Makefile.project + +SUB1 = $(SRCS:.cpp=.obj) +SUB2 = $(SUB1:.asm=.obj) +SUB3 = $(SUB2:.rc=.res) +SUB4 = $(SUB3:%.obj=$(OUT)%.obj) +OBJS = $(SUB4:%.res=$(OUT)%-res.obj) + + +.SUFFIXES: +.SUFFIXES: .exe .obj .res .asm -res.obj + + +# You shouldn't need to change anything below. + +CXX=$(WINE) -- $(BASE)\\clarm.exe -c + +CXXFLAGS.DEF=-DARM -D_ARM_ -DUNICODE -D_UNICODE -DUNDER_CE=300 -D_WIN32_WCE=300 +CXXFLAGS.INC=-Iinclude -I$(INCLUDE) $(CFLAGS) + +#-Oxs +# Uncomment this for Dell Axim +#CXXFLAGS.DEF+=-DAXIM + +CXXFLAGS=-nologo -W3 -Zi -Od $(CXXFLAGS.DEF) $(CXXFLAGS.INC) + + +ASM=$(WINE) -- $(BASE)\\armasm.exe +#ASMFLAGS=-arch 4 -cpu StrongARM1 -32 + + +RC=$(WINE) -- $(BASE)\\rc.exe +#RCFLAGS=-r -l 0x409 $(CXXFLAGS.DEF) $(CXXFLAGS.INC) +RCFLAGS=$(CXXFLAGS.DEF) $(CXXFLAGS.INC) + + +CVTRES=$(WINE) -- $(BASE)\\cvtres.exe +CVTRESFLAGS=-machine:arm -windowsce + + +LD=$(WINE) -- $(BASE)\\link.exe + + + +# From EVC project settings +LDFLAGS= \ + -nologo \ + -base:"0x00010000" \ + -stack:0x10000,0x1000 \ + -entry:"WinMainCRTStartup" \ + -align:"4096" \ + -machine:ARM \ + -subsystem:windowsce,3.0 \ + -incremental:yes \ + -libpath:$(LIB) + + +#export MSC_CMD_FLAGS=/c + + +#============================================================= Targets ======# +all: $(OUT) $(OUT)$(TARGETBIN) + + +clean: + rm -rf $(OUT) + +#dep: +# makedep -r $(CXXFLAGS.DEF) $(CXXFLAGS.INC) -p'$$(OUT)' -o.obj src/*.cpp + + +$(OUT)$(TARGETBIN): $(OBJS) + + +#=============================================================== Rules ======# +$(OUT)%.obj: %.cpp + $(CXX) $(CXXFLAGS) -Fo$@ $< + +$(OUT)%.obj: %.asm + $(ASM) $(ASMFLAGS) -o $@ $< + +$(OUT)%.res: %.rc + $(RC) $(RCFLAGS) -fo $@ $< + +$(OUT)%-res.obj: $(OUT)%.res + $(CVTRES) $(CVTRESFLAGS) -out:$@ $< + +$(OUT)%.exe: + $(LD) $(LDFLAGS) -out:$@ $(^) $(LIBS) + +$(OUT): + mkdir $@ + diff --git a/Makefile.project b/Makefile.project new file mode 100644 index 0000000..c25460b --- /dev/null +++ b/Makefile.project @@ -0,0 +1,30 @@ +# Makefile.project +# You specify target name, source files, flags for compiling/building here + + +TARGETBIN = linexec.exe + +# TODO: I had to make sure all sources are at the current directory, fix this +# in the future maybe. +# (You may want to symlink asmstuff.asm and asm.asm) + +SRCS = \ + StdAfx.cpp \ + gpio.cpp \ + memory.cpp \ + uart.cpp \ + boot.cpp \ + graphics.cpp \ + tester1.cpp \ + asmstuff.asm \ + asm.asm \ + tester1.rc + +# xscale vs strongarm +#CFLAGS = -DSTRONGARM=1 +LIBS = aygshell.lib + +INCLUDE=/opt/toolchain/arm-wince-pe/include/ppc/ +LIB=/opt/toolchain/arm-wince-pe/lib/ppc/ + + diff --git a/ReadMe.txt b/ReadMe.txt new file mode 100644 index 0000000..c5d3c57 --- /dev/null +++ b/ReadMe.txt @@ -0,0 +1,77 @@ +Linux loader for Pocket PC + + +How to compile: + +1. Two asm files from asm directory has to be compiled with armasm.exe. This will create two +obj files, that should be copied into lib directory(and will be included in the project) +2. Compile & link project + +The c++ source file also contains some routines to read physical memory and to translate virtual mem to phys. +However, the translation is limited and not fully implemented. + +The booting of Linux begins IMMEDIATELLY after program is started. +zImage filename is "image2" (without "") +initrd filename is "initrd" + +If it for some reason freezes try removing pieces of code that write into Frame buffer on Axim +(this fb is beyond limits of physical memory and should not cause problems on IPAQ. adr=0x14042000) + +Limitations: There are some limitations of file sizes. + +If a screen with Hello World appears, there was a problem in booting. Check filenames. + +To make it work for SA11x0 you will have to change these lines in asm.asm: + ldr r5, =0xa0000100 + + ldr r7, =0xa0400000 + +with proper adresses and limits of memory( just change the "a" with "8" I think) +Also KERNELCOPY and INITRD macros have to be changed. + + +author: Demo; cooldemo@inmail.sk + + +================================================================================ + +Amendment by Pigeon: + +linexec has been changed a lot and therefore some stuff in the above readme +might not be true anymore. But anyway, here is how you use linexec: + + +To use linexec, you need 4 files. + +linexec config file: params + +Create a file called "params", and put it under either "\My Documents\", or +"\CF Card\". If you really care where and what this file is called, edit +tester1.cpp and look for load_boot() call. + +This params file specifies three lines of config for: +kernel image +initrd image +kernel args + +For example, my params looks like this: +\My Documents\zimage +\My Documents\initrd.gz +init=/linuxrc keepinitrd root=/dev/rd/0 + + +(This is what I actually have in my params file, but remember this might not +work for your kernel/device) + +(Also a note for the params file, seems that the code is only happy if the +file is in unix format, i.e. newline as \r, but not dos format) + + +And yes, if you see "Hello World", you've got something wrong. + + +Pigeon. + + + + diff --git a/ReadMe.wine b/ReadMe.wine new file mode 100644 index 0000000..32409f5 --- /dev/null +++ b/ReadMe.wine @@ -0,0 +1,81 @@ + +README for Makefile.wine + +With thanks to anpaza, I got this very basic Makefile to use wine and evc to +build pocketpc arm binary programs, so I don't have to boot into windows just +for building linexec. + + +So what do you need? +(Guns, lots of guns) +==================== + +- WINE + I didn't know if there's any specific version you'll need, my WINE just +work straight away. + + +- EVC + You can download that from Micro$oft site. Note, I need to build linexec +for my pocketpc 2002, and I needed EVC 3, and EVC 4 didn't work. For reference, +the file I downloaded is evt2002web_min.exe + + And then, you can unpack the EVC installation .exe with unzip. Then you can +start hunting for files you need. So far I figured files that you'll need are: + + Binary: + + (In WCE/wce300/BIN/) + ARMASM.EXE + C1XX_ARM.DLL + C2_ARM.EXE + CLARM.EXE + LINK.EXE + MSPDB60.DLL + + (In COMMON/EVC/BIN/) + RC.EXE + RCDLL.DLL + CVTRES.EXE + + + Headers: + + *.h in SDKs/PocketPC_2002_SDK/program files/pocket pc 2002/include/ + *.h in SDKs/PocketPC_2002_SDK/program files/pocket pc 2002/atl/include + *.h in SDKs/PocketPC_2002_SDK/program files/pocket pc 2002/atl/src + + + Libs: + *.lib in SDKs/PocketPC_2002_SDK/program files/pocket pc 2002/lib/arm/ + + + Just put them in a sane place for your own convenience. + + +The actual action +================= + +If you want to use these Makefile stuff for building other pocketpc app, have +a read on Makefile.project and Makefile.wine, you'll pretty much understand +what is going on. + +Set those path for your wine in the Makefile.wine, put in binary and sources +names/files in Makefile.project. + +In a nutshell: + +- tune BASE in Makefile.wine +- tune TARGETBIN SRCS CFLAGS LIBS INCLUDE LIB in Makefile.project + +By default all output files (obj/exe/res/etc) will be in the out/ directory. + +Finally, "make" will build them all, "make clean" will simply kill out/ + + + + + +pigeon + + diff --git a/StdAfx.cpp b/StdAfx.cpp new file mode 100644 index 0000000..e7b4a61 --- /dev/null +++ b/StdAfx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// tester1.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/StdAfx.h b/StdAfx.h new file mode 100644 index 0000000..fbbf3ee --- /dev/null +++ b/StdAfx.h @@ -0,0 +1,49 @@ +// stdafx.h : include file for standard system include files, + +// or project specific include files that are used frequently, but + +// are changed infrequently + +// + + + +#if !defined(AFX_STDAFX_H__E553AB80_24B1_4900_9879_D30DA5DD7F8A__INCLUDED_) + +#define AFX_STDAFX_H__E553AB80_24B1_4900_9879_D30DA5DD7F8A__INCLUDED_ + + + +#if _MSC_VER > 1000 + +#pragma once + +#endif // _MSC_VER > 1000 + + + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + + + +// Windows Header Files: + +#include + + +// Local Header Files + + + +// TODO: reference additional headers your program requires here + + + +//{{AFX_INSERT_LOCATION}} + +// Microsoft eMbedded Visual C++ will insert additional declarations immediately before the previous line. + + + +#endif // !defined(AFX_STDAFX_H__E553AB80_24B1_4900_9879_D30DA5DD7F8A__INCLUDED_) + diff --git a/WhatsNew.txt b/WhatsNew.txt new file mode 100644 index 0000000..a5e940a --- /dev/null +++ b/WhatsNew.txt @@ -0,0 +1,2 @@ +v1.3 It is no longer necessery to recompile *.asm files for different machine types, since machine number is passed through DRAMloader. Added boot logo. Parameters are read from \CF Card\params file, the format can be seen in boot.cpp file.v1.0 + initial release? \ No newline at end of file diff --git a/asm/asm-wince.asm b/asm/asm-wince.asm new file mode 100644 index 0000000..a34be6e --- /dev/null +++ b/asm/asm-wince.asm @@ -0,0 +1,99 @@ + TTL C:\pocket\test\asm.cpp + + AREA |.drectve|, DRECTVE + DCB "-defaultlib:coredll.lib " + DCB "-defaultlib:corelibc.lib " + + EXPORT |?do_it@@YAXXZ| ; do_it + AREA |.pdata|, PDATA +|$T222| DCD |?do_it@@YAXXZ| + DCD 0x40000100 + AREA |.text|, CODE +|?do_it@@YAXXZ| PROC ; do_it +|$M220| + + mcr p15, 0, r0, c7, c5, 0 ;/* invalidate i cache & BTB */ + ; CPWAIT r0 + mrc p15, 0, r0, c2, c0, 0 + mov r0, r0 + sub pc, pc, #4 + ; ldr r9, =0xa1300100 + + mov r9, r1 ; add r9, r1, #0x100 + ldr r5, =0xa0000100 ; ldr r5, =0xa0000100 + ldr r7, =0xa0100000 +label ldr r8, [r9] + str r8, [r5] + add r9, r9, #4 + add r5, r5, #4 + cmp r5, r7 + blt label + +crash b crash + + MOV r4, #0xA0000000 + add r2,r4,#0x8000 + + mov r11,r2 + ldr r10,=337 + +; mcr p15, 0, r0, c7, c10, 4 ;/* drain the write buffer*/ + +; CPWAIT r0 +; mrc p15, 0, r0, c2, c0, 0 +; mov r0, r0 +; sub pc, pc, #4 + + + mcr p15, 0, r0, c8, c7, 0x00 ;/* invalidate I+D TLB */ +; CPWAIT r0 + mrc p15, 0, r0, c2, c0, 0 + mov r0, r0 + sub pc, pc, #4 + +; //; they skipped this, unnecessary? seems like we need to do this + mcr p15, 0, r0, c7, c5, 0 ;/* invalidate i cache & BTB */ + +; S bit set, p and d bit set (no 26 bit mode) +; mov r3, #0x120 ; xscale says p needs to be 0 ??? +; mcr p15, 0, r3, c1, c0, 0 ;/* disable the MMU */ + +; CPWAIT r0 +; mrc p15, 0, r0, c2, c0, 0 +; mov r0, r0 +; sub pc, pc, #4 + + +; /*; make sure the pipeline is emptied*/ + mov r0,#0 + mov r0,r0 + mov r0,r0 + mov r0,r0 + +; /* zero PID in Process ID Virtual Address Map register. */ +; mov r0, #0 + mcr p15, 0, r0, c13, c0, 0 + + +; CPWAIT r0 + mrc p15, 0, r0, c2, c0, 0 + mov r0, r0 + sub pc, pc, #4 + +; ldr r5, =0xA00512F5 +; ldr r8, =0xefef0000 +; str r8, [r5] + + + mov r0, #0 + mov r1, r10 + ldr r2, [r2, #0] + mov r2, #0 + mov pc, r11 + + +|$M221| + + ENDP ; |?do_it@@YAXXZ|, do_it + + END diff --git a/asm/asm-wince.asm.bz2 b/asm/asm-wince.asm.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..247cdc3c0f91f7ec4c5e77f9747a80608ab695ae GIT binary patch literal 950 zcmV;n14;ZsT4*^jL0KkKSqTEzA^-q8-+*m0U4Q@j|0m!6zwh7lPy>vwY!uo<8-$?( zXicS0$xZ5+sPsXmhJ!|p00*c5^*uvs5h0+`GGq-j#L=dJ0BND1XaE2KA|gyor>G;; z+JG>CG@#bF%?Mnl8)sjpX=jcfdUSLPtWk=#261u+>_->M;OF+~rP zQsuP?vBX16X|&9F5bZ{?RzoF&8Cw|5ON$P0kO{>p>hCkLuJ)6%caMTF3v}_weR~`X z>zs+A+U&|jSz7~hks9;%b*orOEIY5oH9IWbWp8`h@u!)R1n|O(I|f^X3K~G{&Wo%uBIouAR#skX)U0sr5Vx|3 zP9a1)q~tY5REooR>|~XdG31QpsSu2rd%CdG2bu-x?Vcml!-qr?(6m#d&$D4P#o6HC zbGRLF+Hm4?PC84J_vZ*L|gLwh2wjYBX##E;} zr_Q-Erx)Q~4riHe$kQ8zo%5A8@5xv=OhaND&pMGP$5 zx|ffq29*Nm*}P&@^n+44%ONopL_UG-V(GFALdDThU-{_#GBN@-_c0iPFEipVQf^TK z+O8Dex^B)AG{N9Kb1=OLhI}AIA_4~Cxu5fwNTfoSLSU5;qHMIe8#BLajokg+ZI`w? z{Wi%<_u9-ia95j9PO}0VBJJ+B_y7O^ literal 0 HcmV?d00001 diff --git a/asm/asm.asm b/asm/asm.asm new file mode 100644 index 0000000..fa9a15c --- /dev/null +++ b/asm/asm.asm @@ -0,0 +1,103 @@ + TTL C:\pocket\test\asm.cpp + + AREA |.drectve|, DRECTVE + DCB "-defaultlib:coredll.lib " + DCB "-defaultlib:corelibc.lib " + + EXPORT |?do_it@@YAXXZ| ; do_it + AREA |.pdata|, PDATA +|$T222| DCD |?do_it@@YAXXZ| + DCD 0x40000100 + AREA |.text|, CODE +|?do_it@@YAXXZ| PROC ; do_it +|$M220| + + + mcr p15, 0, r0, c7, c5, 0 ;/* invalidate i cache & BTB */ + mrc p15, 0, r0, c2, c0, 0 + mov r0, r0 + sub pc, pc, #4 + + +; turn off LCD controller... +; I couldn't figure out how to use armasm.exe conditional with variables +; #if xscale +; ldr r9, =0x44000000 +; ldr r8, [r9] +; orr r8, r8, #0x400 +; str r8, [r9] + +; #elif strongarm + ldr r9, =0xb0100000 + ldr r8, [r9] + bic r8, r8, #1 + str r8, [r9] + +; turn off unused serial ports + + mov r8, #0 + ldr r9, =0x80010000 + str r8, [r9, #0xC] + ldr r9, =0x80050000 + str r8, [r9, #0xC] + +; #endif + + add r9, r1, #0x100 + +; #if xscale +; ldr r5, =0xa0000100 +; ldr r7, =0xa0400000 + +; #elif strongarm + ldr r5, =0xc0000100 + ldr r7, =0xc0400000 +; #endif + + +label ldr r8, [r9] + str r8, [r5] + add r9, r9, #4 + add r5, r5, #4 + cmp r5, r7 + blt label + +; #if xscale +; MOV r4, #0xA0000000 + +; #elif strongarm + MOV r4, #0xc0000000 +; #endif + + add r11,r4,#0x8000 + + mov r10,r2 ;machine number passed from DRAMloader + + mcr p15, 0, r0, c8, c7, 0x00 ;/* invalidate I+D TLB */ + mrc p15, 0, r0, c2, c0, 0 + mov r0, r0 + sub pc, pc, #4 + +; they skipped this, unnecessary? seems like we need to do this + + mcr p15, 0, r0, c7, c5, 0 ;/* invalidate i cache & BTB */ + + mov r0, #0 + mcr p15, 0, r0, c13, c0, 0 + mrc p15, 0, r0, c2, c0, 0 + mov r0, r0 + sub pc, pc, #4 + + mov r0, #0 + mov r1, r10 + ldr r2, [r2, #0] + mov r2, #0 + +; Jump into the kernel: + mov pc, r11 + + +|$M221| + ENDP ; |?do_it@@YAXXZ|, do_it + END + diff --git a/asm/asm.asm.bz2 b/asm/asm.asm.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ca734be1f4f76ba1e7d38e3c0b6d568aaa0c4d4f GIT binary patch literal 902 zcmV;119|*HT4*^jL0KkKSviR;`v3qpUx0ivU7!B?{x{Wrzwh7VPy=|CZ)u&KyA_5- zG8&ktrl*k9(@hva22BQmriPjaq-Z4&OhKs{X@~o--14pQFlO~Kq6HEjQ38o0aF*MUa1`tUiBQ;H=*(a%x0017KXnKG)paG{@ z6}0yOLTUxKyPam_y(Zfj&#MqeQ-rNFIOa86Qj49d+L5$yF(vx=Ct{m|K0O6UD`eJK z(XDh}og@pU^6i73Eb#>$OI|5bQO2VU1ecMOE=$z08Z-+lR5C42q0Mq(o?*QZY-~Y| zbcXON&osFlf?P^Q%3Pw^CBsR-!WaoK(il?q(uIgony|(|)Psc7q)Pm72C?$HEP5wT z93ZKQen_8h^4ikO=>V~it;7`srN;siZJ>A}4;Z!1WtA8|o)ERVqq>T`#*w9KNIL18 z{q+kEeuL0!o?U~FI-QmSLBP~w7{*wVfC`<^2aaMsD8UHQ*%S`Ysu03&8ar1T49_)| z6#!7Iq#&IVW*#%i0fap$;z(h#{j!mgnQgDCki2xPv!2RL*qNv03~7UT?wn*Xh`iE| zA-t522d5SlxRwaCph{5Z%34Xm8xLWINM<5TC4;_$oI#g~%K3dT96A9|V-9r7weKY4 z#u)`3D`AQd2fCU_n7x_XAf@p=Dwt4?O9k~BYs{j$@D$4$vM8^dYJY)bY_21$fL0d) zLJ|dy3CE5r>Zp7Pq+S{Dj8lO7GPLId^w;dwTNj`ig&7pY?79gjb5x>&Rb2@a0=m3q zS&)p+8o7ep;K6cb0QwsMM}`4lI2KbZWi!y>_ClPFb+Yu&iY$f%)7YzOs;{$hG~YPm zdru1NG}^q*aG4b?#4)mlVIdNsu29TlU5EgNyTe&DI!Gj*VQ5CZxo+J6zF*3|TO{;U zu6MA;qVhV?-q%eK`cm6imAtA=Mas>c4ohl^Os(?P(#xW<(z~HGbx~I!jMRdlz;y!* zD(%wU)?ACnb23nhIf4kSZsLTYIB?%g?Q%^Zl9MA+$WYXi3}nhTmP>M(w^&e&Tx~pk zroJt|fh5J6M1ri)YAQi4{z0J_L@r%@AhIKg+K6ijFy5lch_n4+&A>$~NNOfv@E|wg cGVOlJ>iXa=f<{^)wZFyOkxmpO4q{6_z@EyUo&W#< literal 0 HcmV?d00001 diff --git a/asm/asmstuff-wince.asm b/asm/asmstuff-wince.asm new file mode 100644 index 0000000..76095e1 --- /dev/null +++ b/asm/asmstuff-wince.asm @@ -0,0 +1,70 @@ + TTL C:\pocket\asmstuff\asmstuff.cpp + + AREA |.drectve|, DRECTVE + DCB "-defaultlib:coredll.lib " + DCB "-defaultlib:corelibc.lib " + + EXPORT |?read_mmu@@YAHXZ| ; read_mmu + AREA |.pdata|, PDATA +|$T229| DCD |?read_mmu@@YAHXZ| + DCD 0x40000200 + AREA |.text|, CODE +|?read_mmu@@YAHXZ| PROC ; read_mmu +|$M227| + mov r0, #0x33 ; 0x33 = 51 + mrc p15, 0, r0, c2, c0, 0 + mov pc, lr +|$M228| + ENDP ; |?read_mmu@@YAHXZ|, read_mmu + + EXPORT |?IntOff@@YAXXZ| ; IntOff + AREA |.pdata|, PDATA +|$T233| DCD |?IntOff@@YAXXZ| + DCD 0x40000100 + AREA |.text|, CODE +|?IntOff@@YAXXZ| PROC ; IntOff +; Line 9 + mrs r4,cpsr + orr r1,r4,#0xef + msr cpsr_c,r1 + mov pc, lr +|$M231| + mov pc, lr +|$M232| + ENDP ; |?IntOff@@YAXXZ|, IntOff + + + EXPORT |?DRAMloader@@YAXI@Z| ; DRAMloader + AREA |.pdata|, PDATA +|$T237| DCD |?DRAMloader@@YAXI@Z| + DCD 0x40000b04 + AREA |.text|, CODE +|?DRAMloader@@YAXI@Z| PROC ; DRAMloader + mov r12, sp + stmdb sp!, {r0} ; stmfd + stmdb sp!, {r12, lr} ; stmfd + sub sp, sp, #4 +|$M235| + ldr r3, [sp, #0xC] ; 0xC = 12 + str r3, [sp] + ldr r1, [sp] + ldr r0, =0x3fff + mcr p15, 0, r0, c7, c10, 4 ; Enable access + mrc p15, 0, r0, c2, c0, 0 + mov r0, r0 + mrc p15, 0, r3, c1, c0, 0 ;/* disable the MMU */ + and r3, r3, #0xfffffffe ; xscale says p needs to be 0 ??? + mov r3, #0x120 + mcr p15, 0, r3, c1, c0, 0 ;/* disable the MMU */ + ; CPWAIT r0 + mrc p15, 0, r0, c2, c0, 0 + mov r0, r0 + + mov pc,r1 ; GO GO GO GO GO + ; can't get here ??? -- jw, 20030517 + add sp, sp, #4 + ldmia sp, {sp, pc} ; ldmfd +|$M236| + ENDP ; |?DRAMloader@@YAXI@Z|, DRAMloader + + END \ No newline at end of file diff --git a/asm/asmstuff-wince.asm.bz2 b/asm/asmstuff-wince.asm.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cd6376aba84e483ac6e2ff48a22d8392a8524769 GIT binary patch literal 805 zcmV+=1KRvTT4*^jL0KkKSz~6({OUhDMDBnFB@$WYA;` zjWPy+Xa*7_Aek8iXp_o%o{UpuBLL7N(r9>)(|V?Qrjn-BsWYksK!wV-(_QDcX-eaQ z6}BBl!00>*q!%UQ@4_xkDl_K9ii=#B-}^B9lIg9s`+@-g1#G8#oO&|D6)7TyF$_!| zRKSr8QHB)g91%#2C>P96TrRkk`gC`!B}Jai^|-U3I`Dx3S;1df*WC&>PJT{LdgGbn z7wT}rFkuiA*^8V9daqcEW-Q#FJDgcm}4` z$ToA5F~-PbBcxyS79giXXF7w!K<=sAAyJjiXP|t=WxBHT9Qig^0^c`G%a+m%Adtse zFNCBjDN+_y5yzj@SNL}nNn~2x<9>Qb`tFLXm{^*!&xy>&$BM07mNG9GIoCX;MHWF) zl@huvDETv+smx?1HO>s~0`i7{;SQi*5c4IxyF;_BEU9}`z}!5Gf|LUl z87ETfYtE0Gv|v+-^cc~uG-tyf(D&AsAsltkcWYEK|th($}v7jr6R!p*gA z7VzsM1MLQl1m^e-+*W`d>8-v{&&}YzyIHEKm!~A3IG}^0iZob zO#z?=jEw<^8UO$TjF~hs7@9B$z)Tn;fHn!f*-8uNRpQncuH?>*`Y9)!Avj2OBOk|>eIbCfkU z+ial=eKALiySkuU#CYen+bd92B6TG;rr&hrNP}%9P}OE8!K#>GgYY1qLv3eANSQtzm zpyDe_KwPvf3!yBPiuBYaVoqyHv0SFF&vpc=3=<3fO}5^|C;-8OF(eYG;d1Gk=SjSz zP39542MC`+B4%^`p&~#@3P+E%72bVTL8X0vIs&?xGd{!T@YR8@QLwcvl*svwEK1+C z7i_ENr?jKIg|P)C?Xap&3fta*`&G6oU7D6=12mDy*}lQYw;EWp86#GKnH}5`DP?=e z)w!FC%3bG6GSD%Wlnc^?q%m-s((!q*Ah&y&DM+}(LR>nGFG~ubvOrY5iVhhX*Bz>N z88Zg<6*Cfq7nztdzlee`sE{@@8OnifK}F6Oc_iYIJTkD=-((i>?js}a5uywC85Za( z88OSql=Ccn3dNw1MIbihu1Z^rN*(`wsZY|8b}Gm_*MIr)lJ50e^sm!J)`JBYJQLnQ VJYa}|BM-;_7ji{7P>|CP+o{alanAq% literal 0 HcmV?d00001 diff --git a/asm/test123.asm b/asm/test123.asm new file mode 100644 index 0000000..2559552 --- /dev/null +++ b/asm/test123.asm @@ -0,0 +1,7 @@ +loopl ldr r5, =0xA0051000 ; right before we jump in + ldr r6, =0xA0051100 + ldr r8, =0xFE00FE00 + str r8, [r5] + add r5, r5, #0x04 + cmp r5,r6 + blt loopl \ No newline at end of file diff --git a/asm/test123.asm.bz2 b/asm/test123.asm.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..84ee2b8af3bc2fdea461df3c39e8622f955c0371 GIT binary patch literal 156 zcmV;N0Av3`T4*^jL0KkKS>vIZng9SqUw|MoNCam}BLDyjKlk3iAOLb2lSim#pa1{? zwFIFPMAOtgLFznFpaVsErT%_ +//#include +#include +#include "setup.h" + + +#define BOOT_LOGO_PATH "\\My Documents\\booting.bmp" +#define BOOT_LOGO_PATH_CF "\\CF Card\\booting.bmp" +#define BOOT_LOGO_DONE_PATH "\\My Documents\\done.bmp" +#define BOOT_LOGO_DONE_PATH_CF "\\CF Card\\done.bmp" +#define DONE1_X 100 +#define DONE1_Y 100 +#define DONE2_X 100 +#define DONE2_Y 130 + + +void setup_linux_params(long bootimg_dest, UINT32 initrd,UINT32 initrdl, long dram_size, const char *cmdline, char*base) +{ + int rootdev = 0x00ff; + struct tag *tag; + int newcmdlinelen = 0; + char *newcmdline = NULL; + + + tag = (struct tag *)(base+0x100); + + tag->hdr.tag = ATAG_CORE; + tag->hdr.size = tag_size(tag_core); + tag->u.core.flags =0; + tag->u.core.pagesize = 0x00001000; + tag->u.core.rootdev = rootdev; + tag = tag_next(tag); + + // now the cmdline tag + tag->hdr.tag = ATAG_CMDLINE; + // must be at least +3!! 1 for the null and 2 for the ??? + tag->hdr.size = (strlen(cmdline) + 3 + sizeof(struct tag_header)) >> 2; + //tag->hdr.size = (strlen(cmdline) + 10 + sizeof(struct tag_header)) >> 2; + strcpy(tag->u.cmdline.cmdline,cmdline); + tag = tag_next(tag); + + + // now the mem32 tag + tag->hdr.tag = ATAG_MEM; + tag->hdr.size = tag_size(tag_mem32); + tag->u.mem.size = dram_size; + tag->u.mem.start = MEM_START; + tag = tag_next(tag); + + + /* and now the initrd tag */ + if (initrdl) { + tag->hdr.tag = INITRD_TAG; + tag->hdr.size = tag_size(tag_initrd); + tag->u.initrd.start = initrd; + tag->u.initrd.size = initrdl; + tag = tag_next(tag); + } + + tag->hdr.tag = ATAG_VIDEOTEXT; + tag->hdr.size = tag_size(tag_videotext); + tag->u.videotext.video_lines = 40; + tag->u.videotext.video_cols = 30; + tag = tag_next(tag); + + // now the NULL tag + tag->hdr.tag = ATAG_NONE; + tag->hdr.size = 0; +} + + + + + +/* loading process: +function do_it is loaded onto address KERNELCOPY along with parameters(offset=0x100) and +kernel image(offset=0x8000). Afterwards DRAMloader is called; it disables MMU and +jumps onto KERNELCOPY. Function do_it then copies kernel image to its proper address(0xA0008000) +and calls it. +Initrd is loaded onto address INITRD and the address is passed to kernel via ATAG +*/ + + +// This resets some devices +void ResetDevices() +{ +#ifndef STRONGARM + WritePhysical(0x4050000C,0); // Reset AC97 + WritePhysical(0x48000014,0); // Reset PCMCIA + for(int i=0;i<0x3C;i+=4) + WritePhysical(0x40000000,8); // Set DMAs to Stop state + WritePhysical(0x400000F0,0); // DMA do not gen interrupt + SetGPIOio(28,0); // AC97 + SetGPIOio(29,0); // AC97/I2S + SetGPIOio(30,0); // I2S/AC97 + SetGPIOio(31,0); // I2S/AC97 + SetGPIOio(32,0); // AC97/I2S + SetGPIOalt(28,0); + SetGPIOalt(29,0); + SetGPIOalt(30,0); + SetGPIOalt(31,0); + SetGPIOalt(32,0); +#endif +} + + + + +void mymemcpy(char* a, char* b, int size); + +void boot_linux(char *filename,char* initrd,char *param) +{ + FILE *fd=fopen(filename,"rb"); + int ret; + + FILE* fd1; + + long initrdl; + long len; + +#ifndef STRONGARM + Image image; + Image image_done; +#endif + + + + if(!fd) + { + FILE *logfd=fopen("\\bootlog.txt","a"); + fprintf(logfd, "Booting: ***FAILED TO OPEN %s***\n",filename); + fclose(logfd); + return; + } + + fseek(fd,0,SEEK_END); + len=ftell(fd); + fseek(fd,0,SEEK_SET); + + fd1=fopen(initrd,"rb"); + initrdl=0; + if(fd1) + { + fseek(fd1,0,SEEK_END); + initrdl=ftell(fd1); + fseek(fd1,0,SEEK_SET); + } + FILE *logfd=fopen("\\bootlog.txt","a"); + fprintf(logfd, "Booting: Images."); + fclose(logfd); + + +#ifndef STRONGARM + /* i haven't ported this to strongarm, hope this is not important to + * anyone */ + init_fb(); + try_fb(); + + image=ReadBMP(BOOT_LOGO_PATH); + if (!image.p) image=ReadBMP(BOOT_LOGO_PATH_CF); + image_done=ReadBMP(BOOT_LOGO_DONE_PATH); + if (!image_done.p) image_done = ReadBMP(BOOT_LOGO_DONE_PATH_CF); + if (image.p) ShowImage(image.p,image.x,image.y); +#endif + + logfd=fopen("\\bootlog.txt","a"); + fprintf(logfd, "Booting: entering supervisor mode."); + fclose(logfd); + + /* now becoming supervisor. */ + SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL); +// CeSetThreadQuantum(GetCurrentThread(),0); + SetKMode(1); + SetProcPermissions(0xffffffff); + /* rooooooooot has landed! */ + + logfd=fopen("\\bootlog.txt","a"); + fprintf(logfd, "Booting: supervisor mode."); + fclose(logfd); + + void *mmu=(void*)read_mmu(); + UINT32 *data=NULL,*lcd=NULL,*intr=NULL,*_mmu=NULL; + char *watch=NULL,*krnl=NULL; + + + IntOff(); + + + char *kernel_copy2=(char*)VirtualAlloc((void*)0x0,0x8000+len, MEM_RESERVE|MEM_TOP_DOWN,PAGE_READWRITE); + ret=VirtualCopy((void*)kernel_copy2,(void *) (KERNELCOPY/256), 0x8000+len, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + + char *initrd_copy2; + + + if(fd1) + { + initrd_copy2=(char*)VirtualAlloc((void*)0x0,initrdl, MEM_RESERVE|MEM_TOP_DOWN,PAGE_READWRITE); + ret=VirtualCopy((void*)initrd_copy2,(void *) (INITRD/256), initrdl, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + } + + void(*relmemcpy)(char*,char*,int); + relmemcpy=(void (__cdecl *)(char *,char *,int))VirtualAlloc((void*)0x0, 1024, MEM_RESERVE|MEM_TOP_DOWN,PAGE_READWRITE); + + /* ask joshua */ +#ifndef STRONGARM + ret=VirtualCopy((void*)relmemcpy,(void *) (0xa0001000/256), 1024, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); +#else + ret=VirtualCopy((void*)relmemcpy,(void *) (0xc0001000/256), 1024, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); +#endif + + if(!kernel_copy2) return; + + + UINT32 phys_addr; + phys_addr=KERNELCOPY; + + + char *data1,*data2; + + data1=(char*)malloc(len); + + char *initrd1=NULL; + + if(fd1) initrd1=(char*)malloc(initrdl); + + if(!data1) return; + + if(!ret) return; + + data2= (char*)do_it; + + + fread(data1,len,1,fd); + fclose(fd); + + + if(fd1) + { + fread(initrd1,initrdl,1,fd1); + fclose(fd1); + } + + // Do not block interrupts before they are needed anymore + // Like reading the SD card. + intr=(UINT32*)VirtualAlloc((void*)0x0,0x100, MEM_RESERVE,PAGE_READWRITE); + + // Interrupt control registers + ret=VirtualCopy((void*)intr,(void *) (ICIP/256), 0x100, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + + intr[1]=0; + +// ResetDevices(); + + UART_puts("LinExec: Passing the point of no return.. Now.\r\n"); + + UINT32 crc=0; + + setup_linux_params(BOOTIMG, INITRD,initrdl, MEM_SIZE*1024*1024 , param,kernel_copy2); + + memcpy(relmemcpy,mymemcpy,1024); + relmemcpy(kernel_copy2,data2,0x100); + + if(fd1) + relmemcpy(initrd_copy2,initrd1,initrdl); + + relmemcpy(kernel_copy2+0x8000,data1,len); + + UART_puts("LinExec: Entering DRAMloader...\r\n"); + + DRAMloader(phys_addr, MACH_TYPE); +} + +void mymemcpy(char* a, char* b, int size) +{ + while (size) + { + *a=*b; + size--; + a++; b++; + }; +}; + +/* + Loads parameters from file given. + The file has to be: + kernel image + initrd + kernel cmdline +*/ + +void load_boot(char *ParamFile) +{ + FILE *stream; + + UART_setup(); + + stream=fopen(ParamFile,"r"); + if(!stream) { + FILE *logfd=fopen("\\bootlog.txt","a"); + fprintf(logfd, "Booting: ***FAILED TO OPEN %s***\n",ParamFile); + fclose(logfd); + return; + } + char cmd[200],image[50],initrd[50]; + + fgets(image,50,stream); + image[strlen(image)-1]=0; // remove \n from the end + + fgets(initrd,50,stream); + initrd[strlen(initrd)-1]=0; + + fgets(cmd,200,stream); + cmd[strlen(cmd)-1]=0; + + fclose(stream); + + UART_puts("LinExec: Beginning boot_linux.\r\n"); + boot_linux(image,initrd,cmd); +} diff --git a/booting.bmp b/booting.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ec4c57a47881a445d6a8c528e9a784bc9984fccd GIT binary patch literal 232126 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 +//#include +#include +#include "setup.h" + +#define GPIO 0x40E00000 +#define GPIO_MEDIAQ 0x14040000 +#define MQ_OFF 0x008 + +int GPIOalt[81],GPIOio[81],GPIOst[81],mediaq; + +void SetGPIOio(int i,int io) // set GPIO as io == 1 output io == 0 input +{ + UINT32 *gpio=(UINT32*)VirtualAlloc((void*)0x0,0x100, MEM_RESERVE,PAGE_READWRITE); + VirtualCopy((void*)gpio,(void *) (GPIO/256), 0x100, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + if(io) + gpio[0xC/4 + (i/32)] = gpio[0xC/4 + (i/32)] | (1<<(i%32)); + else + gpio[0xC/4 + (i/32)] = gpio[0xC/4 + (i/32)] & (~(1<<(i%32))); + VirtualFree(gpio,0,MEM_RELEASE); +} + +void SetGPIOalt(int i,int io) // set GPIO as io == 1 output io == 0 input +{ + UINT32 *gpio=(UINT32*)VirtualAlloc((void*)0x0,0x100, MEM_RESERVE,PAGE_READWRITE); + VirtualCopy((void*)gpio,(void *) (GPIO/256), 0x100, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + UINT32 w = gpio[0x54/4 + (i/16)] & (~(3<<((i%16)*2))); + gpio[0x54/4 + (i/16)] = w | (io<<((i%16)*2)); + VirtualFree(gpio,0,MEM_RELEASE); +} + +void writeGPIOConfig(FILE*fd, UINT32 *gpio) +{ + for(int i=0;i<81;i++) + { + UINT32 adr=i/16; + fprintf(fd,"GPIO #%d=%c, %d\n",i,(gpio[0xC/4+(adr/2)]>>(i%32))&0x1?'O':'I',(gpio[0x54/4+adr]>>((i%16)*2))&0x3); + GPIOalt[i]=(gpio[0x54/4+adr]>>((i%16)*2))&0x3; + GPIOio[i]=(gpio[0xC/4+(adr/2)]>>(i%32))&0x1; + + } +} + +inline int readGPIOstate(UINT32 *gpio,int i) +{ + return (gpio[(i/32)]>>(i%32))&0x1; +} + +inline int readGPIOalt(UINT32 *gpio,int i) +{ + return (gpio[0x54/4+i/16]>>((i%16)*2))&0x3; +} + +void Gpio() +{ + SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_BELOW_NORMAL); +// SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL); + FILE *fd=fopen("\\loggerG.txt","w"); + SYSTEMTIME time; + + fprintf(fd,"MCMEM0=0x%x\n",ReadPhysical(0x48000028)); + fprintf(fd,"MCMEM1=x%x\n",ReadPhysical(0x4800002C)); + fprintf(fd,"MCATT0=0x%x\n",ReadPhysical(0x48000030)); + fprintf(fd,"MCATT1=0x%x\n",ReadPhysical(0x48000034)); + fprintf(fd,"MCIO0=0x%x\n",ReadPhysical(0x48000038)); + fprintf(fd,"MCIO1=0x%x\n",ReadPhysical(0x4800003C)); + + for(int q=0;q<16;q++) + fprintf(fd,"DMA #%d=0x%x\tDCMD=0x%x\tDSADR=0x%x\tDTADR=0x%x\n",q,ReadPhysical(0x40000000+q*4),ReadPhysical(0x40000200+q*0x10+0xC),ReadPhysical(0x40000200+q*0x10+0x4),ReadPhysical(0x40000200+q*0x10+0x8)); + GetSystemTime(&time); + int sec=time.wSecond,quit=0; + sec+=4; + if(sec>60) sec-=60; + UINT32 *gpio=(UINT32*)VirtualAlloc((void*)0x0,0x100, MEM_RESERVE,PAGE_READWRITE); + VirtualCopy((void*)gpio,(void *) (GPIO/256), 0x100, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + UINT32 *gpio1=(UINT32*)VirtualAlloc((void*)0x0,0x1000, MEM_RESERVE,PAGE_READWRITE); + VirtualCopy((void*)gpio1,(void *) (GPIO_MEDIAQ/256), 0x1000, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + writeGPIOConfig(fd,gpio); + + for(int i=0;i<81;i++) + { + GPIOst[i]=-1; + } + int state,alt; + while(sec>time.wSecond) + { + GetSystemTime(&time); + if(gpio1[MQ_OFF/4]!=(UINT32)mediaq) + { + mediaq=gpio1[MQ_OFF/4]; + fprintf(fd,"MQ_GPIO=0x%x\n",mediaq); + } + for(i=0;i<81;i++) + { +/* if(GPIOio[i]) continue;*/ + if(GPIOalt[i]) continue; +// if(i==16) continue; +// if(i==28) continue; +// if(i==29) continue; +// if(i==30) continue; +// if(i==31) continue; + state=readGPIOstate(gpio,i); + alt=readGPIOalt(gpio,i); + if(GPIOst[i]==state&&GPIOalt[i]==alt) continue; + GPIOst[i]=state; + if(GPIOalt[i]==alt) + fprintf(fd,"#%d: %d\n",i,state); + else + { + GPIOalt[i]=alt; + fprintf(fd,"#%d: %d\tf=%d\n",i,state,alt); + } + + } + } + fclose(fd); +} diff --git a/graphics.cpp b/graphics.cpp new file mode 100644 index 0000000..9a63a0c --- /dev/null +++ b/graphics.cpp @@ -0,0 +1,101 @@ +#include "stdafx.h" +#include "tester1.h" +#include +//#include +#include +#include "setup.h" + + +/* TO DO: Detect whether we're running on an AXIM or an iPAQ at runtime, + and set accordingly. */ + +#ifdef AXIM +# define FB_ADR 0x14042000 +#else +# define FB_ADR 0xA0051000 +#endif + + + +#define SET 0xffffffff +#define LCD_X_RES 240 +#define LCD_Y_RES 320 +UINT16 *fb; + + +void init_fb() +{ + fb=(UINT16*)VirtualAlloc((void*)0x0,LCD_X_RES*LCD_Y_RES*2, MEM_RESERVE,PAGE_READWRITE); + VirtualCopy((void*)fb,(void *) (FB_ADR/256),LCD_X_RES*LCD_Y_RES*2, PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); +} + +void try_fb() +{ +// fb[1]=SET; +} + +Image ReadBMP(char FileName[30]) +{ + FILE *stream; + char buff[29]; + UINT32 x,y; + unsigned char red,green,blue; + unsigned long offset; + UINT16 *p,c; + Image image={NULL}; + stream=fopen(FileName,"rb"); + if(!stream) return image; + fread(buff,26,1,stream); + + offset=(unsigned char)buff[13]*16777216+(unsigned char)buff[12]*65536+(unsigned char)buff[11]*256+(unsigned char)buff[10]; + x=(unsigned char)buff[21]*256*256*256+(unsigned char)buff[20]*256*256+(unsigned char)buff[19]*256+(unsigned char)buff[18]; + y=(unsigned char)buff[25]*256*256*256+(unsigned char)buff[24]*256*256+(unsigned char)buff[23]*256+(unsigned char)buff[22]; +// offset=54; + UINT32 imgx=x,imgy=y; + if(x<32) x=32; + if(y<32) y=32; + p=image.p=(UINT16*)malloc(x*y*2); + if(!image.p) return(image); + fseek(stream,offset,SEEK_SET); + p+=(x*y+x); + +for(UINT32 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 literal 0 HcmV?d00001 diff --git a/linexec.vcl b/linexec.vcl new file mode 100644 index 0000000..b68826a --- /dev/null +++ b/linexec.vcl @@ -0,0 +1,52 @@ + + +
+

Build Log

+

+--------------------Configuration: linexec - Win32 (WCE ARM) Release-------------------- +

+

Command Lines

+Creating temporary file "C:\DOCUME~1\YUUSEI~1\LOCALS~1\Temp\RSP3.tmp" with contents +[ +/nologo /W3 /D _WIN32_WCE=211 /D "WIN32_PLATFORM_HPCPRO" /D "ARM" /D "_ARM_" /D UNDER_CE=211 /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /FR"ARMRel/" /Fp"ARMRel/linexec.pch" /Yu"stdafx.h" /Fo"ARMRel/" /Oxs /MC /c +"E:\Windows CE Tools\linexec-xda-1.0\boot.cpp" +"E:\Windows CE Tools\linexec-xda-1.0\gpio.cpp" +"E:\Windows CE Tools\linexec-xda-1.0\graphics.cpp" +"E:\Windows CE Tools\linexec-xda-1.0\memory.cpp" +"E:\Windows CE Tools\linexec-xda-1.0\tester1.cpp" +"E:\Windows CE Tools\linexec-xda-1.0\uart.cpp" +] +Creating command line "clarm.exe @C:\DOCUME~1\YUUSEI~1\LOCALS~1\Temp\RSP3.tmp" +Creating temporary file "C:\DOCUME~1\YUUSEI~1\LOCALS~1\Temp\RSP4.tmp" with contents +[ +commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /incremental:no /pdb:"ARMRel/linexec.pdb" /nodefaultlib:"libc.lib /nodefaultlib:libcd.lib /nodefaultlib:libcmt.lib /nodefaultlib:libcmtd.lib /nodefaultlib:msvcrt.lib /nodefaultlib:msvcrtd.lib /nodefaultlib:oldnames.lib" /out:"ARMRel/linexec.exe" /subsystem:windowsce,2.11 /align:"4096" /MACHINE:ARM +".\ARMRel\boot.obj" +".\ARMRel\gpio.obj" +".\ARMRel\graphics.obj" +".\ARMRel\memory.obj" +".\ARMRel\StdAfx.obj" +".\ARMRel\tester1.obj" +".\ARMRel\uart.obj" +".\ARMRel\tester1.res" +".\ARMRel\asm.obj" +".\ARMRel\asmstuff.obj" +] +Creating command line "link.exe @C:\DOCUME~1\YUUSEI~1\LOCALS~1\Temp\RSP4.tmp" +

Output Window

+Compiling... +boot.cpp +gpio.cpp +graphics.cpp +memory.cpp +tester1.cpp +uart.cpp +Generating Code... +Linking... + + + +

Results

+linexec.exe - 0 error(s), 0 warning(s) +
+ + diff --git a/linexec.vco b/linexec.vco new file mode 100644 index 0000000000000000000000000000000000000000..569b44cc434c7167e82f92169b6dc6eceff57442 GIT binary patch literal 50688 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 literal 0 HcmV?d00001 diff --git a/linexec.vcp b/linexec.vcp new file mode 100644 index 0000000..ebaa96d --- /dev/null +++ b/linexec.vcp @@ -0,0 +1,278 @@ +# Microsoft eMbedded Visual Tools Project File - Name="linexec" - Package Owner=<4> +# Microsoft eMbedded Visual Tools Generated Build File, Format Version 6.02 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (WCE ARM) Application" 0x8501 + +CFG=linexec - Win32 (WCE ARM) Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "linexec.vcn". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "linexec.vcn" CFG="linexec - Win32 (WCE ARM) Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "linexec - Win32 (WCE ARM) Release" (based on "Win32 (WCE ARM) Application") +!MESSAGE "linexec - Win32 (WCE ARM) Debug" (based on "Win32 (WCE ARM) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "linexec" +# PROP Scc_LocalPath "." +# PROP ATL_Project 2 +CPP=clarm.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "linexec - Win32 (WCE ARM) Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ARMRel" +# PROP BASE Intermediate_Dir "ARMRel" +# PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" +# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "ARMRel" +# PROP Intermediate_Dir "ARMRel" +# PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" +# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r +# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r +# ADD BASE CPP /nologo /W3 /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /Yu"stdafx.h" /Oxs /M$(CECrtMT) /c +# ADD CPP /nologo /W3 /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /FR /Yu"stdafx.h" /Oxs /M$(CECrtMT) /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 commctrl.lib coredll.lib aygshell.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM +# ADD LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM + +!ELSEIF "$(CFG)" == "linexec - Win32 (WCE ARM) Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "ARMDbg" +# PROP BASE Intermediate_Dir "ARMDbg" +# PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" +# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "ARMDbg" +# PROP Intermediate_Dir "ARMDbg" +# PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" +# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r +# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r +# ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /Yu"stdafx.h" /M$(CECrtMTDebug) /c +# ADD CPP /nologo /W4 /Od /D "DEBUG" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /FR /Yu"stdafx.h" /M$(CECrtMTDebug) /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 commctrl.lib coredll.lib aygshell.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM +# ADD LINK32 commctrl.lib coredllprof.lib aygshell.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM + +!ENDIF + +# Begin Target + +# Name "linexec - Win32 (WCE ARM) Release" +# Name "linexec - Win32 (WCE ARM) Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\asm\asm.asm + +!IF "$(CFG)" == "linexec - Win32 (WCE ARM) Release" + +# Begin Custom Build +OutDir=.\ARMRel +InputPath=.\asm\asm.asm + +"$(OUTDIR)\asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + armasm.exe $(InputPath) $(OUTDIR)\asm.obj + +# End Custom Build + +!ELSEIF "$(CFG)" == "linexec - Win32 (WCE ARM) Debug" + +# Begin Custom Build +IntDir=.\ARMDbg +InputPath=.\asm\asm.asm +InputName=asm + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + armasm -I $(InputPath) -list $(IntDir)\$(InputName).lst -CPU StrongARM1 -o $(IntDir)\$(InputName).obj .\asm\$(InputName).asm + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\asm\asmstuff.asm + +!IF "$(CFG)" == "linexec - Win32 (WCE ARM) Release" + +# Begin Custom Build +OutDir=.\ARMRel +InputPath=.\asm\asmstuff.asm + +"$(OUTDIR)\asmstuff.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + armasm.exe $(InputPath) $(OUTDIR)\asmstuff.obj + +# End Custom Build + +!ELSEIF "$(CFG)" == "linexec - Win32 (WCE ARM) Debug" + +# Begin Custom Build +IntDir=.\ARMDbg +InputPath=.\asm\asmstuff.asm +InputName=asmstuff + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + armasm -I $(InputPath) -list $(IntDir)\$(InputName).lst -CPU StrongARM1 -o $(IntDir)\$(InputName).obj .\asm\$(InputName).asm + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\boot.cpp +DEP_CPP_BOOT_=\ + ".\config.h"\ + ".\setup.h"\ + ".\StdAfx.h"\ + ".\tester1.h"\ + {$(INCLUDE)}"sipapi.h"\ + +# End Source File +# Begin Source File + +SOURCE=.\gpio.cpp +DEP_CPP_GPIO_=\ + ".\config.h"\ + ".\setup.h"\ + ".\StdAfx.h"\ + ".\tester1.h"\ + {$(INCLUDE)}"sipapi.h"\ + +# End Source File +# Begin Source File + +SOURCE=.\graphics.cpp +DEP_CPP_GRAPH=\ + ".\config.h"\ + ".\setup.h"\ + ".\StdAfx.h"\ + ".\tester1.h"\ + {$(INCLUDE)}"sipapi.h"\ + +# End Source File +# Begin Source File + +SOURCE=.\memory.cpp +DEP_CPP_MEMOR=\ + ".\config.h"\ + ".\setup.h"\ + ".\StdAfx.h"\ + ".\tester1.h"\ + {$(INCLUDE)}"sipapi.h"\ + +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +DEP_CPP_STDAF=\ + ".\StdAfx.h"\ + +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\tester1.cpp +DEP_CPP_TESTE=\ + ".\config.h"\ + ".\setup.h"\ + ".\StdAfx.h"\ + ".\tester1.h"\ + {$(INCLUDE)}"sipapi.h"\ + +# End Source File +# Begin Source File + +SOURCE=.\tester1.rc +# End Source File +# Begin Source File + +SOURCE=.\uart.cpp +DEP_CPP_UART_=\ + ".\config.h"\ + ".\setup.h"\ + ".\StdAfx.h"\ + ".\tester1.h"\ + {$(INCLUDE)}"sipapi.h"\ + +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\config.h +# End Source File +# Begin Source File + +SOURCE=.\newres.h +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\tester1.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\tester1.ico +# End Source File +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/linexec.vcw b/linexec.vcw new file mode 100644 index 0000000..28bb66c --- /dev/null +++ b/linexec.vcw @@ -0,0 +1,32 @@ +Microsoft eMbedded Visual Tools Workspace File, Format Version 3.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "linexec"=.\linexec.vcp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + tester1 + . + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### \ No newline at end of file diff --git a/memory.cpp b/memory.cpp new file mode 100644 index 0000000..96ff433 --- /dev/null +++ b/memory.cpp @@ -0,0 +1,106 @@ +#include "stdafx.h" +#include "tester1.h" +#include +//#include +#include +#include "setup.h" + +UINT32 ReadPhysical(UINT32 adr) +{ + UINT32 base= adr&0xffff0000; + UINT32 offset=adr&0x0000ffff; + UINT32 *p=(UINT32*)VirtualAlloc(0,0x10000,MEM_RESERVE,PAGE_READWRITE); + if(!p) return 0xFFFFFFFF; + if(!VirtualCopy((void*)p,(void*)(base/256),0x10000,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL)) return 0xFFFFFFFF; + UINT32 val=p[offset/4]; + VirtualFree(p,0,MEM_RELEASE); + return val; +} + +void WritePhysical(UINT32 adr,UINT32 val) +{ + UINT32 base= adr&0xffff0000; + UINT32 offset=adr&0x0000ffff; + UINT32 *p=(UINT32*)VirtualAlloc(0,0x10000,MEM_RESERVE,PAGE_READWRITE); + VirtualCopy((void*)p,(void*)(base/256),0x10000,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + p[offset/4]=val; + VirtualFree(p,0,MEM_RELEASE); +} + +UINT32 VirtualToPhysical(UINT32 Virtual) +{ + FILE *log=fopen("\\logger1.txt","w"); + + fprintf(log,"virtual: 0x%lx\n",Virtual); + UINT32 mmu=(UINT32)read_mmu(); +// mmu=0xa0000000; + fprintf(log,"mmu: 0x%lx \n",mmu); + + UINT32 AdrFirstLevDesc=(mmu&0xffffc000)+((Virtual>>18)&0xfffffffc); + fprintf(log,"AdrFirstLevDesc: 0x%lx \n",AdrFirstLevDesc); + + UINT32 FirstLevDesc=ReadPhysical(AdrFirstLevDesc); + fprintf(log,"FirstLevDesc: 0x%lx \n",FirstLevDesc); + + + if(0) + { + fprintf(log,"Page\n"); + UINT32 PhysAddr=(FirstLevDesc&0xfff00000)+(Virtual&0xfffff); + fprintf(log,"Physical address: 0x%lx \n",PhysAddr); + fclose(log); + return PhysAddr; + } + + if(FirstLevDesc&0x3==3) // tiny page + { + fprintf(log,"Tiny page\n"); + UINT32 AdrSecondLevDesc=(FirstLevDesc&0xfffff000)+((Virtual>>8)&0xffc); + fprintf(log,"AdrSecondLevDesc: 0x%lx \n",AdrSecondLevDesc); + + UINT32 SecondLevDesc=ReadPhysical(AdrSecondLevDesc); + fprintf(log,"SecondLevDesc: 0x%lx \n",SecondLevDesc); + + UINT32 PhysAddr=(SecondLevDesc&0xffffc000)+(Virtual&0x3ff); + fprintf(log,"Physical address: 0x%lx \n",PhysAddr); + fclose(log); + return PhysAddr; + } +// if(FirstLevDesc&0x3==3) // small page + { + fprintf(log,"Else page\n"); + UINT32 AdrSecondLevDesc=(FirstLevDesc&0xfffffc00)+((Virtual>>10)&0x03fc); + fprintf(log,"AdrSecondLevDesc: 0x%lx \n",AdrSecondLevDesc); + + UINT32 SecondLevDesc=ReadPhysical(AdrSecondLevDesc); + fprintf(log,"SecondLevDesc: 0x%lx \n",SecondLevDesc); + + UINT32 PhysAddr=(SecondLevDesc&0xffff0000)+(Virtual&0xffff); + fprintf(log,"Physical address: 0x%lx \n",PhysAddr); + fclose(log); + return PhysAddr; + + } +} + + + + + + +void DumpMMU() +{ + void *mmu=(void*)(MEM_START); + + UINT32 *_mmu=(UINT32*)VirtualAlloc((void*)0x0,sizeof(void*)*0xffff, MEM_RESERVE,PAGE_READWRITE); + int ret=VirtualCopy(_mmu,(void *) ((UINT32)mmu/256),sizeof(void*)*0xffff , PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + + FILE *log=fopen("\\logger2.txt","w"); + fprintf(log,"mmu_table=0x%lx : \n",_mmu); + fprintf(log,"mmu=0x%lx : \n",mmu); + fprintf(log,"ret=0x%x : \n",ret); + for(UINT32 z=0;z<=0x0100;z++) + fprintf(log,"mmu_table[0x%x]=0x%lx: \n",z,_mmu[z]); + fclose(log); + return; +} diff --git a/newres.h b/newres.h new file mode 100644 index 0000000..e6e2a53 --- /dev/null +++ b/newres.h @@ -0,0 +1,41 @@ +#ifndef __NEWRES_H__ +#define __NEWRES_H__ + +#if !defined(UNDER_CE) +#define UNDER_CE _WIN32_WCE +#endif + +#if defined(_WIN32_WCE) + #if !defined(WCEOLE_ENABLE_DIALOGEX) + #define DIALOGEX DIALOG DISCARDABLE + #endif + #include + #define SHMENUBAR RCDATA + #if defined(WIN32_PLATFORM_PSPC) && (_WIN32_WCE >= 300) + #include + #define AFXCE_IDR_SCRATCH_SHMENU 28700 + #else + #define I_IMAGENONE (-2) + #define NOMENU 0xFFFF + #define IDS_SHNEW 1 + + #define IDM_SHAREDNEW 10 + #define IDM_SHAREDNEWDEFAULT 11 + #endif // _WIN32_WCE_PSPC + #define AFXCE_IDD_SAVEMODIFIEDDLG 28701 +#endif // _WIN32_WCE + +#ifdef RC_INVOKED +#ifndef _INC_WINDOWS +#define _INC_WINDOWS + #include "winuser.h" // extract from windows header + #include "winver.h" +#endif +#endif + +#ifdef IDC_STATIC +#undef IDC_STATIC +#endif +#define IDC_STATIC (-1) + +#endif //__NEWRES_H__ diff --git a/resource.h b/resource.h new file mode 100644 index 0000000..635cd99 --- /dev/null +++ b/resource.h @@ -0,0 +1,27 @@ +//{{NO_DEPENDENCIES}} +// Microsoft eMbedded Visual C++ generated include file. +// Used by TESTER1.RC +// +#define IDS_APP_TITLE 1 +#define IDS_HELLO 2 +#define IDC_TESTER1 3 +#define IDI_TESTER1 101 +#define IDM_MENU 102 +#define IDD_ABOUTBOX 103 +#define IDS_HELP 104 + +#define IDS_COMMAND1 301 + +#define IDM_MAIN_COMMAND1 40001 +#define IDM_HELP_ABOUT 40003 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 104 +#define _APS_NEXT_COMMAND_VALUE 40004 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/setup.h b/setup.h new file mode 100644 index 0000000..1bc06c8 --- /dev/null +++ b/setup.h @@ -0,0 +1,278 @@ +/* + * linux/include/asm/setup.h + * + * Copyright (C) 1997-1999 Russell King + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Structure passed to kernel to tell it about the + * hardware it's running on. See linux/Documentation/arm/Setup + * for more info. + * + * NOTE: + * This file contains two ways to pass information from the boot + * loader to the kernel. The old struct param_struct is deprecated, + * but it will be kept in the kernel for 5 years from now + * (2001). This will allow boot loaders to convert to the new struct + * tag way. + */ +#ifndef __ASMARM_SETUP_H +#define __ASMARM_SETUP_H + +#define u32 UINT32 +#define u16 UINT16 +#define u8 UINT8 + + +/*#ifndef CONFIG_ACCEPT_GPL +#error This file covered by GPL but CONFIG_ACCEPT_GPL undefined. +#endif*/ + +/* + * Usage: + * - do not go blindly adding fields, add them at the end + * - when adding fields, don't rely on the address until + * a patch from me has been released + * - unused fields should be zero (for future expansion) + * - this structure is relatively short-lived - only + * guaranteed to contain useful data in setup_arch() + */ +#define COMMAND_LINE_SIZE 1024 + +/* This is the old deprecated way to pass parameters to the kernel */ +struct param_struct { + union { + struct { + unsigned long page_size; /* 0 */ + unsigned long nr_pages; /* 4 */ + unsigned long ramdisk_size; /* 8 */ + unsigned long flags; /* 12 */ +#define FLAG_READONLY 1 +#define FLAG_RDLOAD 4 +#define FLAG_RDPROMPT 8 + unsigned long rootdev; /* 16 */ + unsigned long video_num_cols; /* 20 */ + unsigned long video_num_rows; /* 24 */ + unsigned long video_x; /* 28 */ + unsigned long video_y; /* 32 */ + unsigned long memc_control_reg; /* 36 */ + unsigned char sounddefault; /* 40 */ + unsigned char adfsdrives; /* 41 */ + unsigned char bytes_per_char_h; /* 42 */ + unsigned char bytes_per_char_v; /* 43 */ + unsigned long pages_in_bank[4]; /* 44 */ + unsigned long pages_in_vram; /* 60 */ + unsigned long initrd_start; /* 64 */ + unsigned long initrd_size; /* 68 */ + unsigned long rd_start; /* 72 */ + unsigned long system_rev; /* 76 */ + unsigned long system_serial_low; /* 80 */ + unsigned long system_serial_high; /* 84 */ + unsigned long mem_fclk_21285; /* 88 */ + } s; + char unused[256]; + } u1; + union { + char paths[8][128]; + struct { + unsigned long magic; + char n[1024 - sizeof(unsigned long)]; + } s; + } u2; + char commandline[COMMAND_LINE_SIZE]; +}; + + + +/* + * The new way of passing information: a list of tagged entries + */ + +/* The list ends with an ATAG_NONE node. */ +#define ATAG_NONE 0x00000000 + +struct tag_header { + u32 size; + u32 tag; +}; + +/* The list must start with an ATAG_CORE node */ +#define ATAG_CORE 0x54410001 + +struct tag_core { + u32 flags; /* bit 0 = read-only */ + u32 pagesize; + u32 rootdev; +}; + +/* it is allowed to have multiple ATAG_MEM nodes */ +#define ATAG_MEM 0x54410002 + +struct tag_mem32 { + u32 size; + u32 start; /* physical start address */ +}; + +/* VGA text type displays */ +#define ATAG_VIDEOTEXT 0x54410003 + +struct tag_videotext { + u8 x; + u8 y; + u16 video_page; + u8 video_mode; + u8 video_cols; + u16 video_ega_bx; + u8 video_lines; + u8 video_isvga; + u16 video_points; +}; + +/* describes how the ramdisk will be used in kernel */ +#define ATAG_RAMDISK 0x54410004 + +struct tag_ramdisk { + u32 flags; /* bit 0 = load, bit 1 = prompt */ + u32 size; /* decompressed ramdisk size in _kilo_ bytes */ + u32 start; /* starting block of floppy-based RAM disk image */ +}; + +/* describes where the compressed ramdisk image lives */ +#define ATAG_INITRD 0x54410005 + +#define ATAG_INITRD2 0x54420005 + +struct tag_initrd { + u32 start; /* physical start address */ + u32 size; /* size of compressed ramdisk image in bytes */ +}; + +/* board serial number. "64 bits should be enough for everybody" */ +#define ATAG_SERIAL 0x54410006 + +struct tag_serialnr { + u32 low; + u32 high; +}; + +/* board revision */ +#define ATAG_REVISION 0x54410007 + +struct tag_revision { + u32 rev; +}; + +/* initial values for vesafb-type framebuffers. see struct screen_info + * in include/linux/tty.h + */ +#define ATAG_VIDEOLFB 0x54410008 + +struct tag_videolfb { + u16 lfb_width; + u16 lfb_height; + u16 lfb_depth; + u16 lfb_linelength; + u32 lfb_base; + u32 lfb_size; + u8 red_size; + u8 red_pos; + u8 green_size; + u8 green_pos; + u8 blue_size; + u8 blue_pos; + u8 rsvd_size; + u8 rsvd_pos; +}; + +/* command line: \0 terminated string */ +#define ATAG_CMDLINE 0x54410009 + +struct tag_cmdline { + char cmdline[1]; /* this is the minimum size */ +}; + +/* acorn RiscPC specific information */ +#define ATAG_ACORN 0x41000101 + +struct tag_acorn { + u32 memc_control_reg; + u32 vram_pages; + u8 sounddefault; + u8 adfsdrives; +}; + +#define ATAG_PTABLE 0x53410001 + +/* footbridge memory clock, see arch/arm/mach-footbridge/arch.c */ +#define ATAG_MEMCLK 0x41000402 + +struct tag_memclk { + u32 fmemclk; +}; + +struct tag { + struct tag_header hdr; + union { + struct tag_core core; + struct tag_mem32 mem; + struct tag_videotext videotext; + struct tag_ramdisk ramdisk; + struct tag_initrd initrd; + struct tag_serialnr serialnr; + struct tag_revision revision; + struct tag_videolfb videolfb; + struct tag_cmdline cmdline; +// struct tag_ptable ptable; + + /* + * Acorn specific + */ + struct tag_acorn acorn; + + /* + * DC21285 specific + */ + struct tag_memclk memclk; + + } u; +}; + +struct tagtable { + u32 tag; + int (*parse)(const struct tag *); +}; + +#define __tag __attribute__((unused, __section__(".taglist"))) +#define __tagtable(tag, fn) \ +static struct tagtable __tagtable_##fn __tag = { tag, fn } + +#define tag_member_present(tag,member) \ + ((unsigned long)(&((struct tag *)0L)->member + 1) \ + <= (tag)->hdr.size * 4) + +#define tag_next(t) ((struct tag *)((u32 *)(t) + (t)->hdr.size)) +#define tag_size(type) ((sizeof(struct tag_header) + sizeof(struct type)) >> 2) + +#define for_each_tag(t,base) \ + for (t = base; t->hdr.size; t = tag_next(t)) + +/* + * Memory map description + */ +#define NR_BANKS 8 + +struct meminfo { + int nr_banks; + unsigned long end; + struct { + unsigned long start; + unsigned long size; + int node; + } bank[NR_BANKS]; +}; + +extern struct meminfo meminfo; + +#endif diff --git a/tester1.aps b/tester1.aps new file mode 100644 index 0000000000000000000000000000000000000000..24921ad28e90aa4c47bada3acec829c9c298414f GIT binary patch literal 95132 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 +//#include +#include +#include "setup.h" + +#define MAX_LOADSTRING 100 + +// Global Variables: +HINSTANCE hInst; // The current instance +HWND hwndCB; // The command bar handle + +//static SHACTIVATEINFO s_sai; + +ATOM MyRegisterClass (HINSTANCE, LPTSTR); +BOOL InitInstance (HINSTANCE, int); +LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM); +HWND CreateRpCommandBar(HWND); + + +#pragma warning(disable: 4100 4710 4189; error: 4701) +/* who cares?! + 4100: whining about parameters not being used. + 4710: whining about screwing up inlining. + 4189: initialized but not used. make that an error: later. + 4701: usage w/o initialization. + */ + +int WINAPI WinMain( HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPTSTR lpCmdLine, + int nCmdShow) +{ + MSG msg; + HACCEL hAccelTable; + + // Perform application initialization: + if (!InitInstance (hInstance, nCmdShow)) + { + return FALSE; + } + + hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TESTER1); + + // Main message loop: + while (GetMessage(&msg, NULL, 0, 0)) + { + if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return msg.wParam; +} + +// +// FUNCTION: MyRegisterClass() +// +// PURPOSE: Registers the window class. +// +// COMMENTS: +// +// It is important to call this function so that the application +// will get 'well formed' small icons associated with it. +// +ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass) +{ + WNDCLASS wc; + + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC) WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTER1)); + wc.hCursor = 0; + wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); + wc.lpszMenuName = 0; + wc.lpszClassName = szWindowClass; + + return RegisterClass(&wc); +} + +HANDLE OpenCOM1() { + + static HANDLE COM1handle = INVALID_HANDLE_VALUE; + const char msg[] = "\r\n--------linexec--------\r\n"; + unsigned long wrote; + int speed = CBR_115200; + HANDLE h; + + if (COM1handle != INVALID_HANDLE_VALUE) + return (COM1handle); + + h = CreateFile(TEXT("COM1:"), + GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, + NULL); + if (h == INVALID_HANDLE_VALUE) + return (h); + + DCB dcb; + if (!GetCommState(h, &dcb)) + goto bad; + + dcb.BaudRate = speed; + if (!SetCommState(h, &dcb)) + goto bad; + + // Print banner on serial console. + WriteFile(h, msg, sizeof msg, &wrote, 0); + + COM1handle = h; + + return (h); + bad: + CloseHandle(h); + return (INVALID_HANDLE_VALUE); +} + +// +// FUNCTION: InitInstance(HANDLE, int) +// +// PURPOSE: Saves instance handle and creates main window +// +// COMMENTS: +// +// In this function, we save the instance handle in a global variable and +// create and display the main program window. +// + +BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) +{ + HWND hWnd = NULL; + TCHAR szTitle[MAX_LOADSTRING]; // The title bar text + TCHAR szWindowClass[MAX_LOADSTRING]; // The window class name + + hInst = hInstance; // Store instance handle in our global variable + // Initialize global string + LoadString(hInstance, IDC_TESTER1, szWindowClass, MAX_LOADSTRING); + LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); + + //If it is already running, then focus on the window + hWnd = FindWindow(szWindowClass, szTitle); + if (hWnd) + { + SetForegroundWindow ((HWND) (((DWORD)hWnd) | 0x01)); + return 0; + } + + MyRegisterClass(hInstance, szWindowClass); + + RECT rect; + GetClientRect(hWnd, &rect); + + OpenCOM1(); + load_boot("\\My Documents\\params.txt"); + load_boot("\\Storage Card\\params.txt"); + load_boot("\\ÒÓØ ¶°ÄÞ\\params.txt"); + + hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); + if (!hWnd) + { + return FALSE; + } + + + + //When the main window is created using CW_USEDEFAULT the height of the menubar (if one + // is created is not taken into account). So we resize the window after creating it + // if a menubar is present + { + RECT rc; + GetWindowRect(hWnd, &rc); + rc.bottom -= MENU_HEIGHT; + if (hwndCB) + MoveWindow(hWnd, rc.left, rc.top, rc.right, rc.bottom, FALSE); + } + + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + return TRUE; +} + +// +// FUNCTION: WndProc(HWND, unsigned, WORD, LONG) +// +// PURPOSE: Processes messages for the main window. +// +// WM_COMMAND - process the application menu +// WM_PAINT - Paint the main window +// WM_DESTROY - post a quit message and return +// +// +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + + HDC hdc; + + int wmId, wmEvent; + + PAINTSTRUCT ps; + + TCHAR szHello[MAX_LOADSTRING]; + + + + switch (message) + + { + + case WM_COMMAND: + + wmId = LOWORD(wParam); + + wmEvent = HIWORD(wParam); + + // Parse the menu selections: + + switch (wmId) + + { + + case IDM_HELP_ABOUT: + + DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); + + break; + + case IDOK: + + SendMessage(hWnd, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, 0), (LPARAM)hWnd); + + SendMessage (hWnd, WM_CLOSE, 0, 0); + + break; + + default: + + return DefWindowProc(hWnd, message, wParam, lParam); + + } + + break; + + case WM_CREATE: + + hwndCB = CreateRpCommandBar(hWnd); + + break; + + case WM_PAINT: + + RECT rt; + + hdc = BeginPaint(hWnd, &ps); + + GetClientRect(hWnd, &rt); + + LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); + + DrawText(hdc, szHello, _tcslen(szHello), &rt, + + DT_SINGLELINE | DT_VCENTER | DT_CENTER); + + EndPaint(hWnd, &ps); + + break; + + case WM_DESTROY: + + CommandBar_Destroy(hwndCB); + + PostQuitMessage(0); + + break; + + case WM_SETTINGCHANGE: + +// SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai); + + break; + + default: + + return DefWindowProc(hWnd, message, wParam, lParam); + + } + + return 0; + +} + + + +HWND CreateRpCommandBar(HWND hwnd) + +{ +/* + SHMENUBARINFO mbi; + + + + memset(&mbi, 0, sizeof(SHMENUBARINFO)); + + mbi.cbSize = sizeof(SHMENUBARINFO); + + mbi.hwndParent = hwnd; + + mbi.nToolBarId = IDM_MENU; + + mbi.hInstRes = hInst; + + mbi.nBmpId = 0; + + mbi.cBmpImages = 0; + + + + if (!SHCreateMenuBar(&mbi)) + + return NULL; + + + + return mbi.hwndMB; +*/ + return NULL; +} + + + +// Mesage handler for the About box. + +LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) + +{ + +// SHINITDLGINFO shidi; + + + + switch (message) + + { + + case WM_INITDIALOG: + + // Create a Done button and size it. + +// shidi.dwMask = SHIDIM_FLAGS; + +// shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN; + +// shidi.hDlg = hDlg; + +// SHInitDialog(&shidi); + + return TRUE; + + + + case WM_COMMAND: + + if (LOWORD(wParam) == IDOK) { + + EndDialog(hDlg, LOWORD(wParam)); + + return TRUE; + + } + + break; + + } + + return FALSE; + +} + diff --git a/tester1.h b/tester1.h new file mode 100644 index 0000000..b793a85 --- /dev/null +++ b/tester1.h @@ -0,0 +1,71 @@ +#include "config.h" + + +#define BOOT_LOGO +//#define BOOT_LOGO_DONE + +#if !defined(AFX_TESTER1_H__7D4A2D28_4650_475E_A82E_CF6F8E7BA839__INCLUDED_) +#define AFX_TESTER1_H__7D4A2D28_4650_475E_A82E_CF6F8E7BA839__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "resource.h" + +//////////////////////////////// Some type definitions ///////////////////// +struct Image { + UINT16 *p; + long x,y; +}; + +/////////////////////////////Functions ///////////////////////////////////// +Image ReadBMP(char[]); +void ShowImage(UINT16*,int,int,int=0,int=0); +void Gpio(); +void UART_setup(); +void DumpMMU(); +void UART_puts(char *); +void init_fb(); +void try_fb(); +void boot_linux(char*,char*); +UINT32 ReadPhysical(UINT32); +void WritePhysical(UINT32 addr,UINT32 val); +UINT32 VirtualToPhysical(UINT32); +void load_boot(char*); +void SetGPIOalt(int,int); +void SetGPIOio(int,int); + + +//////////////////////////////////////////////////////////////////////////// + +extern "C" BOOL VirtualCopy(LPVOID lpvDestMem, LPVOID lpvSrcMem, + DWORD dwSizeInBytes, DWORD dwProtectFlag); + +extern void do_it(); + +extern int read_mmu(); // reads where is/are descriptors located + +extern void IntOff(); +extern void DRAMloader(UINT32 adr,UINT32 machine_num); // this function turns off MMU and jumps onto physical address given + +extern "C" DWORD SetProcPermissions( +DWORD newperms +); + +extern "C" DWORD GetCurrentPermissions( +); + +extern "C" BOOL SetKMode( +BOOL fMode +); + +extern "C" LPVOID CreateStaticMapping( +DWORD dwPhysBase, +DWORD dwSize +); + + +#define MENU_HEIGHT 26 + +#endif // !defined(AFX_TESTER1_H__7D4A2D28_4650_475E_A82E_CF6F8E7BA839__INCLUDED_) diff --git a/tester1.ico b/tester1.ico new file mode 100644 index 0000000000000000000000000000000000000000..01304545f97332884cae6c987a81a7dccc6074d7 GIT binary patch literal 1078 zcmcIiJ8r`;41G=uWUG7xPeqQA!9bDQWHYjHlR9+?kb3e}e4LKj0#EFt4W(8SxIo)H zi+_r;C;|mmsHzf%j}`DtS(cN%DS)R3U_)O;+L8)9k^{or+YkmB5t#%zRrGyNX#pJ< zR81rCGncU+5ORobGKha;l?%>yuz?sgx(Ic;W__o$opYpbc8qqu#Vvv9F1Nqpc9lV6e2 zocGjkL)alkIMbsbr~0co53lcmB!1{rhfch<%0)SJbWv(ck4ejz%gN8pEW!6_>)1x| ayJKDNj^Yoera7D>y#xPt#9z8>dp`mETcJn* literal 0 HcmV?d00001 diff --git a/tester1.rc b/tester1.rc new file mode 100644 index 0000000..7169029 --- /dev/null +++ b/tester1.rc @@ -0,0 +1,153 @@ +//Microsoft eMbedded Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "newres.h" +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_TESTER1 ICON DISCARDABLE "tester1.ICO" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""newres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MENU RCDATA +BEGIN + IDM_MENU, 1, + + I_IMAGENONE, IDM_MAIN_COMMAND1, TBSTATE_ENABLED, + TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, + IDS_HELP, 0, 0, + +END + + +IDM_MENU MENU DISCARDABLE +BEGIN + POPUP "Tools" + BEGIN + MENUITEM "About", IDM_HELP_ABOUT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUTBOX DIALOGEX 0, 0, 140, 57 +STYLE WS_POPUP | WS_CAPTION +EXSTYLE WS_EX_CAPTIONOKBTN +CAPTION "About tester1" +FONT 8, "System" + +BEGIN + ICON IDI_TESTER1,IDC_STATIC,11,17,20,20 + LTEXT "tester1 Version 1.0",IDC_STATIC,40,10,70,8, SS_NOPREFIX + LTEXT "Copyright (C) 2003",IDC_STATIC,40,25,70,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDC_TESTER1 ACCELERATORS DISCARDABLE +BEGIN + "A", IDM_HELP_ABOUT, VIRTKEY, CONTROL, NOINVERT + "Q", IDOK, VIRTKEY, CONTROL, NOINVERT +END + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_ABOUTBOX, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 133 + TOPMARGIN, 7 + BOTTOMMARGIN, 50 + END +END +#endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDC_TESTER1 "TESTER1" + IDS_APP_TITLE "tester1" + IDS_HELLO "Hello World!" + IDS_HELP "Tools" + IDS_COMMAND1 "Done " +END + +#endif +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/uart.cpp b/uart.cpp new file mode 100644 index 0000000..98451fa --- /dev/null +++ b/uart.cpp @@ -0,0 +1,65 @@ +#include "stdafx.h" +#include "tester1.h" +#include +//#include +#include +#include "setup.h" + +// moved to config.h +//#define FUART 0x40100000 + + +void UART_puts(char *s) +{ + UINT32 *base=(UINT32*)VirtualAlloc((void*)0x0,sizeof(void*)*0xffff, MEM_RESERVE,PAGE_READWRITE); + int ret=VirtualCopy(base,(void *) ((UARTBASE)/256),sizeof(void*)*0xffff , PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + int a=0; + while(s[a]) + { + while((base[UARTSTATUS/4]&1<