160 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
| 
 | |
| Copyright (c) 2008 Red Hat Incorporated.
 | |
| All rights reserved.
 | |
| 
 | |
| Redistribution and use in source and binary forms, with or without 
 | |
| modification, are permitted provided that the following conditions are met: 
 | |
| 
 | |
|     Redistributions of source code must retain the above copyright 
 | |
|     notice, this list of conditions and the following disclaimer.
 | |
| 
 | |
|     Redistributions in binary form must reproduce the above copyright
 | |
|     notice, this list of conditions and the following disclaimer in the
 | |
|     documentation and/or other materials provided with the distribution.
 | |
| 
 | |
|     The name of Red Hat Incorporated may not be used to endorse 
 | |
|     or promote products derived from this software without specific 
 | |
|     prior written permission.
 | |
| 
 | |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 | |
| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 | |
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | |
| DISCLAIMED.  IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY
 | |
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | |
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | |
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
 | |
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | |
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 | |
| 
 | |
| */
 | |
| 
 | |
| /* This is a sample program that shows how to use a few of the
 | |
|    features of the M32C port of GCC, Binutils, and Newlib.  */
 | |
| 
 | |
| #include <varvects.h>
 | |
| 
 | |
| typedef unsigned char byte;
 | |
| typedef unsigned short word;
 | |
| 
 | |
| #define prcr	(*(volatile byte *)0x000a)
 | |
| #define cm0	(*(volatile byte *)0x0006)
 | |
| #define cm1	(*(volatile byte *)0x0007)
 | |
| #define ocd	(*(volatile byte *)0x000c)
 | |
| 
 | |
| #ifdef __r8c_cpu__
 | |
| /* These are for the R8C/20 with LEDs on port P2 */
 | |
| 
 | |
| #define tracr	(*(volatile byte *)0x0100)
 | |
| #define traioc	(*(volatile byte *)0x0101)
 | |
| #define tramr	(*(volatile byte *)0x0102)
 | |
| #define trapre	(*(volatile byte *)0x0103)
 | |
| #define tra	(*(volatile byte *)0x0104)
 | |
| #define traic	(*(volatile byte *)0x0056)
 | |
| 
 | |
| #define pd2	(*(volatile byte *)0x00e6)
 | |
| #define p2	(*(volatile byte *)0x00e4)
 | |
| 
 | |
| #define ivec_timer_ra 22
 | |
| #endif
 | |
| 
 | |
| #ifdef __m32c_cpu__
 | |
| /* These are for the M32C/83 with LEDs on port P0 and P1 */
 | |
| 
 | |
| #define ta0	(*(volatile word *)0x0346)
 | |
| #define ta0mr	(*(volatile byte *)0x0356)
 | |
| #define tabsr	(*(volatile byte *)0x0340)
 | |
| #define ta0ic	(*(volatile byte *)0x006c)
 | |
| 
 | |
| #define pd0	(*(volatile byte *)0x03e2)
 | |
| #define pd1	(*(volatile byte *)0x03e3)
 | |
| #define p0	(*(volatile byte *)0x03e0)
 | |
| #define p1	(*(volatile byte *)0x03e1)
 | |
| 
 | |
| #define ivec_timer_a0 12
 | |
| #endif
 | |
| 
 | |
| /* Newlib's exit() pulls in lots of other things.  Main() should never
 | |
|    exit, but if it did, you could hard-reset the chip here.  */
 | |
| void
 | |
| exit(int rv)
 | |
| {
 | |
|   while (1)
 | |
|     asm volatile ("");
 | |
| }
 | |
| 
 | |
| #ifdef __r8c_cpu__
 | |
| /* The "constructor" attribute causes the startup code to call this
 | |
|    sometime before main() is called.  */
 | |
| __attribute__((constructor))
 | |
| void
 | |
| fast_clock(void)
 | |
| {
 | |
|   asm("fclr I");
 | |
|   prcr = 1;
 | |
|   cm0 = 0x08;
 | |
|   cm1 = 0x38;
 | |
|   asm("nop");
 | |
|   asm("nop");
 | |
|   asm("nop");
 | |
|   asm("nop");
 | |
|   ocd = 0;
 | |
|   prcr = 0;
 | |
|   asm("fset I");
 | |
| }
 | |
| #endif
 | |
| 
 | |
| /* We mark this volatile in case a non-interrupt function wants to
 | |
|    read it, else gcc may optimize away extra reads.  */
 | |
| static volatile int tc = 1;
 | |
| 
 | |
| /* The "interrupt" attribute changes the function entry/exit to
 | |
|    properly preserve any changed registers.  */
 | |
| static void __attribute__((interrupt))
 | |
| timer_ra_interrupt()
 | |
| {
 | |
|   tc ++;
 | |
| #ifdef __r8c_cpu__
 | |
|   p2 = tc >> 4;
 | |
| #else
 | |
|   p1 = tc;
 | |
|   p0 = tc >> 8;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| main()
 | |
| {
 | |
| #ifdef __r8c_cpu__
 | |
|   pd2 = 0xff;
 | |
| 
 | |
|   /* TIMER RA */
 | |
|   tracr = 0x00;
 | |
|   traioc = 0x00;
 | |
|   tramr = 0x00; /* timer mode, f1 */
 | |
|   trapre = 255; /* prescaler */
 | |
|   tra = 255; /* cycle count */
 | |
| 
 | |
|   _set_var_vect (timer_ra_interrupt, ivec_timer_ra); 
 | |
|   traic = 5;
 | |
|   tracr = 1;
 | |
| #endif
 | |
| 
 | |
| #ifdef __m32c_cpu__
 | |
|   pd0 = 0xff;
 | |
|   pd1 = 0xff;
 | |
| 
 | |
|   /* TIMER A0 */ 
 | |
|   ta0mr = 0x00;			/* Timer A0 mode register */
 | |
|   ta0 = 65535;			/* Timer A0 register */
 | |
| 
 | |
|   _set_var_vect (timer_ra_interrupt, ivec_timer_a0); 
 | |
|   ta0ic = 5;
 | |
|   tabsr = 0xff;
 | |
| #endif
 | |
| 
 | |
|   /* main() must never return.  */
 | |
|   while (1)
 | |
|     ;
 | |
| }
 |