add new port for FUJITSU FSSDC-9B506-EVB v1.0

finsh are supported

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1419 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
dzzxzz@gmail.com 2011-05-19 09:45:26 +00:00
parent 6a27c24e1e
commit 0050c8b708
16 changed files with 5560 additions and 1 deletions

View File

@ -0,0 +1,40 @@
/*
* File : application.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2009 - 2011, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2011-02-24 Bernard the first version
*/
/**
* @addtogroup FM3
*/
/*@{*/
#include <rtthread.h>
#include "board.h"
#include "led.h"
void rt_init_thread_entry(void *parameter)
{
rt_hw_led_init();
}
int rt_application_init()
{
rt_thread_t init_thread;
init_thread = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 1024, 21, 20);
if(init_thread != RT_NULL)
rt_thread_startup(init_thread);
return 0;
}
/*@}*/

109
bsp/fm3/mb9b506r/board.c Normal file
View File

@ -0,0 +1,109 @@
/*
* File : board.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2009 - 2011 RT-Thread Develop Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2011-02-24 Bernard first implementation
*/
#include <rthw.h>
#include <rtthread.h>
#include "board.h"
#include "mb9bf506r.h"
#include "core_cm3.h"
extern const uint32_t SystemFrequency;
#define UART0 FM3_MFS0_UART
struct serial_int_rx uart0_int_rx;
struct serial_device uart0 =
{
UART0,
&uart0_int_rx,
RT_NULL
};
struct rt_device uart0_device;
#define UART2 FM3_MFS2_UART
struct serial_int_rx uart2_int_rx;
struct serial_device uart2 =
{
UART2,
&uart2_int_rx,
RT_NULL
};
struct rt_device uart2_device;
/**
* @addtogroup FM3
*/
/*@{*/
/**
* This is the timer interrupt service routine.
*
*/
void rt_hw_timer_handler(void)
{
/* enter interrupt */
rt_interrupt_enter();
rt_tick_increase();
/* leave interrupt */
rt_interrupt_leave();
}
void rt_hw_uart2_rx_handler(void)
{
#ifdef RT_USING_UART2
extern struct rt_device uart2_device;
extern void rt_hw_serial_isr(struct rt_device *device);
/* enter interrupt */
rt_interrupt_enter();
rt_hw_serial_isr(&uart2_device);
/* leave interrupt */
rt_interrupt_leave();
#endif
}
/**
* This function will handle init uart
*/
static void rt_hw_uart_init(void)
{
/* Set Uart Ch2 Port, SIN2_1, SOT2_1 */
FM3_GPIO->PFR2 = FM3_GPIO->PFR2 | 0x0030;
FM3_GPIO->EPFR07 = FM3_GPIO->EPFR07 | 0x000a0000;
uart2.uart_device->SMR = SMR_MD_UART | SMR_SOE;;
uart2.uart_device->BGR = (40000000UL + (BPS/2))/BPS - 1;
uart2.uart_device->ESCR = ESCR_DATABITS_8;
uart2.uart_device->SCR = SCR_RXE | SCR_TXE | SCR_RIE;
UART_ENABLE_IRQ(MFS2RX_IRQn);
UART_ENABLE_IRQ(MFS2TX_IRQn);
}
/**
* This function will initial FM3 Easy Kit board.
*/
void rt_hw_board_init()
{
/* init systick */
SysTick_Config(SystemFrequency/RT_TICK_PER_SECOND - 1);
rt_hw_uart_init();
}
/*@}*/

31
bsp/fm3/mb9b506r/board.h Normal file
View File

@ -0,0 +1,31 @@
/*
* File : board.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2009, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2009-09-22 Bernard add board.h to this bsp
* 2011-03-04 lgnq add board.h to FM3 bsp
*/
#ifndef __BOARD_H__
#define __BOARD_H__
#include "serial.h"
//Internal SRAM memory size[Kbytes] <8-64>
//MB9BF500 : 32
//MB9BF504 : 32
//MB9BF505 : 48
//MB9BF506 : 64
#define FM3_SRAM_SIZE 64
#define FM3_SRAM_END (0x1FFF8000 + FM3_SRAM_SIZE * 1024)
void rt_hw_board_init(void);
#endif

180
bsp/fm3/mb9b506r/console.c Normal file
View File

