かなり面白い記事発見。
http://myokota.github.com/qemu-a800eva/
Armadillo800EVA のQEMU エミュレータが公開されています。
initramfs で動作する例がしめされています。
ここでは、偽IOを仕立て、CF-IDEとLAN9118を追加し、FileSystemとNetworkを利用可能にします。
--- qemu-a800eva-master/hw/a800eva.c Wed Aug 08 03:58:20 2012
+++ qemu-a800eva-master/hw/a800eva.c
@@ -16,6 +16,11 @@
#include "arm-misc.h"
#include "exec-memory.h"
#include "boards.h"
+#include "loader.h"
+#include "devices.h"
+#include "net.h"
+#include "ide.h"
+#include "blockdev.h"
#define SDRAM_START (0x40000000)
#define SDRAM_SIZE (0x20000000)
@@ -47,6 +52,7 @@
MemoryRegion *sram = g_new(MemoryRegion, 1);
DeviceState *dev;
SysBusDevice *busdev;
+ DriveInfo *dinfo;
qemu_irq *irqp;
qemu_irq pic[128];
qemu_irq cpu_irq;
@@ -95,6 +101,15 @@
sysbus_create_varargs("sh,cmt", 0xe6138000,
pic[58], pic[59], pic[60],
pic[61], pic[62], NULL);
+
+/* IDE */
+ dinfo = drive_get(IF_IDE,0,0);
+ mmio_ide_init(0xe9201000, 0xe920200c, sysmem, pic[65], 1,
+ dinfo, NULL);/* ATAPI IRQ */
+/* GbEther */
+ if(nd_table[0].used) {
+ lan9118_init(&nd_table[0],0xe9200000,pic[110]);
+ }
a800_binfo.ram_size = ram_size;
a800_binfo.kernel_filename = kernel_filename;
---------------------------------------------------------------
--- linux-2.6.35-a800eva-at3/arch/arm/mach-shmobile/board-armadillo800eva.c Fri Jul 27 16:00:51 2012
+++ linux-2.6.35-a800eva-at3/arch/arm/mach-shmobile/board-armadillo800eva.c
@@ -42,6 +42,8 @@
#include <media/soc_camera.h>
#include <media/soc_camera_platform.h>
+#include <linux/ata_platform.h>
+
#include <video/sh_mobile_lcdc.h>
#include <sound/sh_fsi.h>
@@ -62,40 +64,66 @@
__raw_writeb(0x00, addr);
}
-static struct sh_eth_plat_data sh_eth_platdata = {
- .phy = 0x00,
- .edmac_endian = EDMAC_LITTLE_ENDIAN,
- .register_type = SH_ETH_REG_GIGABIT,
+static struct smsc911x_platform_config smsc_eth_platdata = {
+ .flags = SMSC911X_USE_32BIT,
+ .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH,
+ .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
.phy_interface = PHY_INTERFACE_MODE_MII,
};
-static struct resource sh_eth_resources[] = {
- {
- .start = 0xe9a00000,
- .end = 0xe9a00800 - 1,
- .flags = IORESOURCE_MEM,
- },
+static struct resource smsc_eth_resources[] = {
{
- .start = 0xe9a01800,
- .end = 0xe9a02000 - 1,
+ .start = 0xe9200000,
+ .end = 0xe9200fff,
.flags = IORESOURCE_MEM,
},
{
- .start = gic_spi(110),
+ .start = gic_spi(110), /* GbEth */
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device eth_device = {
- .name = "sh-eth",
- .id = 0,
+ .name = "smsc911x",
+ .id = -1,
.dev = {
- .platform_data = &sh_eth_platdata,
+ .platform_data = &smsc_eth_platdata,
+ },
+ .resource = smsc_eth_resources,
+ .num_resources = ARRAY_SIZE(smsc_eth_resources),
+};
+
+static struct resource cf_ide_resources[] = {
+ [0] = {
+ .start = 0xe9200000 + 0x1000,
+ .end = 0xe9200000 + 0x1000 + 0x10 - 0x2,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ .start = 0xe9200000 + 0x200c,
+ .end = 0xe9200000 + 0x200c,
+ .flags = IORESOURCE_MEM,
+ },
+ [2] = {
+ .start = gic_spi(65), /* ATAPI */
+ .flags = IORESOURCE_IRQ,
},
- .resource = sh_eth_resources,
- .num_resources = ARRAY_SIZE(sh_eth_resources),
};
+static struct pata_platform_info pata_info = {
+ .ioport_shift = 1,
+};
+
+static struct platform_device cf_ide_device = {
+ .name = "pata_platform",
+ .id = -1,
+ .num_resources = ARRAY_SIZE(cf_ide_resources),
+ .resource = cf_ide_resources,
+ .dev = {
+ .platform_data = &pata_info,
+ },
+};
+#ifdef CONFIG_MMC
static void sdhi0_set_pwr(struct platform_device *pdev, int state)
{
/* todo */
@@ -271,7 +299,7 @@
.num_resources = ARRAY_SIZE(sh_mmcif_resources),
.resource = sh_mmcif_resources,
};
-
+#endif
static struct sh_fsi_dma sh_fsi2_dma = {
.dma_porta_tx = {
.slave_id = SHDMA_SLAVE_FSIA_TX,
@@ -1065,9 +1093,12 @@
static struct platform_device *rma1evb_devices[] __initdata = {
ð_device,
+ &cf_ide_device, /* QEMU */
+#ifdef CONFIG_MMC
&sh_mmcif_device,
&sdhi0_device,
&sdhi1_device,
+#endif
&ohci_device,
&ehci_device,
&hdmi_device,
---------------------------------------------------------------
注意点
linux 側 Config
メモリ設定を256Mbyte(0x10000000)
CD-IDEは Device->ATA->Plaform Driver for IDE interface
LAN9118はDevice->Network->Ethernet(19..)->SMSC_LAN911x/LAN921x
rootfsの作成は以下を参考にしました。
http://memo.saitodev.com/home/arm/arm_emulation/
/dev/mapper/nbd0p1 に
debian-squeeze_xxx20120727.tar.gz
を展開します。
---------------------------------------------------------------
起動例
./qemu-a800eva-master/arm-softmmu/qemu-system-arm \
-m 256M -M a800eva \
-kernel ./linux-2.6.35-a800eva-at3/arch/arm/boot/uImage \
-hda hda.qcow2 \
-append "console=ttySC1 root=/dev/hda1" \
-nographic \
-serial telnet:0.0.0.0:1200,server \
-net nic,model=lan9118 \
-net user -redir tcp:5555::22
guest OSが起動できたら
/etc/network/interfaces ?に
allow-hotplug eth0
iface eth0 inet dhcp
を追加し、再起動し、その後 時刻設定を行い、
#apt-get update
# apt-get install ssh
など行います。
[記事が壊れたので、再投稿 2012.11.16]
2012年11月16日金曜日
a800eva qemu 偽IO追加
2012年8月11日土曜日
RSPI on RX63N
GR-SAKURA ボードで CQPUB RX62Nのコード
http://www.kumikomi.net/interface/editors/2011/04/6cd-romrx62n.php
mp3p_rx62n_hew.zip を RX63Nで動作させようとしたが、手間取ったので、記載しておきます。
要は、RSPI0.SPSR.BIT.SPRF,SPTEFビットが RX63Nで消えたのが問題で
ある人はRSPI0.SPSR.BIT.IDLNF ビットを流用していたので、真似てみたが、動きが怪しい。
やっぱり、IR(RSPI0,SPRI0) で見るしかないもんかというわけで、IR(RSPI0,SPRI0)をみるようにしてやっと動作確認できた。
初期化部は
http://www.kumikomi.net/interface/editors/2011/04/6cd-romrx62n.php
mp3p_rx62n_hew.zip を RX63Nで動作させようとしたが、手間取ったので、記載しておきます。
要は、RSPI0.SPSR.BIT.SPRF,SPTEFビットが RX63Nで消えたのが問題で
ある人はRSPI0.SPSR.BIT.IDLNF ビットを流用していたので、真似てみたが、動きが怪しい。
やっぱり、IR(RSPI0,SPRI0) で見るしかないもんかというわけで、IR(RSPI0,SPRI0)をみるようにしてやっと動作確認できた。
初期化部は
/* CS#(PC0/SSLA1)をLにする(RSPI_CH=0のとき) */ static void CS_LOW() { PORTC.PODR.BIT.B0 = 0; } /* CS#(PC0/SSLA1)をHにする(RSPI_CH=0のとき) */ static void CS_HIGH() { PORTC.PODR.BIT.B0 = 1; } //#define INS (!PORT1.PIDR.BIT.B5) /* SD_CD(P15)カード検出(真:あり, 偽:なし) */ //#define WP 0 /* 書き込み禁止(真:禁止, 偽:許可) */ static void CS_INIT() { /* CS#,INS#,WP 各端子の初期化(RSPI_CH=0のとき) */ PORTC.PMR.BIT.B0 = 0; /* CS#=GPIO */ PORTC.PDR.BIT.B0 = 1; /* CS#=OUT */ PORTC.PODR.BIT.B0 = 1; /* CS#=H */ } void SPI_ATTACH() { SYSTEM.PRCR.WORD = 0xA502; MSTP(RSPI0)=0; SYSTEM.PRCR.WORD = 0xA500; PORTC.PMR.BIT.B5 = 0; PORTC.PMR.BIT.B6 = 0; PORTC.PMR.BIT.B7 = 0; MPC.PWPR.BIT.B0WI = 0; MPC.PWPR.BIT.PFSWE = 1; MPC.PC5PFS.BYTE = 13; /* RSPI RSPCKA */ MPC.PC6PFS.BYTE = 13; /* RSPI MOSIA */ MPC.PC7PFS.BYTE = 13; /* RSPI MISOA */ MPC.PWPR.BIT.PFSWE = 0; PORTC.ODR0.BYTE = 0; /* CMOS */ PORTC.ODR1.BYTE = 0; /* CMOS */ PORTC.PMR.BIT.B5 = 1; PORTC.PMR.BIT.B6 = 1; PORTC.PMR.BIT.B7 = 1; IPR(RSPI0,SPRI0)=0; IEN(RSPI0,SPRI0)=0; }送受信部(他3箇所も修正)
/* Receive a byte */ static BYTE rcvr_spi (void) { BYTE c; + IR(RSPI0,SPRI0)=0; RSPI0.SPDR = 0xFF; /* Send a 0xFF */ - while (!RSPI.SPSR.BIT.SPRF) ; /* Wait for end of transfer */ + while (!IR(RSPI0,SPRI0)) ; /* Wait for end of transfer */ return RSPI0.SPDR; /* Returen received byte */ }電源ON部
static void power_on (void) /* Enable SPI */ { CS_INIT(); /* Attach RSPI module to I/O pads */ SPI_ATTACH(); /* Initialize RSPI module */ RSPI0.SPCR.BYTE = 0; /* Stop SPI */ RSPI0.SPSR.BYTE = 0xa0; RSPI0.SPPCR.BYTE = 0x00; /* Fixed idle value, disable loop-back mode */ RSPI0.SPSCR.BYTE = 0; /* Disable sequence control */ RSPI0.SPDCR.BYTE = 0x20; /* SPLW=1 */ RSPI0.SPCMD0.WORD = 0x0700; /* LSBF=0, SPB=7, BRDV=0, CPOL=0, CPHA=0 */ RSPI0.SPBR.BYTE = (PCLK / 2 / CLK_SLOW )- 1; /* Bit rate */ - RSPI0.SPCR.BYTE = 0x49; /* Start SPI in master mode */ + RSPI0.SPCR.BYTE = 0xC9; /* Start SPI in master mode w/SPRIE */ RSPI0.SPCR2.BYTE = 0; /* */ }
2012年8月2日木曜日
TNKernel for RX
https://github.com/msalov/TNKernel-RX
TNkernel の RX62N移植作業をやっているのを発見。
さっそく、RX621でためしたら、動作確認できた。
ボードは http://akizukidenshi.com/catalog/g/gK-05763/ これ。
気をよくして、RX63Nではどうか?
ボードは http://japan.renesas.com/products/promotion/gr/index.jsp これ。
結構はまった。
RX62NからRX63Nの違い
1) SYSTEM.SCKCR の下位bitは仕様書では 00000000bなのだが、その値ではクロックが動作しない
そこで、FreeRTOSの RX63Nのソースを見ると、00010001bにしているではないか。
2) クロック関連レジスタを触る際は SYSTEM.PRCR レジスタでアクセス解除が必要。
MSTP(RTC)などの箇所の前後にアクセス解除と禁止をいれる必要あり。
(RX63N UM 表13.1 PRCRレジスタと保護されるレジスタの対応 参照)
3) MPC ポート機能設定の前後で、MPC.PWPRでのアクセス解除が必要、具体的には PxnPFSレジスタの設定時。
(RX63N UM 22.4.2 MPCレジスタ設定する場合の注意事項 参照)
4) RTC関連レジスタでIODEFINE.H でビットフィールド定義されているレジスタをそのまま、アクセスは危険。
たとえば
RTC.RCR1.BIT.PES = 6; /* Set periodic interrupts frequency to 256 Hz */
RTC.RCR1.BIT.PIE = 1; /* Enable periodic interrupts */
ではなく
RTC.RCR1.BYTE = 0x64;
while(0x64 != RTC.RCR1.BYTE) ;
と書く。
要は、書いた値が反映されるまでは、新しい値を書いたらダメということ。
(RX63N UM 29.2.17 RTCコントロールレジスタ1(RCR1)
...
AIE、PIE、PES[3:0]ビットは、カウントソースに同期して更新されます。RCR1レジスタを書き換えた場 合は、全ビットの値が更新されたことを確認してから次の処理を実行してください
...
RX62Nにはそんな制限なかった)
コンパイラは nahitechさんのと、kpit gnu toolで確認。
あっ、IODEFINE.H は GR-SAKURA のWEBコンパイル環境から落としました。
TNkernel の RX62N移植作業をやっているのを発見。
さっそく、RX621でためしたら、動作確認できた。
ボードは http://akizukidenshi.com/catalog/g/gK-05763/ これ。
気をよくして、RX63Nではどうか?
ボードは http://japan.renesas.com/products/promotion/gr/index.jsp これ。
結構はまった。
RX62NからRX63Nの違い
1) SYSTEM.SCKCR の下位bitは仕様書では 00000000bなのだが、その値ではクロックが動作しない
そこで、FreeRTOSの RX63Nのソースを見ると、00010001bにしているではないか。
2) クロック関連レジスタを触る際は SYSTEM.PRCR レジスタでアクセス解除が必要。
MSTP(RTC)などの箇所の前後にアクセス解除と禁止をいれる必要あり。
(RX63N UM 表13.1 PRCRレジスタと保護されるレジスタの対応 参照)
3) MPC ポート機能設定の前後で、MPC.PWPRでのアクセス解除が必要、具体的には PxnPFSレジスタの設定時。
(RX63N UM 22.4.2 MPCレジスタ設定する場合の注意事項 参照)
4) RTC関連レジスタでIODEFINE.H でビットフィールド定義されているレジスタをそのまま、アクセスは危険。
たとえば
RTC.RCR1.BIT.PES = 6; /* Set periodic interrupts frequency to 256 Hz */
RTC.RCR1.BIT.PIE = 1; /* Enable periodic interrupts */
ではなく
RTC.RCR1.BYTE = 0x64;
while(0x64 != RTC.RCR1.BYTE) ;
と書く。
要は、書いた値が反映されるまでは、新しい値を書いたらダメということ。
(RX63N UM 29.2.17 RTCコントロールレジスタ1(RCR1)
...
AIE、PIE、PES[3:0]ビットは、カウントソースに同期して更新されます。RCR1レジスタを書き換えた場 合は、全ビットの値が更新されたことを確認してから次の処理を実行してください
...
RX62Nにはそんな制限なかった)
コンパイラは nahitechさんのと、kpit gnu toolで確認。
あっ、IODEFINE.H は GR-SAKURA のWEBコンパイル環境から落としました。
2011年9月8日木曜日
2011年9月2日金曜日
abZ80 on RX62N
RX62Nで Z80 を動作させている。
すごい面白い。
http://www.nextftp.com/abe/rx62n/index.html
20110518RX版では Z80 64KByte空間を RX62NのSRAMに56KByte,FCURAMに8KByte割り当てていますが
実際のところ、FRK-RX62Nに実装のRX62N7はカタログ値は
384KByte FlashROM, 64KByte SRAMですが
512Kbyte FlashROM, 96KByte SRAMが利用可能でした。
ので、FCURAMを使わずに、Z80メモリすべてをSRAMに割りつけます。
(あくまで、手持ちのボードでは使えましたというもの)
(E1 Debuggerでは RX62N8を選択するといいかも)
BZ80.c::
// z80 memory
#pragma section Z
uint8 Z80Memory[Z80_MEM_SIZE];
#pragma section
//uint8 *Z80Memory;
//uint8 *Z80Memory2;
(いや、そもそもFCURAMは名前と違い FLASHROMだよな~)
-----------
Z80サンプルプログラムを準備
sdcc cコンパイラをダウンロード
http://sdcc.sourceforge.net/
echo.c
/*
translate from z80tst.src
sdcc -mz80 echo.c
*/
__sfr __at 0x01 led_port;
__sfr __at 0x01 sio_status;
__sfr __at 0x00 sio_wdata;
__sfr __at 0x00 sio_rdata;
int main(){
char c;
char t;
led_port = 1;
t = 0;
while(1){
if(0 == sio_status){
c = sio_rdata;
sio_wdata = c;
t++;
led_port = t & 1;
}
}
}
sdcc -mz80 echo.c
できた echo.ihx を tereterm 画面にドロップしますと、コードを実行します。
すごい面白い。
http://www.nextftp.com/abe/rx62n/index.html
20110518RX版では Z80 64KByte空間を RX62NのSRAMに56KByte,FCURAMに8KByte割り当てていますが
実際のところ、FRK-RX62Nに実装のRX62N7はカタログ値は
384KByte FlashROM, 64KByte SRAMですが
512Kbyte FlashROM, 96KByte SRAMが利用可能でした。
ので、FCURAMを使わずに、Z80メモリすべてをSRAMに割りつけます。
(あくまで、手持ちのボードでは使えましたというもの)
(E1 Debuggerでは RX62N8を選択するといいかも)

