NanoPayload

Annotated stage2/stage2.c

18:5d33753dfd71
2015-06-07 Paul Boddie Separated the stages into separate directories in order to employ different compilation options, principally to introduce the object relocation technique apparently required by stage 2.
paul@6 1
/*
paul@6 2
 * Ben NanoNote stage 2 payload test.
paul@6 3
 *
paul@6 4
 * Copyright (C) 2015 Paul Boddie <paul@boddie.org.uk>
paul@6 5
 * Copyright (C) Wolfgang Spraul <wolfgang@sharism.cc>
paul@6 6
 *
paul@6 7
 * This program is free software; you can redistribute it and/or modify it under
paul@6 8
 * the terms of the GNU General Public License as published by the Free Software
paul@6 9
 * Foundation; either version 3 of the License, or (at your option) any later
paul@6 10
 * version.
paul@6 11
 *
paul@6 12
 * This program is distributed in the hope that it will be useful, but WITHOUT
paul@6 13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
paul@6 14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
paul@6 15
 * details.
paul@6 16
 *
paul@6 17
 * You should have received a copy of the GNU General Public License along with
paul@6 18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
paul@6 19
 */
paul@6 20
paul@18 21
#include "board-nanonote.h"
paul@15 22
#include "lcd.h"
paul@6 23
paul@6 24
void c_main(void)
paul@6 25
{
paul@18 26
	/* Relocate object locations. */
paul@18 27
paul@18 28
        volatile unsigned int start_addr, got_start, got_end, addr, offset;
paul@18 29
paul@18 30
        /* get absolute start address  */
paul@18 31
        __asm__ __volatile__(
paul@18 32
                "move %0, $20\n\t"
paul@18 33
                : "=r"(start_addr)
paul@18 34
                :
paul@18 35
                );
paul@18 36
paul@18 37
        /* get related GOT address  */
paul@18 38
        __asm__ __volatile__(
paul@18 39
                "la $4, _GLOBAL_OFFSET_TABLE_\n\t"
paul@18 40
                "move %0, $4\n\t"
paul@18 41
                "la $5, _got_end\n\t"
paul@18 42
                "move %1, $5\n\t"
paul@18 43
                : "=r"(got_start),"=r"(got_end)
paul@18 44
                :
paul@18 45
                );
paul@18 46
paul@18 47
        /* calculate offset and correct GOT*/
paul@18 48
        offset = start_addr - 0x80000000;
paul@18 49
        got_start += offset;
paul@18 50
        got_end  += offset;
paul@18 51
paul@18 52
        for ( addr = got_start + 8; addr < got_end; addr += 4 )
paul@18 53
                *((volatile unsigned int *)(addr)) += offset; // add offset to correct all GOT
paul@18 54
paul@18 55
	/* The actual work. */
paul@18 56
paul@9 57
	gpio_init2();
paul@9 58
	cpm_init();
paul@9 59
	rtc_init();
paul@9 60
	timer_init();
paul@15 61
	lcd_init();
paul@6 62
}