@ -0,0 +1,180 @@
#include <rtthread.h>
#include <serial.h>
#define RT_CONSOLE_WIDTH 240
#define RT_CONSOLE_HEIGHT 320
#define RT_CONSOLE_FONT_WIDTH 8
#define RT_CONSOLE_FONT_HEIGHT 16
#define RT_CONSOLE_COL (RT_CONSOLE_WIDTH/RT_CONSOLE_FONT_WIDTH)
#define RT_CONSOLE_ROW (RT_CONSOLE_HEIGHT/RT_CONSOLE_FONT_HEIGHT)
#define RT_CONSOLE_TAB 4
#define RT_CONSOLE_FOREPIXEL (0x001f)
extern struct serial_device uart2;
struct rt_console
{
rt_uint8_t* video_ptr;
rt_uint8_t* font_ptr;
/* bpp and pixel of width */
rt_uint8_t bpp;
rt_uint32_t pitch;
/* current cursor */
rt_uint8_t current_col;
rt_uint8_t current_row;
};
struct rt_console console;
void rt_hw_console_init(rt_uint8_t* video_ptr, rt_uint8_t* font_ptr, rt_uint8_t bpp);
void rt_hw_console_newline(void);
void rt_hw_console_putc(char c);
void rt_hw_console_clear(void);
void rt_hw_console_init(rt_uint8_t* video_ptr, rt_uint8_t* font_ptr, rt_uint8_t bpp)
{
rt_memset(&console, 0, sizeof(struct rt_console));
console.video_ptr = video_ptr;
console.font_ptr = font_ptr;
console.bpp = bpp;
console.pitch = console.bpp * RT_CONSOLE_WIDTH;
rt_hw_console_clear();
}
void rt_hw_console_putc(char c)
{
switch (c)
{
case 10:
case 11:
case 12:
case 13:
/* to next line */
rt_hw_console_newline();
console.current_col = 0;
break;
case 9:
console.current_col += RT_CONSOLE_TAB;
break;
default:
{
rt_uint8_t* font_ptr;
register rt_uint32_t cursor;
register rt_uint32_t i, j;
if (console.current_col == RT_CONSOLE_COL)
{
rt_hw_console_newline();
console.current_col = 0;
rt_hw_console_putc(c);
return;
}
font_ptr = console.font_ptr + c * RT_CONSOLE_FONT_HEIGHT;
cursor = (console.current_row * RT_CONSOLE_FONT_HEIGHT) * console.pitch
+ console.current_col * RT_CONSOLE_FONT_WIDTH * console.bpp;
for (i = 0; i < RT_CONSOLE_FONT_HEIGHT; i ++ )
{
for (j = 0; j < RT_CONSOLE_FONT_WIDTH; j ++)
{
if ( ((font_ptr[i] >> (7-j)) & 0x01) != 0 )
{
/* draw a pixel */
rt_uint8_t *ptr = &(console.video_ptr[cursor + i * console.pitch + j * console.bpp]);
switch(console.bpp)
{
case 1:
*ptr = RT_CONSOLE_FOREPIXEL;
break;
case 2:
*(rt_uint16_t*)ptr = RT_CONSOLE_FOREPIXEL;
break;
case 3:
ptr[0] = RT_CONSOLE_FOREPIXEL & 0xff;
ptr[1] = (RT_CONSOLE_FOREPIXEL >> 8) & 0xff;
ptr[2] = (RT_CONSOLE_FOREPIXEL >> 16) & 0xff;
break;
case 4:
*(rt_uint32_t*)ptr = RT_CONSOLE_FOREPIXEL;
break;
}
}
}
}
console.current_col ++;
}
break;
}
}
void rt_hw_console_newline()
{
console.current_row ++;
if (console.current_row >= RT_CONSOLE_ROW)
{
rt_uint32_t i;
/* scroll to next line */
for (i = 0; i < RT_CONSOLE_ROW - 1; i ++)
{
rt_memcpy(console.video_ptr + i * RT_CONSOLE_FONT_HEIGHT * console.pitch,
console.video_ptr + (i + 1) * RT_CONSOLE_FONT_HEIGHT * console.pitch,
RT_CONSOLE_FONT_HEIGHT * console.pitch);
}
/* clear last line */
rt_memset(console.video_ptr + (RT_CONSOLE_ROW - 1) * RT_CONSOLE_FONT_HEIGHT * console.pitch,
0,
RT_CONSOLE_FONT_HEIGHT * console.pitch);
console.current_row = RT_CONSOLE_ROW - 1;
}
}
void rt_hw_console_clear()
{
console.current_col = 0;
console.current_row = 0;
rt_memset(console.video_ptr, 0, RT_CONSOLE_HEIGHT * console.pitch);
}
/* write one character to serial, must not trigger interrupt */
void rt_hw_serial_putc(const char c)
{
/*
to be polite with serial console add a line feed
to the carriage return character
*/
if (c=='\n')rt_hw_serial_putc('\r');
while (!(uart2.uart_device->SSR & SSR_TDRE));
uart2.uart_device->TDR = (c & 0x1FF);
}
/**
* This function is used by rt_kprintf to display a string on console.
*
* @param str the displayed string
*/
void rt_hw_console_output(const char* str)
{
while (*str)
{
rt_hw_serial_putc(*str++);
}
}

View File

