| Index: embios/branches/4g_compat/SOURCES | 
| — | — | @@ -10,6 +10,8 @@ | 
| 11 | 11 | target/ipodnano4g/mmu.c | 
| 12 | 12 | target/ipodnano4g/lcd.c | 
| 13 | 13 | target/ipodnano4g/storage.c | 
|  | 14 | +target/ipodnano4g/i2c.S | 
|  | 15 | +target/ipodnano4g/accel.c | 
| 14 | 16 | #endif | 
| 15 | 17 |  | 
| 16 | 18 | init.c | 
| Index: embios/branches/4g_compat/target/ipodnano2g/i2c.S | 
| — | — | @@ -95,7 +95,7 @@ | 
| 96 | 96 | bl	i2cwait | 
| 97 | 97 | ldr	r0, [sp] | 
| 98 | 98 | orr	r0, r0, #1 | 
| 99 |  | -	str	r1, [r12,#0x0c]
 | 
|  | 99 | +	str	r0, [r12,#0x0c] | 
| 100 | 100 | mov	r0, #0xb0 | 
| 101 | 101 | str	r0, [r12,#0x04] | 
| 102 | 102 | str	r4, [r12] | 
| Index: embios/branches/4g_compat/target/ipodnano4g/i2c.h | 
| — | — | @@ -0,0 +1,37 @@ | 
|  | 2 | +// | 
|  | 3 | +// | 
|  | 4 | +//    Copyright 2010 TheSeven | 
|  | 5 | +// | 
|  | 6 | +// | 
|  | 7 | +//    This file is part of emBIOS. | 
|  | 8 | +// | 
|  | 9 | +//    emBIOS is free software: you can redistribute it and/or | 
|  | 10 | +//    modify it under the terms of the GNU General Public License as | 
|  | 11 | +//    published by the Free Software Foundation, either version 2 of the | 
|  | 12 | +//    License, or (at your option) any later version. | 
|  | 13 | +// | 
|  | 14 | +//    emBIOS is distributed in the hope that it will be useful, | 
|  | 15 | +//    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 16 | +//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | 17 | +//    See the GNU General Public License for more details. | 
|  | 18 | +// | 
|  | 19 | +//    You should have received a copy of the GNU General Public License along | 
|  | 20 | +//    with emBIOS.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 21 | +// | 
|  | 22 | +// | 
|  | 23 | + | 
|  | 24 | + | 
|  | 25 | +#ifndef __I2C_H__ | 
|  | 26 | +#define __I2C_H__ | 
|  | 27 | + | 
|  | 28 | + | 
|  | 29 | +#include "global.h" | 
|  | 30 | + | 
|  | 31 | + | 
|  | 32 | +extern void i2csend(uint32_t device, uint32_t address, void* data, uint32_t length); | 
|  | 33 | +extern void i2crecv(uint32_t device, uint32_t address, void* data, uint32_t length); | 
|  | 34 | +extern void i2csendbyte(uint32_t device, uint32_t address, uint32_t data); | 
|  | 35 | +extern uint32_t i2crecvbyte(uint32_t device, uint32_t address); | 
|  | 36 | + | 
|  | 37 | + | 
|  | 38 | +#endif | 
| Index: embios/branches/4g_compat/target/ipodnano4g/accel.c | 
| — | — | @@ -0,0 +1,36 @@ | 
|  | 2 | +// | 
|  | 3 | +// | 
|  | 4 | +//    Copyright 2010 TheSeven | 
|  | 5 | +// | 
|  | 6 | +// | 
|  | 7 | +//    This file is part of emBIOS. | 
|  | 8 | +// | 
|  | 9 | +//    emBIOS is free software: you can redistribute it and/or | 
|  | 10 | +//    modify it under the terms of the GNU General Public License as | 
|  | 11 | +//    published by the Free Software Foundation, either version 2 of the | 
|  | 12 | +//    License, or (at your option) any later version. | 
|  | 13 | +// | 
|  | 14 | +//    emBIOS is distributed in the hope that it will be useful, | 
|  | 15 | +//    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 16 | +//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | 17 | +//    See the GNU General Public License for more details. | 
|  | 18 | +// | 
|  | 19 | +//    You should have received a copy of the GNU General Public License along | 
|  | 20 | +//    with emBIOS.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 21 | +// | 
|  | 22 | +// | 
|  | 23 | + | 
|  | 24 | + | 
|  | 25 | +#include "global.h" | 
|  | 26 | +#include "i2c.h" | 
|  | 27 | + | 
|  | 28 | +uint32_t accel_get_axis(uint8_t axis) | 
|  | 29 | +{ | 
|  | 30 | +    uint8_t address = 0x29 + 2 * axis; | 
|  | 31 | +    return i2crecvbyte(0x3a, address); | 
|  | 32 | +} | 
|  | 33 | + | 
|  | 34 | +float accel_get_axis_in_gs(uint8_t axis) | 
|  | 35 | +{ | 
|  | 36 | +    return accel_get_axis(axis) / 16; | 
|  | 37 | +} | 
| Index: embios/branches/4g_compat/target/ipodnano4g/accel.h | 
| — | — | @@ -0,0 +1,32 @@ | 
|  | 2 | +// | 
|  | 3 | +// | 
|  | 4 | +//    Copyright 2010 TheSeven | 
|  | 5 | +// | 
|  | 6 | +// | 
|  | 7 | +//    This file is part of emBIOS. | 
|  | 8 | +// | 
|  | 9 | +//    emBIOS is free software: you can redistribute it and/or | 
|  | 10 | +//    modify it under the terms of the GNU General Public License as | 
|  | 11 | +//    published by the Free Software Foundation, either version 2 of the | 
|  | 12 | +//    License, or (at your option) any later version. | 
|  | 13 | +// | 
|  | 14 | +//    emBIOS is distributed in the hope that it will be useful, | 
|  | 15 | +//    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 16 | +//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | 17 | +//    See the GNU General Public License for more details. | 
|  | 18 | +// | 
|  | 19 | +//    You should have received a copy of the GNU General Public License along | 
|  | 20 | +//    with emBIOS.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 21 | +// | 
|  | 22 | +// | 
|  | 23 | + | 
|  | 24 | + | 
|  | 25 | +#ifndef __ACCEL_H__ | 
|  | 26 | +#define __ACCEL_H__ | 
|  | 27 | + | 
|  | 28 | +#include "global.h" | 
|  | 29 | + | 
|  | 30 | +uint8_t accel_get_axis(uint8_t axis); | 
|  | 31 | +uint8_t accel_get_axis_in_gs(uint8_t axis); | 
|  | 32 | + | 
|  | 33 | +#endif | 
| Index: embios/branches/4g_compat/target/ipodnano4g/i2c.S | 
| — | — | @@ -0,0 +1,135 @@ | 
|  | 2 | +@ | 
|  | 3 | +@ | 
|  | 4 | +@    Copyright 2010 TheSeven | 
|  | 5 | +@ | 
|  | 6 | +@ | 
|  | 7 | +@    This file is part of emBIOS. | 
|  | 8 | +@ | 
|  | 9 | +@    emBIOS is free software: you can redistribute it and/or | 
|  | 10 | +@    modify it under the terms of the GNU General Public License as | 
|  | 11 | +@    published by the Free Software Foundation, either version 2 of the | 
|  | 12 | +@    License, or (at your option) any later version. | 
|  | 13 | +@ | 
|  | 14 | +@    emBIOS is distributed in the hope that it will be useful, | 
|  | 15 | +@    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 16 | +@    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | 17 | +@    See the GNU General Public License for more details. | 
|  | 18 | +@ | 
|  | 19 | +@    You should have received a copy of the GNU General Public License | 
|  | 20 | +@    along with emBIOS.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 21 | +@ | 
|  | 22 | +@ | 
|  | 23 | + | 
|  | 24 | + | 
|  | 25 | +.section .icode.i2csend, "ax", %progbits | 
|  | 26 | +.align 2 | 
|  | 27 | +.global i2csendbyte | 
|  | 28 | +.global i2csend | 
|  | 29 | +.type i2csendbyte, %function | 
|  | 30 | +.type i2csend, %function | 
|  | 31 | +i2csendbyte: | 
|  | 32 | +	mov	r3, #0 | 
|  | 33 | +@fallthrough | 
|  | 34 | + | 
|  | 35 | +i2csend: | 
|  | 36 | +	stmfd	sp!, {r4,lr} | 
|  | 37 | +	mov	r12, #0x3C000000 | 
|  | 38 | +	add	r12, r12, #0x00600000 | 
|  | 39 | +	mov	r4, #0 | 
|  | 40 | +	str	r4, [r12,#0x08] | 
|  | 41 | +	str	r0, [r12,#0x0c] | 
|  | 42 | +	mov	r4, #0xf0 | 
|  | 43 | +	str	r4, [r12,#0x04] | 
|  | 44 | +	mov	r4, #0xf3 | 
|  | 45 | +	str	r4, [r12] | 
|  | 46 | +	bl	i2cwait | 
|  | 47 | +	str	r1, [r12,#0x0c] | 
|  | 48 | +	str	r4, [r12] | 
|  | 49 | +	bl	i2cwait | 
|  | 50 | +	movs	r3, r3 | 
|  | 51 | +	moveq	r0, r2 | 
|  | 52 | +i2csend_write: | 
|  | 53 | +	ldrne	r0, [r2], #1 | 
|  | 54 | +	str	r0, [r12,#0x0c] | 
|  | 55 | +	str	r4, [r12] | 
|  | 56 | +	bl	i2cwait | 
|  | 57 | +	subs	r3, r3, #1 | 
|  | 58 | +	bhi	i2csend_write | 
|  | 59 | +	mov	r0, #0xd0 | 
|  | 60 | +	str	r0, [r12,#0x04] | 
|  | 61 | +	str	r4, [r12] | 
|  | 62 | +i2csend_wait: | 
|  | 63 | +	ldr	r0, [r12,#0x04] | 
|  | 64 | +	tst	r0, #0x20 | 
|  | 65 | +	bne	i2csend_wait | 
|  | 66 | +	ldmfd	sp!, {r4,pc} | 
|  | 67 | +.size i2csendbyte, .-i2csendbyte | 
|  | 68 | +.size i2csend, .-i2csend | 
|  | 69 | + | 
|  | 70 | + | 
|  | 71 | +.section .icode.i2crecv, "ax", %progbits | 
|  | 72 | +.align 2 | 
|  | 73 | +.global i2crecvbyte | 
|  | 74 | +.global i2crecv | 
|  | 75 | +.type i2crecvbyte, %function | 
|  | 76 | +.type i2crecv, %function | 
|  | 77 | +i2crecvbyte: | 
|  | 78 | +	mov	r2, #0 | 
|  | 79 | +	mov	r3, #1 | 
|  | 80 | +@fallthrough | 
|  | 81 | + | 
|  | 82 | +i2crecv: | 
|  | 83 | +	stmfd	sp!, {r0,r4,lr}    @ R0 = slave id, R1 = I2C address, R2 = data, R3 = length | 
|  | 84 | +	mov	r12, #0x3C000000       @ R12 = I2C base address | 
|  | 85 | +	add	r12, r12, #0x00600000  @ DIFF!! something needs to be done about the different busses | 
|  | 86 | +	mov	r4, #0 | 
|  | 87 | +	str	r4, [r12,#0x08]        @ store 0 to the i2c address + 0x8 | 
|  | 88 | +	str	r0, [r12,#0x0c]        @ write the slave id to the i2c handler | 
|  | 89 | +	mov	r4, #0xf0 | 
|  | 90 | +	str	r4, [r12,#0x04]        @ write 0xF0 to the i2c handler (idk why) | 
|  | 91 | +	mov	r4, #0xf3 | 
|  | 92 | +	str	r4, [r12]              @ write 0xF3 to the i2c handler (apparently a finished signal) | 
|  | 93 | +	bl	i2cwait | 
|  | 94 | +	str	r1, [r12,#0x0c]        @ write the i2c address to the i2c handler | 
|  | 95 | +	str	r4, [r12]              @ write 0xF3 to the i2c handler (apparently a finished signal) | 
|  | 96 | +	bl	i2cwait | 
|  | 97 | +	ldr	r0, [sp]               @ DIFF!! why is it stack pointer here? | 
|  | 98 | +	orr	r0, r0, #1             @ find the least significant bit of the slave id | 
|  | 99 | +	str	r0, [r12,#0x0c]        @ write it to the i2c handler | 
|  | 100 | +	mov	r0, #0xb0 | 
|  | 101 | +	str	r0, [r12,#0x04]        @ write 0xB0 to the i2c handler (idk why) | 
|  | 102 | +	str	r4, [r12]              @ write 0xF3 to the i2c handler (apparently a finished signal) | 
|  | 103 | +	bl	i2cwait | 
|  | 104 | +i2crecv_read: | 
|  | 105 | +	subs	r3, r3, #1         @ decrement the bytes left | 
|  | 106 | +	moveq	r4, #0x73          @ set R6 to 0x73 if the bytes left is now 0 | 
|  | 107 | +	str	r4, [r12] | 
|  | 108 | +	bl	i2cwait | 
|  | 109 | +	ldr	r0, [r12,#0x0c]        @ read a byte into R0 | 
|  | 110 | +	movs	r2, r2 | 
|  | 111 | +	strne	r0, [r2], #1       @ write it to our buffer | 
|  | 112 | +	movs	r3, r3 | 
|  | 113 | +	bne	i2crecv_read           @ repeat if there are still bytes left | 
|  | 114 | +	mov	r1, #0x90 | 
|  | 115 | +	str	r1, [r12,#0x04]        @ write 0x90 to the i2c handler | 
|  | 116 | +	mov	r1, #0xf3 | 
|  | 117 | +	str	r1, [r12]              @ write 0xF3 to the i2c handler (apparently a finished signal) | 
|  | 118 | +i2crecv_wait: | 
|  | 119 | +	ldr	r1, [r12,#0x04] | 
|  | 120 | +	tst	r1, #0x20 | 
|  | 121 | +	bne	i2crecv_wait           @ wait until [R12,#0x04] does not equal 0x20 | 
|  | 122 | +	ldmfd	sp!, {r1,r4,pc} | 
|  | 123 | +.size i2crecvbyte, .-i2crecvbyte | 
|  | 124 | +.size i2crecv, .-i2crecv | 
|  | 125 | + | 
|  | 126 | + | 
|  | 127 | +.section .icode.i2cwait, "ax", %progbits | 
|  | 128 | +.align 2 | 
|  | 129 | +.global i2cwait | 
|  | 130 | +.type i2cwait, %function | 
|  | 131 | +i2cwait: | 
|  | 132 | +	ldr	r0, [r12] | 
|  | 133 | +	tst	r0, #0x10 | 
|  | 134 | +	beq	i2cwait | 
|  | 135 | +	mov	pc, lr | 
|  | 136 | +.size i2cwait, .-i2cwait | 
| Index: embios/branches/4g_compat/snprintf.h | 
| — | — | @@ -27,8 +27,14 @@ | 
| 28 | 28 |  | 
| 29 | 29 | #define __need___va_list | 
| 30 | 30 | #include <stdarg.h> | 
|  | 31 | +#include "gcc_extensions.h" | 
| 31 | 32 | #include "global.h" | 
| 32 | 33 |  | 
|  | 34 | +#ifdef __GNUC__ | 
|  | 35 | +#define __VALIST __gnuc_va_list | 
|  | 36 | +#else | 
|  | 37 | +#define __VALIST char* | 
|  | 38 | +#endif | 
| 33 | 39 |  | 
| 34 | 40 | int vsnprintf (char *buf, size_t size, const char *fmt, __VALIST ap); | 
| 35 | 41 |  | 
| Index: embios/branches/4g_compat/gcc_extensions.h | 
| — | — | @@ -0,0 +1,46 @@ | 
|  | 2 | +/*************************************************************************** | 
|  | 3 | + *             __________               __   ___. | 
|  | 4 | + *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___ | 
|  | 5 | + *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  / | 
|  | 6 | + *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  < | 
|  | 7 | + *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \ | 
|  | 8 | + *                     \/            \/     \/    \/            \/ | 
|  | 9 | + * | 
|  | 10 | + * Copyright © 2010 Rafaël Carré | 
|  | 11 | + * | 
|  | 12 | + * This program is free software; you can redistribute it and/or | 
|  | 13 | + * modify it under the terms of the GNU General Public License | 
|  | 14 | + * as published by the Free Software Foundation; either version 2 | 
|  | 15 | + * of the License, or (at your option) any later version. | 
|  | 16 | + * | 
|  | 17 | + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | 
|  | 18 | + * KIND, either express or implied. | 
|  | 19 | + * | 
|  | 20 | + ****************************************************************************/ | 
|  | 21 | + | 
|  | 22 | +#ifndef _GCC_EXTENSIONS_H_ | 
|  | 23 | +#define _GCC_EXTENSIONS_H_ | 
|  | 24 | + | 
|  | 25 | +/* Support for some GCC extensions */ | 
|  | 26 | + | 
|  | 27 | +/* Compile time check of format for printf/scanf like functions */ | 
|  | 28 | +#ifdef __GNUC__ | 
|  | 29 | +#define ATTRIBUTE_PRINTF(fmt, arg1) __attribute__( ( format( printf, fmt, arg1 ) ) ) | 
|  | 30 | +#define ATTRIBUTE_SCANF(fmt, arg1) __attribute__( ( format( scanf, fmt, arg1 ) ) ) | 
|  | 31 | +#else | 
|  | 32 | +#define ATTRIBUTE_PRINTF(fmt, arg1) | 
|  | 33 | +#define ATTRIBUTE_SCANF(fmt, arg1) | 
|  | 34 | +#endif | 
|  | 35 | + | 
|  | 36 | + | 
|  | 37 | +/* Use to give gcc hints on which branch is most likely taken */ | 
|  | 38 | +#if defined(__GNUC__) && __GNUC__ >= 3 | 
|  | 39 | +#define LIKELY(x)   __builtin_expect(!!(x), 1) | 
|  | 40 | +#define UNLIKELY(x) __builtin_expect(!!(x), 0) | 
|  | 41 | +#else | 
|  | 42 | +#define LIKELY(x)   (x) | 
|  | 43 | +#define UNLIKELY(x) (x) | 
|  | 44 | +#endif | 
|  | 45 | + | 
|  | 46 | + | 
|  | 47 | +#endif /* _GCC_EXTENSIONS_H_ */ | 
| Index: embios/branches/4g_compat/lcdconsole.c | 
| — | — | @@ -49,7 +49,11 @@ | 
| 50 | 50 |  | 
| 51 | 51 | void lcdconsole_putc(char string, int fgcolor, int bgcolor) | 
| 52 | 52 | { | 
| 53 |  | -  if (string == '\r') return;
 | 
|  | 53 | +  if (string == '\r') | 
|  | 54 | +  { | 
|  | 55 | +    current_col = 0; | 
|  | 56 | +    return; | 
|  | 57 | +  } | 
| 54 | 58 | current_col++; | 
| 55 | 59 | if (string == '\n') | 
| 56 | 60 | { |