69 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| VideoCore IV support in the ACK
 | |
| ===============================
 | |
| 
 | |
| This is a fairly crude port of the ACK to produce VideoCore IV machine
 | |
| code, suitable for use on the Raspberry Pi. It produces terrible but
 | |
| working code. The resulting binaries can be used either bare metal or
 | |
| loaded as a GPU kernel and executed using a modified mailbox.c (see below).
 | |
| Currently floating point support is present but incomplete; and as the
 | |
| VideoCore IV does not have double-precision float support, the C compiler
 | |
| treats doubles as single precision.
 | |
| 
 | |
| As much of the standard C library as is relevant works; if
 | |
| you're running in bare-metal mode, you can hook stdin/stdout up to the
 | |
| mini UART. (Obviously, in kernel mode you can't.)
 | |
| 
 | |
| Important note! The malloc heap expects your program to be loaded into a
 | |
| chunk of memory that's 128kB large. You must make sure that this is the case,
 | |
| or Bad Stuff will happen.
 | |
| 
 | |
| Output binaries are fully PIC and can be loaded anywhere (this is one of the
 | |
| things that makes the code so terrible). You must use the pi_user_to_phys()
 | |
| and pi_phys_to_user() to translate pointers from physical to user and vice
 | |
| versa. If you don't, Bad Stuff will happen.
 | |
| 
 | |
| 
 | |
| 
 | |
| Bare metal mode
 | |
| ---------------
 | |
| 
 | |
| To run a binary bare metal, compile it:
 | |
| 
 | |
|     ack -mrpi -O program.c -o bootcode.bin
 | |
| 
 | |
| ...and copy the bootcode.bin file to the root of an SD card. Boot the Pi.
 | |
| Your program will run.
 | |
| 
 | |
| To use the UART, #include <pi.h> and call pi_init_uart() at the top of your
 | |
| program. This will set it up and connect it to stdin/stdout. It's 115200 8n1.
 | |
| 
 | |
| 
 | |
| 
 | |
| Kernel mode
 | |
| -----------
 | |
| 
 | |
| This will require some hacking at your end.
 | |
| 
 | |
| Go here, and follow the instructions.
 | |
| 
 | |
| https://github.com/hermanhermitage/videocoreiv/wiki/VideoCore-IV-Kernels-under-Linux
 | |
| 
 | |
| Now compile your program:
 | |
| 
 | |
|     ack -mrpi -O program.c -o alpha.bin
 | |
| 
 | |
| MAKE SURE YOU AREN'T USING ANY MEMORY ALLOCATION. Copy the alpha.bin onto
 | |
| the Pi, and run it with mailbox.c.
 | |
| 
 | |
| To get data in and out, #include <pi.h> and look at the pi_kernel_parameters
 | |
| variable. It's a structure that is initialised with the data that's passed in
 | |
| from mailbox.c (currently four pointers and two integers).
 | |
| 
 | |
| If you want to use malloc() and friends, you'll need to hack mailbox.c so
 | |
| that the buffer containing the code is at least 128kB, or you're likely to
 | |
| corrupt the VideoCore's workspace and crash it.
 | |
| 
 | |
| 
 | |
| David Given <dg@cowlark.com>
 | |
| 2013-06-06
 | |
| 
 |