bus.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2009, Swedish Institute of Computer Science.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the Institute nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  *
00029  * This file is part of the Contiki operating system.
00030  *
00031  * $Id: bus.c,v 1.2 2010/01/25 23:12:09 anthony-a Exp $
00032  */
00033 
00034 /**
00035  * \file
00036  *         Initialization functions for the 8051 bus
00037  * \author
00038  *         Adam Dunkels <adam@sics.se>
00039  */
00040 
00041 #include "banked.h"
00042 #include "cc2430_sfr.h"
00043 #include "dev/bus.h"
00044 #include "sys/clock.h"
00045 
00046 /*---------------------------------------------------------------------------*/
00047 void
00048 bus_init (void) __banked
00049 {
00050   CLKCON = (0x00 | OSC32K);                     /* 32k internal */
00051   while(CLKCON != (0x00 | OSC32K));
00052 
00053   P1DIR |= 0x0E;
00054   IEN0_EA = 1;
00055 
00056   /* Initialize the clock */
00057   clock_init();
00058 }
00059 /*---------------------------------------------------------------------------*/
00060 /**
00061  * Read a block of code memory.
00062  * The code must be placed in the lowest bank of flash.
00063  *
00064  * \param address address to read from flash
00065  * \param buffer  buffer to store data
00066  * \param size    number of bytes to read
00067  */
00068 void
00069 flash_read (uint8_t *buf, uint32_t address, uint8_t size) __banked
00070 {
00071   buf;          /*dptr0*/
00072   address;      /*stack-6*/
00073   size;         /*stack-7*/
00074         
00075   buf;
00076   
00077   DISABLE_INTERRUPTS();
00078   __asm
00079                         mov dpl, r2
00080                         mov dph, r3
00081                         mov a, r0
00082                         push acc
00083                         mov a, r2
00084                         push acc
00085                         mov a, _MEMCTR
00086                         push acc
00087 
00088                         mov a, _bp
00089                         add a, #0xf9            ;stack - 7 = size
00090                         mov r0,a
00091                         mov a, @r0              ;r2 = size
00092                         mov r2, a               ;r2 = size
00093 
00094                         inc r0
00095                         mov a, @r0
00096                         mov _DPL1, a            ;DPTR1 = address & 0x7FFF | 0x8000
00097                         inc r0
00098                         mov a, @r0
00099                         orl a, #0x80
00100                         mov _DPH1, a
00101                         inc r0                                  ;MEMCTR = ((address >> 15 & 3) << 4) | 0x01 (bank select)
00102                         mov a, @r0
00103                         dec r0
00104                         rrc a
00105                         mov a, @r0
00106                         rrc a
00107                         rr a
00108                         rr a
00109                         anl a, #0x30
00110                         orl a, #1
00111                         mov _MEMCTR,a
00112 lp1:
00113                         mov _DPS, #1            ;active DPTR = 1
00114                         clr a
00115                         movc a, @a+dptr                 ;read flash (DPTR1)
00116                         inc dptr
00117                         mov _DPS, #0                            ;active DPTR = 0
00118                         movx @dptr,a                            ;write to DPTR0
00119                         inc dptr
00120                         djnz r2,lp1                                     ;while (--size)
00121 
00122                         pop acc
00123                         mov _MEMCTR, a  ;restore bank
00124 
00125                         pop acc
00126                         mov r2,a
00127                         pop acc
00128                         mov r0,a
00129   __endasm;
00130   ENABLE_INTERRUPTS();
00131   DPL1 = *buf++;
00132 }
00133 /*---------------------------------------------------------------------------*/

Generated on Mon Apr 11 14:23:38 2011 for Contiki 2.5 by  doxygen 1.6.1