@ -0,0 +1,769 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<project>
<fileVersion>2</fileVersion>
<fileChecksum>1392295362</fileChecksum>
<configuration>
<name>Debug</name>
<outputs>
<file>$PROJ_DIR$\..\..\..\include\rtthread.h</file>
<file>$PROJ_DIR$\..\CMSIS\system_mb9bf50x.h</file>
<file>$PROJ_DIR$\..\CMSIS\core_cmFunc.h</file>
<file>$PROJ_DIR$\..\CMSIS\core_cm3.h</file>
<file>$PROJ_DIR$\..\..\..\include\rtdef.h</file>
<file>$PROJ_DIR$\..\CMSIS\core_cmInstr.h</file>
<file>$PROJ_DIR$\..\CMSIS\mb9bf506r.h</file>
<file>$PROJ_DIR$\Debug\Obj\object.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\application.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\module.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\ipc.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\mem.o</file>
<file>$PROJ_DIR$\Debug\Obj\scheduler.o</file>
<file>$PROJ_DIR$\rtconfig.h</file>
<file>$PROJ_DIR$\Debug\Obj\mem.pbi</file>
<file>$TOOLKIT_DIR$\inc\c\wchar.h</file>
<file>$TOOLKIT_DIR$\inc\c\ycheck.h</file>
<file>$TOOLKIT_DIR$\inc\c\DLib_Threads.h</file>
<file>$TOOLKIT_DIR$\inc\c\xencoding_limits.h</file>
<file>$TOOLKIT_DIR$\inc\c\DLib_Product.h</file>
<file>$TOOLKIT_DIR$\inc\c\yvals.h</file>
<file>$TOOLKIT_DIR$\inc\c\DLib_Defaults.h</file>
<file>$TOOLKIT_DIR$\inc\c\stdint.h</file>
<file>$TOOLKIT_DIR$\inc\c\string.h</file>
<file>$PROJ_DIR$\Debug\Obj\board.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\led.pbi</file>
<file>$TOOLKIT_DIR$\inc\c\ysizet.h</file>
<file>$PROJ_DIR$\Debug\Obj\cpuport.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_init.o</file>
<file>$PROJ_DIR$\Debug\Obj\console.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_var.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_ops.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_error.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_vm.o</file>
<file>$PROJ_DIR$\Debug\Obj\cmd.pbi</file>
<file>$TOOLKIT_DIR$\inc\c\xtls.h</file>
<file>$TOOLKIT_DIR$\inc\c\ctype.h</file>
<file>$TOOLKIT_DIR$\inc\c\xlocale_c.h</file>
<file>$TOOLKIT_DIR$\inc\c\xmtx.h</file>
<file>$TOOLKIT_DIR$\inc\c\xlocaleuse.h</file>
<file>$PROJ_DIR$\Debug\Obj\thread.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\kservice.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_compiler.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_node.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_parser.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_heap.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_compiler.o</file>
<file>$PROJ_DIR$\Debug\Obj\symbol.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_token.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_heap.o</file>
<file>$PROJ_DIR$\Debug\Obj\cmd.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_token.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\shell.o</file>
<file>$PROJ_DIR$\..\..\..\libcpu\arm\fm3\fault_iar.S</file>
<file>$PROJ_DIR$\..\..\..\libcpu\arm\fm3\start_iar.S</file>
<file>$PROJ_DIR$\..\..\..\src\object.c</file>
<file>$PROJ_DIR$\..\..\..\libcpu\arm\fm3\context_iar.S</file>
<file>$PROJ_DIR$\..\..\..\src\scheduler.c</file>
<file>$PROJ_DIR$\..\..\..\libcpu\arm\fm3\cpuport.c</file>
<file>$PROJ_DIR$\..\..\..\src\slab.c</file>
<file>$PROJ_DIR$\..\..\..\src\rtm.c</file>
<file>$PROJ_DIR$\..\..\..\src\timer.c</file>
<file>$PROJ_DIR$\..\..\..\src\thread.c</file>
<file>$PROJ_DIR$\..\..\..\src\idle.c</file>
<file>$PROJ_DIR$\..\..\..\src\mempool.c</file>
<file>$PROJ_DIR$\..\..\..\src\module.c</file>
<file>$PROJ_DIR$\..\..\..\src\ipc.c</file>
<file>$PROJ_DIR$\..\..\..\src\kservice.c</file>
<file>$PROJ_DIR$\..\..\..\src\mem.c</file>
<file>$PROJ_DIR$\..\..\..\src\irq.c</file>
<file>$PROJ_DIR$\..\..\..\src\device.c</file>
<file>$PROJ_DIR$\..\..\..\src\clock.c</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_var.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_vm.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\shell.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\symbol.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\thread.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_parser.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_init.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_node.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_ops.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\serial.o</file>
<file>$PROJ_DIR$\Debug\Obj\clock.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\scheduler.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\serial.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\console.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\idle.o</file>
<file>$TOOLKIT_DIR$\inc\c\xlocale.h</file>
<file>$PROJ_DIR$\Debug\Obj\irq.o</file>
<file>$PROJ_DIR$\Debug\Obj\clock.o</file>
<file>$PROJ_DIR$\Debug\Obj\device.o</file>
<file>$PROJ_DIR$\Debug\Obj\slab.o</file>
<file>$PROJ_DIR$\Debug\Obj\start_iar.o</file>
<file>$PROJ_DIR$\Debug\Obj\core_cm3.o</file>
<file>$PROJ_DIR$\Debug\Obj\kservice.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\object.o</file>
<file>$TOOLKIT_DIR$\inc\c\intrinsics.h</file>
<file>$PROJ_DIR$\Debug\Obj\system_mb9bf50x.o</file>
<file>$PROJ_DIR$\Debug\Obj\module.o</file>
<file>$PROJ_DIR$\Debug\Obj\application.o</file>
<file>$PROJ_DIR$\Debug\Obj\slab.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\fault_iar.o</file>
<file>$PROJ_DIR$\Debug\Obj\mempool.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\idle.pbi</file>
<file>$TOOLKIT_DIR$\inc\c\stdlib.h</file>
<file>$PROJ_DIR$\Debug\Obj\rtm.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\rtm.o</file>
<file>$PROJ_DIR$\Debug\Obj\finsh_error.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\mempool.o</file>
<file>$PROJ_DIR$\Debug\Obj\cpuport.pbi</file>
<file>$PROJ_DIR$\..\CMSIS\core_cm3.c</file>
<file>$PROJ_DIR$\..\CMSIS\system_mb9bf50x.c</file>
<file>$PROJ_DIR$\Debug\Obj\startup.o</file>
<file>$PROJ_DIR$\Debug\Obj\context_iar.o</file>
<file>$PROJ_DIR$\Debug\Obj\board.o</file>
<file>$PROJ_DIR$\Debug\Obj\timer.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\core_cm3.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\device.pbi</file>
<file>$PROJ_DIR$\Debug\Exe\fm3_easy_kit.out</file>
<file>$PROJ_DIR$\Debug\Obj\irq.pbi</file>
<file>$TOOLKIT_DIR$\inc\c\stdarg.h</file>
<file>$PROJ_DIR$\Debug\Obj\system_mb9bf50x.pbi</file>
<file>$PROJ_DIR$\Debug\Obj\timer.o</file>
<file>$TOOLKIT_DIR$\inc\c\DLib_Product_string.h</file>
<file>$PROJ_DIR$\Debug\Obj\startup.pbi</file>
<file>$PROJ_DIR$\application.c</file>
<file>$PROJ_DIR$\board.c</file>
<file>$PROJ_DIR$\console.c</file>
<file>$PROJ_DIR$\led.c</file>
<file>$PROJ_DIR$\serial.c</file>
<file>$PROJ_DIR$\startup.c</file>
<file>$PROJ_DIR$\Debug\Obj\led.o</file>
<file>$PROJ_DIR$\Debug\Obj\fm3_easy_kit.pbd</file>
<file>$PROJ_DIR$\Debug\Obj\ipc.o</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\symbol.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\shell.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_vm.h</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_vm.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_var.h</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_var.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_token.h</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_token.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_parser.h</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_parser.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_ops.h</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_ops.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_node.h</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_node.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_init.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_heap.h</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_heap.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh.h</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\cmd.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_compiler.c</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_error.h</file>
<file>$PROJ_DIR$\..\..\..\components\finsh\finsh_error.c</file>
</outputs>
<file>
<name>$PROJ_DIR$\..\..\..\libcpu\arm\fm3\fault_iar.S</name>
<outputs>
<tool>
<name>AARM</name>
<file> 101</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\libcpu\arm\fm3\start_iar.S</name>
<outputs>
<tool>
<name>AARM</name>
<file> 92</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\object.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 7</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 95</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\libcpu\arm\fm3\context_iar.S</name>
<outputs>
<tool>
<name>AARM</name>
<file> 113</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\scheduler.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 83</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 12</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\libcpu\arm\fm3\cpuport.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 109</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 27</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\slab.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 100</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 91</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\rtm.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 105</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 106</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\timer.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 115</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 122</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\thread.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 40</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 76</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\idle.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 103</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 86</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\mempool.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 102</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 108</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\module.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 9</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 98</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\ipc.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 10</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 133</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\kservice.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 94</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 41</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\mem.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 14</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 11</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\irq.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 119</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 88</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\device.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 117</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 90</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\src\clock.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 82</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 89</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\CMSIS\core_cm3.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 116</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 93</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 22 16 20 21 19 18 17</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\CMSIS\system_mb9bf50x.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 121</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 97</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 6 3 22 16 20 21 19 18 17 5 96 2 1</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\application.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 8</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 99</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\board.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 24</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 114</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\console.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 85</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 29</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\led.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 25</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 131</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\serial.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 84</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 81</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\startup.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 124</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 112</file>
</tool>
</outputs>
</file>
<file>
<name>[ROOT_NODE]</name>
<outputs>
<tool>
<name>ILINK</name>
<file> 118</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\symbol.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 75</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 47</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\shell.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 74</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 52</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\finsh_vm.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 73</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 33</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\finsh_var.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 72</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 30</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 151 0 4 13 120 16 20 21 19 18 17 36 87 35 38 104 26 39 37 15 23 123 138</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\finsh_token.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 51</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 48</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 151 0 4 13 120 16 20 21 19 18 17 36 87 35 38 104 26 39 37 15 23 123 140 154</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\finsh_parser.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 77</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 44</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 151 0 4 13 120 16 20 21 19 18 17 36 87 35 38 104 26 39 37 15 23 123 140 146 154 142 138</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\finsh_ops.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 80</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 31</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 144 136 151 0 4 13 120 16 20 21 19 18 17 36 87 35 38 104 26 39 37 15 23 123 138</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\finsh_node.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 79</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 43</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 151 0 4 13 120 16 20 21 19 18 17 36 87 35 38 104 26 39 37 15 23 123 146 154 138 149</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\finsh_init.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 78</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 28</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 151 0 4 13 120 16 20 21 19 18 17 36 87 35 38 104 26 39 37 15 23 123 146 136 138 142 154 149</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\finsh_heap.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 45</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 49</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 151 0 4 13 120 16 20 21 19 18 17 36 87 35 38 104 26 39 37 15 23 123 138</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\cmd.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 34</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 50</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 0 4 13 120 16 20 21 19 18 17 151 36 87 35 38 104 26 39 37 15 23 123</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\finsh_compiler.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 42</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 46</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 151 0 4 13 120 16 20 21 19 18 17 36 87 35 38 104 26 39 37 15 23 123 146 154 138 144 136</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\components\finsh\finsh_error.c</name>
<outputs>
<tool>
<name>BICOMP</name>
<file> 107</file>
</tool>
<tool>
<name>ICCARM</name>
<file> 32</file>
</tool>
</outputs>
<inputs>
<tool>
<name>BICOMP</name>
<file> 154 151 0 4 13 120 16 20 21 19 18 17 36 87 35 38 104 26 39 37 15 23 123</file>
</tool>
</inputs>
</file>
</configuration>
<configuration>
<name>Release</name>
<outputs/>
<forcedrebuild>
<name>[MULTI_TOOL]</name>
<tool>ILINK</tool>
</forcedrebuild>
<forcedrebuild>
<name>[REBUILD_ALL]</name>
</forcedrebuild>
</configuration>
</project>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<workspace>
<project>
<path>$WS_DIR$\fm3_easy_kit.ewp</path>
</project>
<batchBuild/>
</workspace>