BZ80.c::
// z80 memory
#pragma section Z
uint8 Z80Memory[Z80_MEM_SIZE];
#pragma section
//uint8 *Z80Memory;
//uint8 *Z80Memory2;
(いや、そもそもFCURAMは名前と違い FLASHROMだよな~)
-----------
Z80サンプルプログラムを準備
sdcc cコンパイラをダウンロード
http://sdcc.sourceforge.net/
echo.c
/*
translate from z80tst.src
sdcc -mz80 echo.c
*/
__sfr __at 0x01 led_port;
__sfr __at 0x01 sio_status;
__sfr __at 0x00 sio_wdata;
__sfr __at 0x00 sio_rdata;
int main(){
char c;
char t;
led_port = 1;
t = 0;
while(1){
if(0 == sio_status){
c = sio_rdata;
sio_wdata = c;
t++;
led_port = t & 1;
}
}
}
sdcc -mz80 echo.c
できた echo.ihx を tereterm 画面にドロップしますと、コードを実行します。

2011年8月18日木曜日
HOS for RX62N
今更ながら、HOS for RX62N を見つけた
http://sourceforge.jp/forum/message.php?msg_id=57491
から RX62N 該当部をダウンロード
HOS本体を
http://sourceforge.jp/cvs/view/hos/hos/hos-v4/
から Download GNU tarballでダウンロード
rx-elf-gcc は nahitafuさんのコンパイル版を利用
http://www.tokudenkairo.co.jp/rxmega/download.html
USB CDCソースを確認
hos-v4/app/RX62N/usbcdc/CDC/usbdescriptors.c
#define VID 0x1234
#define PID 0x5678
をゴニョゴニョする
ここに Windows7(Vista)でのUSB CDCのinfの話題あり
http://www.renesasrulz.com/message/13581
で Windows7 64bitで USB Serial接続できました。
開発環境:
cygwin+gcc 4.6.1+ FDT 4.07 Basic
(でも、実は HOS-V4ではなく HOS-V4aと勘違いしてた。)
http://sourceforge.jp/forum/message.php?msg_id=57491
から RX62N 該当部をダウンロード
HOS本体を
http://sourceforge.jp/cvs/view/hos/hos/hos-v4/
から Download GNU tarballでダウンロード
rx-elf-gcc は nahitafuさんのコンパイル版を利用
http://www.tokudenkairo.co.jp/rxmega/download.html
USB CDCソースを確認
hos-v4/app/RX62N/usbcdc/CDC/usbdescriptors.c
#define VID 0x1234
#define PID 0x5678
をゴニョゴニョする
ここに Windows7(Vista)でのUSB CDCのinfの話題あり
http://www.renesasrulz.com/message/13581
で Windows7 64bitで USB Serial接続できました。
開発環境:
cygwin+gcc 4.6.1+ FDT 4.07 Basic