141
bsp/fm3/mb9b506r/led.c Normal file
View File

@ -0,0 +1,141 @@
/*
* File : led.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2011, RT-Thread Develop Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2011-03-03 lgnq
*/
#include <rtthread.h>
#include <rthw.h>
#include "mb9bf506r.h"
#include "led.h"
void rt_hw_led_on(rt_uint8_t num)
{
RT_ASSERT(num < LEDS_MAX_NUMBER);
switch (num)
{
case 1:
USER_LED_PDOR &= ~USER_LED1;
break;
case 2:
USER_LED_PDOR &= ~USER_LED2;
break;
case 3:
USER_LED_PDOR &= ~USER_LED3;
break;
default:
break;
}
}
void rt_hw_led_off(rt_uint8_t num)
{
RT_ASSERT(num < LEDS_MAX_NUMBER);
switch (num)
{
case 1:
USER_LED_PDOR |= USER_LED1;
break;
case 2:
USER_LED_PDOR |= USER_LED2;
break;
case 3:
USER_LED_PDOR |= USER_LED3;
break;
default:
break;
}
}
void rt_hw_led_toggle(rt_uint8_t num)
{
RT_ASSERT(num < LEDS_MAX_NUMBER);
switch (num)
{
case 1:
if (USER_LED_PDOR&USER_LED1)
USER_LED_PDOR &= ~USER_LED1;
else
USER_LED_PDOR |= USER_LED1;
break;
case 2:
if (USER_LED_PDOR&USER_LED2)
USER_LED_PDOR &= ~USER_LED2;
else
USER_LED_PDOR |= USER_LED2;
break;
case 3:
if (USER_LED_PDOR&USER_LED3)
USER_LED_PDOR &= ~USER_LED3;
else
USER_LED_PDOR |= USER_LED3;
break;
default:
break;
}
}
void led_init(void)
{
/*Select CPIO function*/
USER_LED_PFR &= ~USER_LED_MASK;
/* disable analog input */
FM3_GPIO->ADE &= ~USER_LED_MASK;
/*Set CPIO Pull-Up function*/
USER_LED_PCR |= USER_LED_MASK;
/*Make led pins outputs*/
USER_LED_DDR |= USER_LED_MASK;
USER_LED_PDOR |= USER_LED_MASK;
}
void pwm_update(rt_uint16_t value)
{
FM3_BT2_PWM->PDUT = value;
}
static void led1_thread_entry(void *parameter)
{
while (1)
{
rt_hw_led_toggle(1);
rt_thread_delay(RT_TICK_PER_SECOND);
}
}
static void led2_thread_entry(void *parameter)
{
while (1)
{
rt_hw_led_toggle(2);
rt_thread_delay(RT_TICK_PER_SECOND/2);
}
}
static rt_thread_t led1_thread;
static rt_thread_t led2_thread;
void rt_hw_led_init(void)
{
led_init();
led1_thread = rt_thread_create("led1", led1_thread_entry, RT_NULL, 384, 29, 5);
if (led1_thread != RT_NULL)
rt_thread_startup(led1_thread);
led2_thread = rt_thread_create("led2", led2_thread_entry, RT_NULL, 384, 30, 5);
if (led2_thread != RT_NULL)
rt_thread_startup(led2_thread);
}

43
bsp/fm3/mb9b506r/led.h Normal file
View File

@ -0,0 +1,43 @@
/*
* File : led.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2011, RT-Thread Develop Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2011-03-03 lgnq
*/
#ifndef __LED_H__
#define __LED_H__
#include "mb9bf506r.h"
#define LEDS_MAX_NUMBER 4
/* LED */
#define USER_LED1 (1UL<<0x9)
#define USER_LED2 (1UL<<0xa)
#define USER_LED3 (1UL<<0xb)
#define USER_LED_MASK (USER_LED1 | USER_LED2 | USER_LED3)
#define USER_LED_PFR FM3_GPIO->PFR1
#define USER_LED_PCR FM3_GPIO->PCR1
#define USER_LED_PDOR FM3_GPIO->PDOR1
#define USER_LED_DDR FM3_GPIO->DDR1
#define RT_DEVICE_CTRL_LED_ON 0
#define RT_DEVICE_CTRL_LED_OFF 1
#define RT_DEVICE_CTRL_LED_TOGGLE 2
void rt_hw_led_init(void);
void rt_hw_led_on(rt_uint8_t num);
void rt_hw_led_off(rt_uint8_t num);
void rt_hw_led_toggle(rt_uint8_t num);
void pwm_update(rt_uint16_t value);
#endif

View File

@ -0,0 +1,33 @@
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x00000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0007FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x1FFF8000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__ = 0;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
do not initialize { section .noinit };
keep { section FSymTab };
keep { section VSymTab };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block HEAP };

120
bsp/fm3/mb9b506r/rtconfig.h Normal file
View File