(でも、実は HOS-V4ではなく HOS-V4aと勘違いしてた。)
2011年8月17日水曜日
Cortex-M0 NUC120-SDKボード味見(4)
NUC120 SDK で HOS-V4a -2011-0405を眺めています。
-----
HOS では Idle 時_kernel_wai_int()が呼ばれるようです。
kernel/source/arch/proc/arm/arm_v6m/gcc/kwai_int.S
_kernel_wai_int: /* WaitForInterrupt */
+ wfi
b _kernel_wai_int
.size _kernel_wai_int, .-_kernel_wai_int
で wfi命令(sleep)を追加してみました。
効果は CPU48MHz SysTick 1ms周期で wfi命令なし130mA, wfi命令あり100mA と消費電力が低減しました。
----
I2C0(PA8.SDC,PA9.SCL)に 温度センサーLM73を接続してみました。
LM73は http://www.digikey.jp/ で購入しました。
sample/arm/nuc120/i2c0_lm73.c
/**
* Sample program for Hyper Operating System V4 Advance
*
* @file sample.c
* @brief %jp{サンプルプログラム}%en{Sample program}
*
* Copyright (C) 1998-2011 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
#include
#include
#include "kernel.h"
#include "kernel_id.h"
#include "uart.h"
#include "nuc120_reg.h"
extern volatile long OSTick;
struct i2c_lm73_t {
unsigned short temperature;
char valid;
unsigned char ad;
unsigned char rd[2];
} lm73;
#define LM73_AD (0x49)
/** %jp{サンプルタスク} */
void Lm73_Task(VP_INT exinf)
{
lm73.ad = (LM73_AD<<1);
lm73.temperature=0;
/* I2C0 pin function */
*REG_GPA_MFP |= (3<<8);/* I2C0 */
/* I2C0 engine clock enable */
*REG_APBCLK |= (1 << 8); /* I2C0 CLK Enable */
/* I2C0 初期化 */
*REG_I2C0_I2CON = 0x08; /* clearing all flags */
*REG_I2C0_I2CON = 0xc0; /* Enable EI + ENS1 */
*REG_I2C0_I2CLK = 119;/* 100KHz */
ena_int(18);
for(;;)
{
lm73.valid=0;
*REG_I2C0_I2CON |= 0x20;/* STA */
dly_tsk (1000);
if(lm73.valid) { /* */
/** %jp{状態表示} */
wai_sem(SEMID_UART);
/* %jp{文字列生成} */
lm73.temperature=lm73.rd[0]<<8|lm73.rd[1];
printk("LM73: %3d.%02d\n",lm73.temperature>>7,100*(lm73.temperature>>5 & 3)/4);
sig_sem(SEMID_UART);
}
}
}
void
I20_ISR_8 ()
{
// printk("<08>");
/* Clear SI and Start flag */
*REG_I2C0_I2CON &= ~0x34; /* */
*REG_I2C0_I2CON |= 0x08; /* SIC */
/* Slave address + write */
*REG_I2C0_I2CDAT = lm73.ad;
}
void
I20_ISR_10 ()
{
// printk("<10>");
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
*REG_I2C0_I2CON &= ~0x34;
/* Slave address + read */
*REG_I2C0_I2CDAT = lm73.ad|1;
}
void
I20_ISR_18 ()
{
// printk("<18>");
/* Data to be transmitted */
*REG_I2C0_I2CDAT = 0x00;/* Reg 0 */
/* clear SI */
*REG_I2C0_I2CON |= 0x0c;
*REG_I2C0_I2CON &= ~0x20;
}
void
I20_ISR_20 ()
{
// printk("<20>");
/* Data to be transmitted */
*REG_I2C0_I2CDAT = 0x00;/* LM73 Reg 0 */
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
*REG_I2C0_I2CON &= ~0x34;
}
void
I20_ISR_28 ()
{
// printk("<28>");
/* Transmit stop condition */
*REG_I2C0_I2CON &= ~0x34;
/* clear SI */
*REG_I2C0_I2CON |= 0x28;
}
void
I20_ISR_30 ()
{
// printk("<30>");
/* clear SI */
*REG_I2C0_I2CON |= 0x18;
}
void
I20_ISR_38 ()
{
// printk("<38>");
/* clear SI */
*REG_I2C0_I2CON |= 0x8;
}
void
I20_ISR_40 ()
{
// printk("<40>");
/* clear SI */
*REG_I2C0_I2CON &= ~0x34;
*REG_I2C0_I2CON |= 0x08;
/* Transmit AA condition */
*REG_I2C0_I2CON |= 0x04;
}
void
I20_ISR_48 ()
{
// printk("<48>");
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
}
void
I20_ISR_50 ()
{
// printk("<50>");
lm73.rd[0]=*REG_I2C0_I2CDAT;
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
/* Transmit AA condition */
*REG_I2C0_I2CON &= ~0x24;
}
void
I20_ISR_58 ()
{
// printk("<58>");
lm73.rd[1]=*REG_I2C0_I2CDAT;
lm73.valid++;
/* clear SI */
*REG_I2C0_I2CON &= ~0x24;
*REG_I2C0_I2CON |= 0x18;
}
void I2C0_Isr(VP_INT exinf)
{
int status;
status = *REG_I2C0_I2CSTATUS & 255;
switch (status)
{
case 0x08:
I20_ISR_8 ();
break;
case 0x10:
I20_ISR_10 ();
break;
case 0x18:
I20_ISR_18 ();
break;
case 0x20:
I20_ISR_20 ();
break;
case 0x28:
I20_ISR_28 ();
break;
case 0x30:
I20_ISR_30 ();
break;
case 0x38:
I20_ISR_38 ();
break;
case 0x40:
I20_ISR_40 ();
break;
case 0x48:
I20_ISR_48 ();
break;
case 0x50:
I20_ISR_50 ();
break;
case 0x58:
I20_ISR_58 ();
break;
default:
*REG_I2C0_I2CON |= 0x08;/* Clear SI */
break;
}
return;
}
/* end of file */
sample/arm/nuc120/nuc120_reg.h
#ifndef _NUC120_DEF_
#define _NUC120_DEF_
#define CLK_BA (0x50000200) /* System Clock Control Register */
#define REG_PWRCON ((volatile UW *)(CLK_BA+0x00)) /* PWRCON Register */
#define REG_AHBCLK ((volatile UW *)(CLK_BA+0x04)) /* AHBCLK Register */
#define REG_APBCLK ((volatile UW *)(CLK_BA+0x08)) /* APBCLK Register */
#define REG_CLKSEL0 ((volatile UW *)(CLK_BA+0x10)) /* CLKSEL0 Register */
#define REG_CLKSEL1 ((volatile UW *)(CLK_BA+0x14)) /* CLKSEL1 Register */
#define REG_CLKDIV ((volatile UW *)(CLK_BA+0x18)) /* CLKDIV Register */
#define REG_CLKSEL2 ((volatile UW *)(CLK_BA+0x1c)) /* CLKSEL2 Register */
#define REG_PLLCON ((volatile UW *)(CLK_BA+0x20)) /* PLLCON Register */
#define GCR_BA (0x50000000) /* System Manager Control Register */
#define REG_SYS_RSTSRC ((volatile UW *)(GCR_BA+0x004)) /* GPIO Register */
#define REG_SYS_IPRSTC1 ((volatile UW *)(GCR_BA+0x008)) /* GPIO Register */
#define REG_SYS_IPRSTC2 ((volatile UW *)(GCR_BA+0x00c)) /* GPIO Register */
#define REG_GPA_MFP ((volatile UW *)(GCR_BA+0x030)) /* GPIO Register */
#define REG_GPB_MFP ((volatile UW *)(GCR_BA+0x034)) /* GPIO Register */
#define REG_GPC_MFP ((volatile UW *)(GCR_BA+0x038)) /* GPIO Register */
#define REG_GPD_MFP ((volatile UW *)(GCR_BA+0x03c)) /* GPIO Register */
#define REG_GPE_MFP ((volatile UW *)(GCR_BA+0x040)) /* GPIO Register */
#define REG_WRPROT ((volatile UW *)(GCR_BA+0x100)) /* REGWRPROT Register */
#define GP_BA (0x50004000) /* System Manager Control Register */
#define REG_GPIOA_PMD ((volatile UW *)(GP_BA+0x000)) /* GPIOB Register */
#define REG_GPIOA_DOUT ((volatile UW *)(GP_BA+0x008)) /* GPIOB Register */
#define REG_GPIOB_PMD ((volatile UW *)(GP_BA+0x040)) /* GPIOB Register */
#define REG_GPIOB_DOUT ((volatile UW *)(GP_BA+0x048)) /* GPIOB Register */
#define REG_GPIOC_PMD ((volatile UW *)(GP_BA+0x080)) /* GPIOB Register */
#define REG_GPIOC_DOUT ((volatile UW *)(GP_BA+0x088)) /* GPIOB Register */
#define ADC_BA (0x400e0000) /* ADC Registers */
#define REG_ADC_ADDR0 ((volatile UW *)(ADC_BA+0x000)) /* ADC0 Register */
#define REG_ADC_ADDR1 ((volatile UW *)(ADC_BA+0x004)) /* ADC1 Register */
#define REG_ADC_ADDR2 ((volatile UW *)(ADC_BA+0x008)) /* ADC2 Register */
#define REG_ADC_ADDR3 ((volatile UW *)(ADC_BA+0x00c)) /* ADC3 Register */
#define REG_ADC_ADDR4 ((volatile UW *)(ADC_BA+0x010)) /* ADC4 Register */
#define REG_ADC_ADDR5 ((volatile UW *)(ADC_BA+0x014)) /* ADC5 Register */
#define REG_ADC_ADDR6 ((volatile UW *)(ADC_BA+0x018)) /* ADC6 Register */
#define REG_ADC_ADDR7 ((volatile UW *)(ADC_BA+0x01c)) /* ADC7 Register */
#define REG_ADC_ADCR ((volatile UW *)(ADC_BA+0x020)) /* ADCR Register */
#define REG_ADC_ADCHER ((volatile UW *)(ADC_BA+0x024)) /* ADCHER Register */
#define REG_ADC_ADSR ((volatile UW *)(ADC_BA+0x030)) /* ADSR Register */
#define TMR_BA01 (0x40010000) /* TMR01 */
#define REG_TMR_TCSR0 ((volatile UW *)(TMR_BA01+0x00)) /* UART Receiver Buffer Register */
#define REG_TMR_TCMPR0 ((volatile UW *)(TMR_BA01+0x04)) /* UART Transmitter Holding Register */
#define REG_TMR_TISR0 ((volatile UW *)(TMR_BA01+0x08)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TDR0 ((volatile UW *)(TMR_BA01+0x0c)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TCSR1 ((volatile UW *)(TMR_BA01+0x20)) /* UART Receiver Buffer Register */
#define REG_TMR_TCMPR1 ((volatile UW *)(TMR_BA01+0x24)) /* UART Transmitter Holding Register */
#define REG_TMR_TISR1 ((volatile UW *)(TMR_BA01+0x28)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TDR1 ((volatile UW *)(TMR_BA01+0x2c)) /* UART Divisor Latch LSB and MSB Registers */
#define I2C0_BA (0x40020000) /* I2C */
#define REG_I2C0_I2CON ((volatile UW *)(I2C0_BA+0x00)) /* I2C ControlRegister */
#define REG_I2C0_I2CADDR0 ((volatile UW *)(I2C0_BA+0x04)) /* I2C Slave Address Register0 */
#define REG_I2C0_I2CDAT ((volatile UW *)(I2C0_BA+0x08)) /* I2C DATA Registers */
#define REG_I2C0_I2CSTATUS ((volatile UW *)(I2C0_BA+0x0c)) /* I2C Status Registers */
#define REG_I2C0_I2CLK ((volatile UW *)(I2C0_BA+0x10)) /* I2C Clock Registers */
#define REG_I2C0_I2CTOC ((volatile UW *)(I2C0_BA+0x14)) /* I2C Time Out Control Registers */
#define REG_I2C0_I2CADDR1 ((volatile UW *)(I2C0_BA+0x18)) /* I2C Slave Address Register1 */
#define REG_I2C0_I2CADDR2 ((volatile UW *)(I2C0_BA+0x1c)) /* I2C DATA Slave Address Register2 */
#define REG_I2C0_I2CADDR3 ((volatile UW *)(I2C0_BA+0x20)) /* I2C DATA Slave Address Register3 */
#define UART0_BA (0x40050000) /* UART0 */
#define REG_U0RBR ((volatile UW *)(UART0_BA+0x00)) /* UART Receiver Buffer Register */
#define REG_U0THR ((volatile UW *)(UART0_BA+0x00)) /* UART Transmitter Holding Register */
#define REG_U0BAUD ((volatile UW *)(UART0_BA+0x24)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_U0IER ((volatile UW *)(UART0_BA+0x04)) /* UART Interrupt Enable Register */
#define REG_U0ISR ((volatile UW *)(UART0_BA+0x1c)) /* UART Interrupt Identification Register */
#define REG_U0FCR ((volatile UW *)(UART0_BA+0x08)) /* UART FIFO Control Register */
#define REG_U0LCR ((volatile UW *)(UART0_BA+0x0c)) /* UART Line Control Register */
#define REG_U0MCR ((volatile UW *)(UART0_BA+0x10)) /* UART0 Modem Control Register */
#define REG_U0FSR ((volatile UW *)(UART0_BA+0x18)) /* UART FSR Register */
#define REG_U0ALTCON ((volatile UW *)(UART0_BA+0x2c)) /* UART */
#define REG_U0FUNSEL ((volatile UW *)(UART0_BA+0x30)) /* UART */
#endif
/* end of file */
sample/arm/nuc120/system.cfg
/**
* Sample program for Hyper Operating System V4 Advance
*
* @file system.cfg
* @brief %jp{サンプルのコンフィギュレーション}
*
* Copyright (C) 1998-2006 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
/* %jp{カーネル独自の設定}%en{kernel} */
KERNEL_HEP_MEM(256, NULL);
KERNEL_SYS_STK(256, NULL);
KERNEL_INT_STK(512, NULL);
KERNEL_RSV_TSKID(0);
KERNEL_RSV_SEMID(0);
KERNEL_RSV_FLGID(0);
KERNEL_RSV_DTQID(0);
KERNEL_RSV_MBXID(0);
KERNEL_RSV_MPFID(0);
KERNEL_RSV_MTXID(0);
KERNEL_RSV_CYCID(0);
/* %jp{OSタイマの設定}%en{OS timer} */
INCLUDE("\"ostimer.h\"");
ATT_INI({TA_HLNG, 0, OsTimer_Initialize});
DEF_INH(15, {TA_HLNG, OsTimer_Isr}); /* 15:SysTick */
DEF_INH(24, {TA_HLNG, TMR0_Isr}); /* 24:TMR0 */
ATT_INI({TA_HLNG, 0, UART0_Initialize});
DEF_INH(28, {TA_HLNG, UART0_Isr}); /* 28:UART0 */
DEF_INH(34, {TA_HLNG, I2C0_Isr}); /* 34:I2C0 */
DEF_INH(45, {TA_HLNG, ADC_Isr}); /* 45:ADC */
/* %jp{サンプル}%en{Sample program} */
INCLUDE("\"sample.h\"");
ATT_INI({TA_HLNG, 0, Sample_Initialize});
CRE_TSK(TSKID_SAMPLE1, {TA_HLNG | TA_ACT, 1, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE2, {TA_HLNG | TA_ACT, 2, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE3, {TA_HLNG | TA_ACT, 3, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE4, {TA_HLNG | TA_ACT, 4, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE5, {TA_HLNG | TA_ACT, 5, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_ADC, {TA_HLNG | TA_ACT, 5, Adc_Task, 3, 512, NULL});
CRE_TSK(TSKID_LM73, {TA_HLNG | TA_ACT, 5, Lm73_Task, 3, 512, NULL});
CRE_TSK(TSKID_LED, {TA_HLNG | TA_ACT, 0, Led_PC2, 7, 512, NULL});
CRE_CYC(CYCID_LED, {TA_HLNG , 0, Led_PC3, 250, 0});
CRE_SEM(1, {TA_TFIFO, 1, 1});
CRE_SEM(2, {TA_TFIFO, 1, 1});
CRE_SEM(3, {TA_TFIFO, 1, 1});
CRE_SEM(4, {TA_TFIFO, 1, 1});
CRE_SEM(5, {TA_TFIFO, 1, 1});
CRE_SEM(SEMID_RAND, {TA_TFIFO, 1, 1});
CRE_SEM(SEMID_UART, {TA_TFIFO, 1, 1});
CRE_FLG(FLGID_UART, {TA_TFIFO | TA_WSGL, 0});
/* end of file */
-----
HOS では Idle 時_kernel_wai_int()が呼ばれるようです。
kernel/source/arch/proc/arm/arm_v6m/gcc/kwai_int.S
_kernel_wai_int: /* WaitForInterrupt */
+ wfi
b _kernel_wai_int
.size _kernel_wai_int, .-_kernel_wai_int
で wfi命令(sleep)を追加してみました。
効果は CPU48MHz SysTick 1ms周期で wfi命令なし130mA, wfi命令あり100mA と消費電力が低減しました。
----
I2C0(PA8.SDC,PA9.SCL)に 温度センサーLM73を接続してみました。
LM73は http://www.digikey.jp/ で購入しました。
sample/arm/nuc120/i2c0_lm73.c
/**
* Sample program for Hyper Operating System V4 Advance
*
* @file sample.c
* @brief %jp{サンプルプログラム}%en{Sample program}
*
* Copyright (C) 1998-2011 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
#include
#include
#include "kernel.h"
#include "kernel_id.h"
#include "uart.h"
#include "nuc120_reg.h"
extern volatile long OSTick;
struct i2c_lm73_t {
unsigned short temperature;
char valid;
unsigned char ad;
unsigned char rd[2];
} lm73;
#define LM73_AD (0x49)
/** %jp{サンプルタスク} */
void Lm73_Task(VP_INT exinf)
{
lm73.ad = (LM73_AD<<1);
lm73.temperature=0;
/* I2C0 pin function */
*REG_GPA_MFP |= (3<<8);/* I2C0 */
/* I2C0 engine clock enable */
*REG_APBCLK |= (1 << 8); /* I2C0 CLK Enable */
/* I2C0 初期化 */
*REG_I2C0_I2CON = 0x08; /* clearing all flags */
*REG_I2C0_I2CON = 0xc0; /* Enable EI + ENS1 */
*REG_I2C0_I2CLK = 119;/* 100KHz */
ena_int(18);
for(;;)
{
lm73.valid=0;
*REG_I2C0_I2CON |= 0x20;/* STA */
dly_tsk (1000);
if(lm73.valid) { /* */
/** %jp{状態表示} */
wai_sem(SEMID_UART);
/* %jp{文字列生成} */
lm73.temperature=lm73.rd[0]<<8|lm73.rd[1];
printk("LM73: %3d.%02d\n",lm73.temperature>>7,100*(lm73.temperature>>5 & 3)/4);
sig_sem(SEMID_UART);
}
}
}
void
I20_ISR_8 ()
{
// printk("<08>");
/* Clear SI and Start flag */
*REG_I2C0_I2CON &= ~0x34; /* */
*REG_I2C0_I2CON |= 0x08; /* SIC */
/* Slave address + write */
*REG_I2C0_I2CDAT = lm73.ad;
}
void
I20_ISR_10 ()
{
// printk("<10>");
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
*REG_I2C0_I2CON &= ~0x34;
/* Slave address + read */
*REG_I2C0_I2CDAT = lm73.ad|1;
}
void
I20_ISR_18 ()
{
// printk("<18>");
/* Data to be transmitted */
*REG_I2C0_I2CDAT = 0x00;/* Reg 0 */
/* clear SI */
*REG_I2C0_I2CON |= 0x0c;
*REG_I2C0_I2CON &= ~0x20;
}
void
I20_ISR_20 ()
{
// printk("<20>");
/* Data to be transmitted */
*REG_I2C0_I2CDAT = 0x00;/* LM73 Reg 0 */
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
*REG_I2C0_I2CON &= ~0x34;
}
void
I20_ISR_28 ()
{
// printk("<28>");
/* Transmit stop condition */
*REG_I2C0_I2CON &= ~0x34;
/* clear SI */
*REG_I2C0_I2CON |= 0x28;
}
void
I20_ISR_30 ()
{
// printk("<30>");
/* clear SI */
*REG_I2C0_I2CON |= 0x18;
}
void
I20_ISR_38 ()
{
// printk("<38>");
/* clear SI */
*REG_I2C0_I2CON |= 0x8;
}
void
I20_ISR_40 ()
{
// printk("<40>");
/* clear SI */
*REG_I2C0_I2CON &= ~0x34;
*REG_I2C0_I2CON |= 0x08;
/* Transmit AA condition */
*REG_I2C0_I2CON |= 0x04;
}
void
I20_ISR_48 ()
{
// printk("<48>");
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
}
void
I20_ISR_50 ()
{
// printk("<50>");
lm73.rd[0]=*REG_I2C0_I2CDAT;
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
/* Transmit AA condition */
*REG_I2C0_I2CON &= ~0x24;
}
void
I20_ISR_58 ()
{
// printk("<58>");
lm73.rd[1]=*REG_I2C0_I2CDAT;
lm73.valid++;
/* clear SI */
*REG_I2C0_I2CON &= ~0x24;
*REG_I2C0_I2CON |= 0x18;
}
void I2C0_Isr(VP_INT exinf)
{
int status;
status = *REG_I2C0_I2CSTATUS & 255;
switch (status)
{
case 0x08:
I20_ISR_8 ();
break;
case 0x10:
I20_ISR_10 ();
break;
case 0x18:
I20_ISR_18 ();
break;
case 0x20:
I20_ISR_20 ();
break;
case 0x28:
I20_ISR_28 ();
break;
case 0x30:
I20_ISR_30 ();
break;
case 0x38:
I20_ISR_38 ();
break;
case 0x40:
I20_ISR_40 ();
break;
case 0x48:
I20_ISR_48 ();
break;
case 0x50:
I20_ISR_50 ();
break;
case 0x58:
I20_ISR_58 ();
break;
default:
*REG_I2C0_I2CON |= 0x08;/* Clear SI */
break;
}
return;
}
/* end of file */
sample/arm/nuc120/nuc120_reg.h
#ifndef _NUC120_DEF_
#define _NUC120_DEF_
#define CLK_BA (0x50000200) /* System Clock Control Register */
#define REG_PWRCON ((volatile UW *)(CLK_BA+0x00)) /* PWRCON Register */
#define REG_AHBCLK ((volatile UW *)(CLK_BA+0x04)) /* AHBCLK Register */
#define REG_APBCLK ((volatile UW *)(CLK_BA+0x08)) /* APBCLK Register */
#define REG_CLKSEL0 ((volatile UW *)(CLK_BA+0x10)) /* CLKSEL0 Register */
#define REG_CLKSEL1 ((volatile UW *)(CLK_BA+0x14)) /* CLKSEL1 Register */
#define REG_CLKDIV ((volatile UW *)(CLK_BA+0x18)) /* CLKDIV Register */
#define REG_CLKSEL2 ((volatile UW *)(CLK_BA+0x1c)) /* CLKSEL2 Register */
#define REG_PLLCON ((volatile UW *)(CLK_BA+0x20)) /* PLLCON Register */
#define GCR_BA (0x50000000) /* System Manager Control Register */
#define REG_SYS_RSTSRC ((volatile UW *)(GCR_BA+0x004)) /* GPIO Register */
#define REG_SYS_IPRSTC1 ((volatile UW *)(GCR_BA+0x008)) /* GPIO Register */
#define REG_SYS_IPRSTC2 ((volatile UW *)(GCR_BA+0x00c)) /* GPIO Register */
#define REG_GPA_MFP ((volatile UW *)(GCR_BA+0x030)) /* GPIO Register */
#define REG_GPB_MFP ((volatile UW *)(GCR_BA+0x034)) /* GPIO Register */
#define REG_GPC_MFP ((volatile UW *)(GCR_BA+0x038)) /* GPIO Register */
#define REG_GPD_MFP ((volatile UW *)(GCR_BA+0x03c)) /* GPIO Register */
#define REG_GPE_MFP ((volatile UW *)(GCR_BA+0x040)) /* GPIO Register */
#define REG_WRPROT ((volatile UW *)(GCR_BA+0x100)) /* REGWRPROT Register */
#define GP_BA (0x50004000) /* System Manager Control Register */
#define REG_GPIOA_PMD ((volatile UW *)(GP_BA+0x000)) /* GPIOB Register */
#define REG_GPIOA_DOUT ((volatile UW *)(GP_BA+0x008)) /* GPIOB Register */
#define REG_GPIOB_PMD ((volatile UW *)(GP_BA+0x040)) /* GPIOB Register */
#define REG_GPIOB_DOUT ((volatile UW *)(GP_BA+0x048)) /* GPIOB Register */
#define REG_GPIOC_PMD ((volatile UW *)(GP_BA+0x080)) /* GPIOB Register */
#define REG_GPIOC_DOUT ((volatile UW *)(GP_BA+0x088)) /* GPIOB Register */
#define ADC_BA (0x400e0000) /* ADC Registers */
#define REG_ADC_ADDR0 ((volatile UW *)(ADC_BA+0x000)) /* ADC0 Register */
#define REG_ADC_ADDR1 ((volatile UW *)(ADC_BA+0x004)) /* ADC1 Register */
#define REG_ADC_ADDR2 ((volatile UW *)(ADC_BA+0x008)) /* ADC2 Register */
#define REG_ADC_ADDR3 ((volatile UW *)(ADC_BA+0x00c)) /* ADC3 Register */
#define REG_ADC_ADDR4 ((volatile UW *)(ADC_BA+0x010)) /* ADC4 Register */
#define REG_ADC_ADDR5 ((volatile UW *)(ADC_BA+0x014)) /* ADC5 Register */
#define REG_ADC_ADDR6 ((volatile UW *)(ADC_BA+0x018)) /* ADC6 Register */
#define REG_ADC_ADDR7 ((volatile UW *)(ADC_BA+0x01c)) /* ADC7 Register */
#define REG_ADC_ADCR ((volatile UW *)(ADC_BA+0x020)) /* ADCR Register */
#define REG_ADC_ADCHER ((volatile UW *)(ADC_BA+0x024)) /* ADCHER Register */
#define REG_ADC_ADSR ((volatile UW *)(ADC_BA+0x030)) /* ADSR Register */
#define TMR_BA01 (0x40010000) /* TMR01 */
#define REG_TMR_TCSR0 ((volatile UW *)(TMR_BA01+0x00)) /* UART Receiver Buffer Register */
#define REG_TMR_TCMPR0 ((volatile UW *)(TMR_BA01+0x04)) /* UART Transmitter Holding Register */
#define REG_TMR_TISR0 ((volatile UW *)(TMR_BA01+0x08)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TDR0 ((volatile UW *)(TMR_BA01+0x0c)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TCSR1 ((volatile UW *)(TMR_BA01+0x20)) /* UART Receiver Buffer Register */
#define REG_TMR_TCMPR1 ((volatile UW *)(TMR_BA01+0x24)) /* UART Transmitter Holding Register */
#define REG_TMR_TISR1 ((volatile UW *)(TMR_BA01+0x28)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TDR1 ((volatile UW *)(TMR_BA01+0x2c)) /* UART Divisor Latch LSB and MSB Registers */
#define I2C0_BA (0x40020000) /* I2C */
#define REG_I2C0_I2CON ((volatile UW *)(I2C0_BA+0x00)) /* I2C ControlRegister */
#define REG_I2C0_I2CADDR0 ((volatile UW *)(I2C0_BA+0x04)) /* I2C Slave Address Register0 */
#define REG_I2C0_I2CDAT ((volatile UW *)(I2C0_BA+0x08)) /* I2C DATA Registers */
#define REG_I2C0_I2CSTATUS ((volatile UW *)(I2C0_BA+0x0c)) /* I2C Status Registers */
#define REG_I2C0_I2CLK ((volatile UW *)(I2C0_BA+0x10)) /* I2C Clock Registers */
#define REG_I2C0_I2CTOC ((volatile UW *)(I2C0_BA+0x14)) /* I2C Time Out Control Registers */
#define REG_I2C0_I2CADDR1 ((volatile UW *)(I2C0_BA+0x18)) /* I2C Slave Address Register1 */
#define REG_I2C0_I2CADDR2 ((volatile UW *)(I2C0_BA+0x1c)) /* I2C DATA Slave Address Register2 */
#define REG_I2C0_I2CADDR3 ((volatile UW *)(I2C0_BA+0x20)) /* I2C DATA Slave Address Register3 */
#define UART0_BA (0x40050000) /* UART0 */
#define REG_U0RBR ((volatile UW *)(UART0_BA+0x00)) /* UART Receiver Buffer Register */
#define REG_U0THR ((volatile UW *)(UART0_BA+0x00)) /* UART Transmitter Holding Register */
#define REG_U0BAUD ((volatile UW *)(UART0_BA+0x24)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_U0IER ((volatile UW *)(UART0_BA+0x04)) /* UART Interrupt Enable Register */
#define REG_U0ISR ((volatile UW *)(UART0_BA+0x1c)) /* UART Interrupt Identification Register */
#define REG_U0FCR ((volatile UW *)(UART0_BA+0x08)) /* UART FIFO Control Register */
#define REG_U0LCR ((volatile UW *)(UART0_BA+0x0c)) /* UART Line Control Register */
#define REG_U0MCR ((volatile UW *)(UART0_BA+0x10)) /* UART0 Modem Control Register */
#define REG_U0FSR ((volatile UW *)(UART0_BA+0x18)) /* UART FSR Register */
#define REG_U0ALTCON ((volatile UW *)(UART0_BA+0x2c)) /* UART */
#define REG_U0FUNSEL ((volatile UW *)(UART0_BA+0x30)) /* UART */
#endif
/* end of file */
sample/arm/nuc120/system.cfg
/**
* Sample program for Hyper Operating System V4 Advance
*
* @file system.cfg
* @brief %jp{サンプルのコンフィギュレーション}
*
* Copyright (C) 1998-2006 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
/* %jp{カーネル独自の設定}%en{kernel} */
KERNEL_HEP_MEM(256, NULL);
KERNEL_SYS_STK(256, NULL);
KERNEL_INT_STK(512, NULL);
KERNEL_RSV_TSKID(0);
KERNEL_RSV_SEMID(0);
KERNEL_RSV_FLGID(0);
KERNEL_RSV_DTQID(0);
KERNEL_RSV_MBXID(0);
KERNEL_RSV_MPFID(0);
KERNEL_RSV_MTXID(0);
KERNEL_RSV_CYCID(0);
/* %jp{OSタイマの設定}%en{OS timer} */
INCLUDE("\"ostimer.h\"");
ATT_INI({TA_HLNG, 0, OsTimer_Initialize});
DEF_INH(15, {TA_HLNG, OsTimer_Isr}); /* 15:SysTick */
DEF_INH(24, {TA_HLNG, TMR0_Isr}); /* 24:TMR0 */
ATT_INI({TA_HLNG, 0, UART0_Initialize});
DEF_INH(28, {TA_HLNG, UART0_Isr}); /* 28:UART0 */
DEF_INH(34, {TA_HLNG, I2C0_Isr}); /* 34:I2C0 */
DEF_INH(45, {TA_HLNG, ADC_Isr}); /* 45:ADC */
/* %jp{サンプル}%en{Sample program} */
INCLUDE("\"sample.h\"");
ATT_INI({TA_HLNG, 0, Sample_Initialize});
CRE_TSK(TSKID_SAMPLE1, {TA_HLNG | TA_ACT, 1, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE2, {TA_HLNG | TA_ACT, 2, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE3, {TA_HLNG | TA_ACT, 3, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE4, {TA_HLNG | TA_ACT, 4, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE5, {TA_HLNG | TA_ACT, 5, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_ADC, {TA_HLNG | TA_ACT, 5, Adc_Task, 3, 512, NULL});
CRE_TSK(TSKID_LM73, {TA_HLNG | TA_ACT, 5, Lm73_Task, 3, 512, NULL});
CRE_TSK(TSKID_LED, {TA_HLNG | TA_ACT, 0, Led_PC2, 7, 512, NULL});
CRE_CYC(CYCID_LED, {TA_HLNG , 0, Led_PC3, 250, 0});
CRE_SEM(1, {TA_TFIFO, 1, 1});
CRE_SEM(2, {TA_TFIFO, 1, 1});
CRE_SEM(3, {TA_TFIFO, 1, 1});
CRE_SEM(4, {TA_TFIFO, 1, 1});
CRE_SEM(5, {TA_TFIFO, 1, 1});
CRE_SEM(SEMID_RAND, {TA_TFIFO, 1, 1});
CRE_SEM(SEMID_UART, {TA_TFIFO, 1, 1});
CRE_FLG(FLGID_UART, {TA_TFIFO | TA_WSGL, 0});
/* end of file */
登録:
投稿 (Atom)