@ -0,0 +1,120 @@
/* RT-Thread config file */
#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__
/* RT_NAME_MAX*/
#define RT_NAME_MAX 8
/* RT_ALIGN_SIZE*/
#define RT_ALIGN_SIZE 4
/* PRIORITY_MAX */
#define RT_THREAD_PRIORITY_MAX 32
/* Tick per Second */
#define RT_TICK_PER_SECOND 100
/* SECTION: RT_DEBUG */
/* Thread Debug */
#define RT_DEBUG
#define RT_USING_OVERFLOW_CHECK
/* Using Hook */
#define RT_USING_HOOK
/* SECTION: IPC */
/* Using Semaphore */
#define RT_USING_SEMAPHORE
/* Using Mutex */
#define RT_USING_MUTEX
/* Using Event */
#define RT_USING_EVENT
/* Using MailBox */
#define RT_USING_MAILBOX
/* Using Message Queue */
#define RT_USING_MESSAGEQUEUE
/* SECTION: Memory Management */
/* Using Memory Pool Management*/
#define RT_USING_MEMPOOL
/* Using Dynamic Heap Management */
#define RT_USING_HEAP
/* Using Small MM */
#define RT_USING_SMALL_MEM
/* SECTION: Device System */
/* Using Device System */
#define RT_USING_DEVICE
/* RT_USING_UART */
#define RT_USING_UART2
#define RT_UART_RX_BUFFER_SIZE 64
/* SECTION: Console options */
//#define RT_TINY_SIZE
#define RT_USING_CONSOLE
/* the buffer size of console */
#define RT_CONSOLEBUF_SIZE 128
/* SECTION: finsh, a C-Express shell */
/* Using FinSH as Shell*/
#define RT_USING_FINSH
/* Using symbol table */
#define FINSH_USING_SYMTAB
#define FINSH_USING_DESCRIPTION
#define FINSH_THREAD_STACK_SIZE 4096
/* SECTION: Device filesystem support */
/* using DFS support */
/* #define RT_USING_DFS */
/* #define RT_USING_DFS_ELMFAT */
/* use long file name feature */
#define RT_DFS_ELM_USE_LFN 1
/* the max number of file length */
#define RT_DFS_ELM_MAX_LFN 32
/* #define RT_USING_DFS_YAFFS2 */
/* #define RT_USING_DFS_UFFS */
/* #define RT_USING_DFS_DEVFS */
//#define RT_USING_DFS_NFS
//#define RT_NFS_HOST_EXPORT "192.168.1.5:/"
#define DFS_USING_WORKDIR
/* the max number of mounted filesystem */
#define DFS_FILESYSTEMS_MAX 4
/* the max number of opened files */
#define DFS_FD_MAX 16
/* the max number of cached sector */
#define DFS_CACHE_MAX_NUM 4
/* SECTION: RTGUI support */
/* using RTGUI support */
//#define RT_USING_RTGUI
/* name length of RTGUI object */
#define RTGUI_NAME_MAX 16
/* support 16 weight font */
//#define RTGUI_USING_FONT16
/* support 12 weight font */
#define RTGUI_USING_FONT12
/* support Chinese font */
//#define RTGUI_USING_FONTHZ
/* use DFS as file interface */
//#define RTGUI_USING_DFS_FILERW
/* use font file as Chinese font */
/* #define RTGUI_USING_HZ_FILE */
/* use Chinese bitmap font */
//#define RTGUI_USING_HZ_BMP
/* use small size in RTGUI */
//#define RTGUI_USING_SMALL_SIZE
/* use mouse cursor */
/* #define RTGUI_USING_MOUSE_CURSOR */
#define RTGUI_DEFAULT_FONT_SIZE 12
#endif

283
bsp/fm3/mb9b506r/serial.c Normal file
View File

@ -0,0 +1,283 @@
/*
* File : serial.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://openlab.rt-thread.com/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2006-03-13 Bernard first version
* 2009-04-20 yi.qiu modified according bernard's stm32 version
*/
#include <rtthread.h>
#include "serial.h"
/**
* @addtogroup FM3 MB9B500
*/
/*@{*/
/* RT-Thread Device Interface */
/**
* This function initializes serial
*/
static rt_err_t rt_serial_init (rt_device_t dev)
{
struct serial_device* uart = (struct serial_device*) dev->user_data;
if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
{
if (dev->flag & RT_DEVICE_FLAG_INT_RX)
{
rt_memset(uart->int_rx->rx_buffer, 0,
sizeof(uart->int_rx->rx_buffer));
uart->int_rx->read_index = uart->int_rx->save_index = 0;
}
if (dev->flag & RT_DEVICE_FLAG_INT_TX)
{
rt_memset(uart->int_tx->tx_buffer, 0,
sizeof(uart->int_tx->tx_buffer));
uart->int_tx->write_index = uart->int_tx->save_index = 0;
}
dev->flag |= RT_DEVICE_FLAG_ACTIVATED;
}
return RT_EOK;
}
/* save a char to serial buffer */
static void rt_serial_savechar(struct serial_device* uart, char ch)
{
rt_base_t level;
/* disable interrupt */
level = rt_hw_interrupt_disable();
uart->int_rx->rx_buffer[uart->int_rx->save_index] = ch;
uart->int_rx->save_index ++;
if (uart->int_rx->save_index >= UART_RX_BUFFER_SIZE)
uart->int_rx->save_index = 0;
/* if the next position is read index, discard this 'read char' */
if (uart->int_rx->save_index == uart->int_rx->read_index)
{
uart->int_rx->read_index ++;
if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE)
uart->int_rx->read_index = 0;
}
/* enable interrupt */
rt_hw_interrupt_enable(level);
}
static rt_err_t rt_serial_open(rt_device_t dev, rt_uint16_t oflag)
{
RT_ASSERT(dev != RT_NULL);
return RT_EOK;
}
static rt_err_t rt_serial_close(rt_device_t dev)
{
RT_ASSERT(dev != RT_NULL);
return RT_EOK;
}
static rt_size_t rt_serial_read (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
{
rt_uint8_t* ptr;
rt_err_t err_code;
struct serial_device* uart;
ptr = buffer;
err_code = RT_EOK;
uart = (struct serial_device*)dev->user_data;
if (dev->flag & RT_DEVICE_FLAG_INT_RX)
{
rt_base_t level;
/* interrupt mode Rx */
while (size)
{
if (uart->int_rx->read_index != uart->int_rx->save_index)
{
*ptr++ = uart->int_rx->rx_buffer[uart->int_rx->read_index];
size --;
/* disable interrupt */
level = rt_hw_interrupt_disable();
uart->int_rx->read_index ++;
if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE)
uart->int_rx->read_index = 0;
/* enable interrupt */
rt_hw_interrupt_enable(level);
}
else
{
/* set error code */
err_code = -RT_EEMPTY;
break;
}
}
}
else
{
/* polling mode */
while ((rt_uint32_t)ptr - (rt_uint32_t)buffer < size)
{
while (uart->uart_device->SSR & SSR_RDRF)
{
*ptr = uart->uart_device->RDR & 0xff;
ptr ++;
}
}
}
/* set error code */
rt_set_errno(err_code);
return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
}
static rt_size_t rt_serial_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
{
rt_uint8_t* ptr;
rt_err_t err_code;
struct serial_device* uart;
err_code = RT_EOK;
ptr = (rt_uint8_t*)buffer;
uart = (struct serial_device*)dev->user_data;
if (dev->flag & RT_DEVICE_FLAG_INT_TX)
{
/* interrupt mode Tx */
while (uart->int_tx->save_index != uart->int_tx->write_index)
{
/* save on tx buffer */
uart->int_tx->tx_buffer[uart->int_tx->save_index] = *ptr++;
-- size;
/* move to next position */
uart->int_tx->save_index ++;
/* wrap save index */
if (uart->int_tx->save_index >= UART_TX_BUFFER_SIZE)
uart->int_tx->save_index = 0;
}
/* set error code */
if (size > 0)
err_code = -RT_EFULL;
}
else
{
/* polling mode */
while (size)
{
/*
* to be polite with serial console add a line feed
* to the carriage return character
*/
if (*ptr == '\n' && (dev->flag & RT_DEVICE_FLAG_STREAM))
{
while (!(uart->uart_device->SSR & SSR_TDRE));
uart->uart_device->TDR = '\r';
}
while (!(uart->uart_device->SSR & SSR_TDRE));
uart->uart_device->TDR = (*ptr & 0x1FF);
++ptr; --size;
}
}
/* set error code */
rt_set_errno(err_code);
return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
}
static rt_err_t rt_serial_control (rt_device_t dev, rt_uint8_t cmd, void *args)
{
RT_ASSERT(dev != RT_NULL);
switch (cmd)
{
case RT_DEVICE_CTRL_SUSPEND:
/* suspend device */
dev->flag |= RT_DEVICE_FLAG_SUSPENDED;
break;
case RT_DEVICE_CTRL_RESUME:
/* resume device */
dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED;
break;
}
return RT_EOK;
}
/*
* serial register
*/
rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct serial_device *serial)
{
RT_ASSERT(device != RT_NULL);
device->type = RT_Device_Class_Char;
device->rx_indicate = RT_NULL;
device->tx_complete = RT_NULL;
device->init = rt_serial_init;
device->open = rt_serial_open;
device->close = rt_serial_close;
device->read = rt_serial_read;
device->write = rt_serial_write;
device->control = rt_serial_control;
device->user_data = serial;
/* register a character device */
return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag);
}
/* ISR for serial interrupt */
void rt_hw_serial_isr(rt_device_t device)
{
struct serial_device* uart = (struct serial_device*) device->user_data;
/* interrupt mode receive */
RT_ASSERT(device->flag & RT_DEVICE_FLAG_INT_RX);
/* save on rx buffer */
while (uart->uart_device->SSR & SSR_RDRF)
{
rt_serial_savechar(uart, uart->uart_device->RDR & 0xff);
}
/* invoke callback */
if (device->rx_indicate != RT_NULL)
{
rt_size_t rx_length;
/* get rx length */
rx_length = uart->int_rx->read_index > uart->int_rx->save_index ?
UART_RX_BUFFER_SIZE - uart->int_rx->read_index + uart->int_rx->save_index :
uart->int_rx->save_index - uart->int_rx->read_index;
device->rx_indicate(device, rx_length);
}
}
/*@}*/

84
bsp/fm3/mb9b506r/serial.h Normal file
View File

@ -0,0 +1,84 @@
#ifndef __RT_HW_SERIAL_H__
#define __RT_HW_SERIAL_H__
#include <rthw.h>
#include <rtthread.h>
#include "mb9bf506r.h"
#define SMR_SOE 0x01U
#define SMR_BDS 0x04U
#define SMR_SBL 0x08U
#define SMR_WUCR 0x10U
#define SMR_MD_UART 0x00U
#define SMR_MD_UART_MP 0x20U
#define SMR_MD_SIO 0x40U
#define SMR_MD_LIN 0x60U
#define SMR_MD_I2C 0x80U
#define SCR_TXE 0x01U
#define SCR_RXE 0x02U
#define SCR_TBIE 0x04U
#define SCR_TIE 0x08U
#define SCR_RIE 0x10U
#define SCR_UPGL 0x80U
#define SSR_TBI 0x01U
#define SSR_TDRE 0x02U
#define SSR_RDRF 0x04U
#define SSR_ORE 0x08U
#define SSR_FRE 0x10U
#define SSR_PE 0x20U
#define SSR_REC 0x80U
#define ESCR_P 0x08U
#define ESCR_PEN 0x10U
#define ESCR_INV 0x20U
#define ESCR_ESBL 0x40U
#define ESCR_FLWEN 0x80U
#define ESCR_DATABITS_8 0x00U
#define ESCR_DATABITS_5 0x01U
#define ESCR_DATABITS_6 0x02U
#define ESCR_DATABITS_7 0x03U
#define ESCR_DATABITS_9 0x04U
#define BPS 115200 /* serial baudrate */
#define UART_RX_BUFFER_SIZE 64
#define UART_TX_BUFFER_SIZE 64
struct serial_int_rx
{
rt_uint8_t rx_buffer[UART_RX_BUFFER_SIZE];
rt_uint32_t read_index, save_index;
};
struct serial_int_tx
{
rt_uint8_t tx_buffer[UART_TX_BUFFER_SIZE];
rt_uint32_t write_index, save_index;
};
/*
* Enable/DISABLE Interrupt Controller
*/
/* deviation from MISRA-C:2004 Rule 19.7 */
#define UART_ENABLE_IRQ(n) NVIC_EnableIRQ((n))
#define UART_DISABLE_IRQ(n) NVIC_DisableIRQ((n))
struct serial_device
{
FM3_MFS03_UART_TypeDef* uart_device;
/* rx structure */
struct serial_int_rx* int_rx;
/* tx structure */
struct serial_int_tx* int_tx;
};
rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct serial_device *serial);
void rt_hw_serial_isr(rt_device_t device);
#endif

143
bsp/fm3/mb9b506r/startup.c Normal file
View File

@ -0,0 +1,143 @@
/*
* File : startup.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2009 - 2011, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2011-02-24 Bernard first implementation
*/
#include <rthw.h>
#include <rtthread.h>
#include "board.h"
#include "mb9bf506r.h"
#ifdef RT_USING_FINSH
#include <finsh.h>
#endif
/**
* @addtogroup FM3
*/
extern struct serial_device uart0;
extern struct rt_device uart0_device;
extern struct serial_device uart2;
extern struct rt_device uart2_device;
/*@{*/
extern int rt_application_init(void);
#ifdef RT_USING_FINSH
extern void finsh_system_init(void);
#endif
#ifdef __CC_ARM
extern int Image$$RW_IRAM1$$ZI$$Limit;
#elif __ICCARM__
#pragma section="HEAP"
#else
extern int __bss_end;
#endif
/**
* This function will startup RT-Thread RTOS.
*/
void rtthread_startup(void)
{
/* init board */
rt_hw_board_init();
/* show version */
rt_show_version();
/* init tick */
rt_system_tick_init();
/* init kernel object */
rt_system_object_init();
/* init timer system */
rt_system_timer_init();
#ifdef RT_USING_HEAP
#ifdef __CC_ARM
rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)FM3_SRAM_END);
#elif __ICCARM__
rt_system_heap_init(__segment_end("HEAP"), (void*)FM3_SRAM_END);
#else
/* init memory system */
rt_system_heap_init((void*)&__bss_end, (void*)FM3_SRAM_END);
#endif
#endif
/* init scheduler system */
rt_system_scheduler_init();
#ifdef RT_USING_DEVICE
/* register uart0 */
rt_hw_serial_register(&uart0_device, "uart0",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,
&uart0);
/* register uart2, used for RTI debug */
rt_hw_serial_register(&uart2_device, "uart2",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,
&uart2);
#ifdef RT_USING_DFS
#ifdef RT_USING_DFS_UFFS
rt_hw_nand_init();
#endif
#endif
/*init all registed devices */
rt_device_init_all();
#endif
/* init application */
rt_application_init();
#ifdef RT_USING_FINSH
/* init finsh */
finsh_system_init();
#ifdef RT_USING_DEVICE
finsh_set_device("uart2");
#endif
#endif
/* init timer thread */
rt_system_timer_thread_init();
/* init idle thread */
rt_thread_idle_init();
/* start scheduler */
rt_system_scheduler_start();
/* never reach here */
return ;
}
int main(void)
{
rt_uint32_t UNUSED level;
/* disable interrupt first */
level = rt_hw_interrupt_disable();
/* init system setting */
SystemInit();
/* startup RT-Thread RTOS */
rtthread_startup();
return 0;
}
/*@}*/

View File

@ -49,6 +49,7 @@
IMPORT rt_hw_hard_fault
IMPORT rt_hw_pend_sv
IMPORT rt_hw_timer_handler
IMPORT rt_hw_uart2_rx_handler
PUBLIC __low_level_init
@ -108,7 +109,7 @@ __vector_table
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD rt_hw_uart2_rx_handler
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4