ラベル SDCC の投稿を表示しています。 すべての投稿を表示
ラベル SDCC の投稿を表示しています。 すべての投稿を表示

2013年12月1日日曜日

SDCCによるFX2LPのFirmware開発に再挑戦 その3 (コンパイル成功)

今回はコンパイルに成功しました。

前回までの細かさとは打って変わって、非常に大雑把になってます。
ごめんなさい。


使ったもの:
SDCC-3.3.0
MinGW   mingw32-base
   msys-base   


http://sourceforge.net/projects/fx2lib/ からダウンロードした fx2lib-src-0.1.tgz 
pfenrirさんちで公開されているヘッダファイルとmakefile



前回、嫌んなっちゃったんで、ちょっと違うことをしてみます。


http://sourceforge.net/projects/fx2lib/ から、 fx2lib-src-0.1.tgz をダウンロードしました。

tgzファイルなんですが、ググってみると、解凍コマンドがわかりましたので、MinGWのコンソールで解凍できました。
コマンドはhttp://uguisu.skr.jp/Windows/tar.htmlを参考にさせていただきました。

私はSDCCでのコンパイル用に「C:\SDCC」というフォルダを作っていたので、そこに解凍してできた「fx2lib」というフォルダとその内容をすべて「C:\SDCC\fx2lib」として保存しました。


makefileのINCLUDESのところに「C:\SDCC\fx2lib\include」、LIBSのところに「C:\SDCC\fx2lib\lib」を設定しました。

で、makeすると、これがない、あれがない、こんな命令知らない、といろいろ言われるので、対応します。
なんだか覚えてませんが、なかったものは前回までにpfenrirさんちから頂いたファイルをコピーしました。なぜコピーしたかというと、なにか変更しなくちゃならなくなったら、元のファイルをいじりたくなかった、というだけですので、本来はINCLUDESやLIBSのパスに加えるだけでいいと思います。

他にも xdata は判りません、みないなのもあったと思いますが、すべて前回までに知っていたところだったので問題なく対応出来ました。

すると、どうでしょう。
makeがエラーを吐くことなく終わりました!

最終的には
Intel Hex file to EZ-USB Binary file conversion utility
Copyright (c) 2012-2013, Cypress Semiconductor Inc.
4979 Bytes written.
Total Code Bytes = 4726
Conversion completed successfully.
ということで、できたようです。

ただ、ここまで来ても、「make 1> ./build_by_sdcc/make.txt 2>&1」で保存しておいたファイルを見るとerrorが吐かれていたりするので検索して確認し、対応し、回避しています。



次回以降は実際にfx2lpのeepromに書き込んで動作確認します。






SDCCによるFX2LPのFirmware開発に再挑戦 その2

注意: ただの駄文です。
    結局、今回はSDCCによるFX2LPのFirmware開発は成功していません。



前回、SDCCさんは ezusb.lib がお気に召さなかったので、再度pfenrirさんちから取得しなおして、make。

今度は

Multiple definition of _EUSB
Multiple definition of _EA
memory overlap at 0x0 for RSEG1
memory overlap at 0x1 for RSEG1

と言われたので探してみると、私が fx2regs.h をいじった形跡が…

2箇所、
390行目付近:
sbit EA    = 0xA8+7;

480行目付近:
sbit EUSB    = 0xE8+0;

を、はじめはコメントされていたのに、復活していました。

で、これを再度コメントアウトして、makeすると…

fw.c:210: error 20: Undefined identifier 'EUSB'
fw.c:216: error 20: Undefined identifier 'EA'

おお、これ、見たことある。これを言われたから fx2regs.h をいじったんだった…

ん? 活かしてもダメ、コメントにしてもダメ。いったい、どうすれば?

よく見ると、fx2regs.incが、fx2regs.hと同じフォルダにあります。
このfx2regs.incは、pfenrirさんのものです。
が、fx2regs.hは↓のものでした。
https://raw.github.com/stefanrauch/bel_projects/master/cy7/cyfx2usbuart/fx2regs.h

このfx2regs.hの中でコメントアウトされていたEUSBとEAの2群を復活して、make clean
make。

Multiple definition of _EIEX6
Multiple definition of _EI2C
Multiple definition of _EIPX4
Multiple definition of _EIPX5
Multiple definition of _EIPX6
Multiple definition of _PI2C
Multiple definition of _EUSB
Multiple definition of _PUSB
Multiple definition of _EA
Multiple definition of _ES0
Multiple definition of _ET0
Multiple definition of _ES1
Multiple definition of _ET1
Multiple definition of _ET2
Multiple definition of _EX0
Multiple definition of _EX1
Multiple definition of _EIEX4
Multiple definition of _EIEX5
memory overlap at 0x0 for RSEG1
memory overlap at 0x1 for RSEG1
memory overlap at 0x2 for RSEG1
memory overlap at 0x3 for RSEG1
memory overlap at 0x4 for RSEG1
memory overlap at 0x5 for RSEG1
memory overlap at 0x6 for RSEG1
memory overlap at 0x7 for RSEG1
memory overlap at 0x8 for RSEG1
memory overlap at 0x9 for RSEG1
memory overlap at 0xA for RSEG1
memory overlap at 0xB for RSEG1
memory overlap at 0xC for RSEG1
memory overlap at 0xD for RSEG1
memory overlap at 0xE for RSEG1
memory overlap at 0xF for RSEG1
memory overlap at 0x10 for RSEG1
memory overlap at 0x11 for RSEG1

今度はこんなに~

とりあえず「EIEX6」が含まれているファイルを探すと、次の4ファイルありました。
ezregs.h
ezregs.inc
ez2regs.h
ez2regs.inc

ezregsとez2regsの両方が使われてるってことかな。

ところが、ezregsを呼び出しているファイルを探すと、存在しません。
が、ez2regsの両ファイルには
If you modify the register definitions below, please regenerate the file
    "ezregs.inc" which includes the same basic information for assembly inclusion.
と書いてあるので、誰かが呼んでいるのだろうと思うことにして、

ezregsの両ファイルから、さきの2群をもう一度コメントアウト。

同じのが出る~~
では、ezregsとez2regsの計4ファイルからコメントアウトしてみましょう。


fw.c:210: error 20: Undefined identifier 'EUSB'

もう、面倒になってきちゃった(苦笑)

2013年11月18日月曜日

SDCCによるFX2LPのFirmware開発に再挑戦 その1

(本投稿中、「&」や「>」、「\\\」といった表示がありますが、直しても直しても戻ってしまうので諦めました。それぞれ1バイト文字の&、>、¥のことです。すみません)


FX2LP(EZ-USB)を使った「変なキーボード」の制作ですが、
どうにも、フリー版のプログラムサイズの問題に引っかかってしまい。
数年前にも挑戦して挫折した、SDCCによるコンパイルに、再挑戦してみます。


まずは、pfenrirさんちの記事のサンプルをkeilでコンパイルしてみます。
pfenrirさん、ありがとうございます。勝手に使ってます。すみません。

最近のμVisionで開くと、いろいろパスが変わっていますので、修正します。
Target 1 の Source Group 1 に入っているファイルもパスが変わっていてペケ印がついていますので、これにも対応します。

Options for Tariget 'Target1' の Output タブの下部、Run User Program の1つ目に、通常、
C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.0\Bin\hex2bix -i -f 0xC2 -o bulkloop.iic bulkloop.hex
のように入れますが、このファイルの指定時にコンパイルするフォルダを指定します↓
C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.0\Bin\hex2bix -i -f 0xC2 -o .\build_by_keil\bulkloop.iic .\build_by_keil\bulkloop.hex


で、コンパイルすると、
C:\CYPRESS\USB\CY3684_EZ-USB_FX2LP_DVK\1.0\TARGET\INC\LPREGS.INC(266): error A10: ATTEMPT TO DEFINE AN ALREADY DEFINED SYMBOL
などと言われますので、その部分をコメントアウトします。

もう一度コンパイルすると、

エラーなくできました。iicファイルもできています。

他にもなんかいじくったかもしれませんが、記憶が曖昧で書けない…

はじめ、hexファイルが出来なくて困っていたんですが、projectのoptionを開いてチェックボックスのチェックを一旦外してOKしてからまた入れる、というのを繰り返したら、できました。

FX2LPにダウンロードしてまでは確認していませんが、もらってきたソースでiicファイルまで動くことが確認できました。





では、同じソースを、SDCCを使ってコンパイルしましょう。


準備:
まずは、SDCC-3.3.0 をインストールしました。

次に、mingw-get-setup.exe をインストールしました。
さらに、 C:\MinGW\bin にある mingw-get.exe を起動し、
All Packages
    MinGW
        MinGW Base System
にある、 mingw32-base のチェックボックスをクリックして、"Mark for Installation" を選び、メニュー Installation - Apply Changes を選んでインストールしました。
同様に、
    MSYS
        MSYS Base System
にある、msys-base をインストールしました。

MSYSのシェルは、
C:\MinGW\msys\1.0\msys.bat を開くと起動しました。



pfenrirさんちで公開されているヘッダファイルをまとめて一つのフォルダに保存し、makefileの中ではじめに参照するように設定します。


MSYSシェルを起動してmakefileのあるフォルダまでcdで移動して、makeコマンドを発行しました。

こんなん出ました:
sed: -e expression #2, char 17: unknown option to `s'

おそらく、makefileの
cat tempfile | sed -e 's/^+.*//g' -e 's/[^\.]*\.rel/$(BUILD_DIR)\/&/g' >> $(BUILD_DIR)/depend.inc; \
の部分から来ていると思うのですが、なんだかわかりません。

(以下、素人による原因究明過程ですんでひと目で問題点がお分かりになる方には単なる駄文長文ですね。ごめんなさい。)


ここで、このtempfileの内容を取得したものを示しますね。
fw.rel: fw.c c:/SDCC/pfenrir_inc/fx2.h c:/SDCC/pfenrir_inc/fx2regs.h \
c:/SDCC/pfenrir_inc/syncdly.h
+ c:\PROGRA~1\SDCC\bin\sdcpp.exe -nostdinc -Wall -MM -I"c:/SDCC/pfenrir_inc" -obj-ext=.rel -D__SDCC_MODEL_SMALL -DSDCC_MODEL_SMALL -D__SDCC_FLOAT_REENT -DSDCC_FLOAT_REENT -D__SDCC=3_3_1 -DSDCC=331 -D__SDCC_REVISION=8894 -DSDCC_REVISION=8894 -D__SDCC_mcs51 -DSDCC_mcs51 -D__mcs51 -D__STDC_NO_COMPLEX__ -D__STDC_NO_THREADS__ -D__STDC_NO_ATOMICS__ -D__STDC_NO_VLA__ -isystem "c:\Program Files\SDCC\bin\..\include\mcs51" -isystem "c:\Program Files\SDCC\bin\..\include" "fw.c"
periph.rel: periph.c c:/SDCC/pfenrir_inc/fx2.h \
c:/SDCC/pfenrir_inc/fx2regs.h c:/SDCC/pfenrir_inc/syncdly.h
+ c:\PROGRA~1\SDCC\bin\sdcpp.exe -nostdinc -Wall -MM -I"c:/SDCC/pfenrir_inc" -obj-ext=.rel -D__SDCC_MODEL_SMALL -DSDCC_MODEL_SMALL -D__SDCC_FLOAT_REENT -DSDCC_FLOAT_REENT -D__SDCC=3_3_1 -DSDCC=331 -D__SDCC_REVISION=8894 -DSDCC_REVISION=8894 -D__SDCC_mcs51 -DSDCC_mcs51 -D__mcs51 -D__STDC_NO_COMPLEX__ -D__STDC_NO_THREADS__ -D__STDC_NO_ATOMICS__ -D__STDC_NO_VLA__ -isystem "c:\Program Files\SDCC\bin\..\include\mcs51" -isystem "c:\Program Files\SDCC\bin\..\include" "periph.c"

「cat」はファイルの中身を表示するコマンドらしいので、続く「|」によって「sed」にファイルを渡しているようです。
なので、基本的な「sed」の使い方に則って
sed -e 's/^+.*//g' -e 's/[^\.]*\.rel/./build_by_sdcc\/&/g' tempfile > ./build_by_sdcc/depend.inc
のように書いても同じことができるはず。
やってみると、同じエラーが出ますね。

1つ目の変換指定だけにして実行すると、エラーなく動きました。
sed 's/^+.*//g'  ./build_by_sdcc/tempfile.txt > ./build_by_sdcc/depend.inc

検索文字列の指定は「^」は行頭を指すので、行頭に'+'があって、「.*」は任意の文字がゼロ個以上ということ、
置換文字列は指定されていないので見つけたら削除するとうことになります。
最後の「g」は見つけたものすべてを変換せよということらしいです。
合計すると実行結果は
fw.rel: fw.c c:/SDCC/pfenrir_inc/fx2.h c:/SDCC/pfenrir_inc/fx2regs.h \
 c:/SDCC/pfenrir_inc/syncdly.h
periph.rel: periph.c c:/SDCC/pfenrir_inc/fx2.h \
 c:/SDCC/pfenrir_inc/fx2regs.h c:/SDCC/pfenrir_inc/syncdly.h
となるのは理解出来ました。


問題の2つ目の変換指定「s/[^\.]*\.rel/./build_by_sdcc\/&/g」について。
検索文字列は、「\.」が任意の文字ではなくてピリオドそのものを指し、「[^\.]」なのでピリオドではない1文字、後ろに「*」があるので「[^\.]*」はピリオドではない長さゼロ以上の文字列、
「\.rel」は文字列'.rel'そのものを指す。合計してウィンドウズのワイルドカード的に書くと'*.rel'ということですね。
置換文字列は、あれ?どこからどこまでだ?
「./build_by_sdcc\/&」かな?でも、sedは検索文字列と置換文字列、オプションの区切りにスラッシュを使うのでこのままじゃダメな気がする。

「s/[^\.]*\.rel/\.\/build_by_sdcc\\\/&/g」にしてみたら、エラーはでなくなりました。
しかーーし、
2つ目のだけを実行したファイルを見ると
./build_by_sdcc\/fw.rel: fw.c c:/SDCC/pfenrir_inc/fx2.h c:/SDCC/pfenrir_inc/fx2regs.h \
 c:/SDCC/pfenrir_inc/syncdly.h
+ c:\PROGRA~1\SDCC\bin\sdcpp.exe -nostdinc -Wall -MM -I"c:\SDCC\./build_by_sdcc\/pfenrir_inc" -obj-ext=.rel -D__SDCC_MODEL_SMALL -DSDCC_MODEL_SMALL -D__SDCC_FLOAT_REENT -DSDCC_FLOAT_REENT -D__SDCC=3_3_1 -DSDCC=331 -D__SDCC_REVISION=8894 -DSDCC_REVISION=8894 -D__SDCC_mcs51 -DSDCC_mcs51 -D__mcs51 -D__STDC_NO_COMPLEX__ -D__STDC_NO_THREADS__ -D__STDC_NO_ATOMICS__ -D__STDC_NO_VLA__ -isystem "c:\Program Files\SDCC\bin\..\include\mcs51" -isystem "c:\Program Files\SDCC\bin\..\include"  "fw.c"
./build_by_sdcc\/periph.rel: periph.c c:/SDCC/pfenrir_inc/fx2.h \
 c:/SDCC/pfenrir_inc/fx2regs.h c:/SDCC/pfenrir_inc/syncdly.h
+ c:\PROGRA~1\SDCC\bin\sdcpp.exe -nostdinc -Wall -MM -I"c:\SDCC\./build_by_sdcc\/pfenrir_inc" -obj-ext=.rel -D__SDCC_MODEL_SMALL -DSDCC_MODEL_SMALL -D__SDCC_FLOAT_REENT -DSDCC_FLOAT_REENT -D__SDCC=3_3_1 -DSDCC=331 -D__SDCC_REVISION=8894 -DSDCC_REVISION=8894 -D__SDCC_mcs51 -DSDCC_mcs51 -D__mcs51 -D__STDC_NO_COMPLEX__ -D__STDC_NO_THREADS__ -D__STDC_NO_ATOMICS__ -D__STDC_NO_VLA__ -isystem "c:\Program Files\SDCC\bin\..\include\mcs51" -isystem "c:\Program Files\SDCC\bin\..\include"  "periph.c" 
./build_by_sdcc\/fw.rel …「\/」なんて、どんなパスだよ、ということで
「s/[^\.]*\.rel/\.\/build_by_sdcc\/&/g」とするとできました。

(ということは、「&」は検索文字列そのものを指しているみたいですね。だって、発見した'fw.rel'が消えずにあるので)

上記を合わせて、コマンドは
もとの
cat tempfile | sed -e 's/^+.*//g' -e 's/[^\.]*\.rel/$(BUILD_DIR)\/&/g' >>  $(BUILD_DIR)/depend.inc; \
から
sed -e 's/^+.*//g' -e 's/[^\.]*\.rel/\.\/build_by_sdcc\/&/g' .tempfile >> ./build_by_sdcc/depend.inc; \
になるでしょう。

 make 1> ./build_by_sdcc/make.txt 2>&1
とコマンド発行して結果を取得しましょう。

ちなみに ./build_by_sdcc/depend.inc はこんな感じです。c:/SDCC/p.....って、変なパスだなぁ。これで動くのかね?
./build_by_sdcc/fw.rel: fw.c c:/SDCC/pfenrir_inc/fx2.h c:/SDCC/pfenrir_inc/fx2regs.h \
 c:/SDCC/pfenrir_inc/syncdly.h
./build_by_sdcc/periph.rel: periph.c c:/SDCC/pfenrir_inc/fx2.h \
 c:/SDCC/pfenrir_inc/fx2regs.h c:/SDCC/pfenrir_inc/syncdly.h

makeは、sedのあとで上の depend.inc をインクルードして実行するわけですが…
なんか、sdccさんは、ソースファイルの内容がお気に召さないご様子です…
sdcc -c -V --debug --opt-code-speed --model-small -I"C:\SDCC\pfenrir_inc" -I"c:\program files\sdcc\include" -I"C:\Keil\C51\INC" -I"C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.0\Target\Inc" -I..//include -o build_by_sdcc/fw.rel fw.c
+ c:\PROGRA~1\SDCC\bin\sdcpp.exe -nostdinc -Wall -I"C:\SDCC\pfenrir_inc" -I"c:\program files\sdcc\include" -I"C:\Keil\C51\INC" -I"C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.0\Target\Inc" -I"..//include" -obj-ext=.rel -D__SDCC_MODEL_SMALL -DSDCC_MODEL_SMALL -D__SDCC_FLOAT_REENT -DSDCC_FLOAT_REENT -D__SDCC=3_3_1 -DSDCC=331 -D__SDCC_REVISION=8894 -DSDCC_REVISION=8894 -D__SDCC_mcs51 -DSDCC_mcs51 -D__mcs51 -D__STDC_NO_COMPLEX__ -D__STDC_NO_THREADS__ -D__STDC_NO_ATOMICS__ -D__STDC_NO_VLA__ -isystem "c:\Program Files\SDCC\bin\..\include\mcs51" -isystem "c:\Program Files\SDCC\bin\..\include"  "fw.c"
sdcpp.exe: fatal error: when writing output to : Invalid argument
C:/SDCC/pfenrir_inc/fx2.h:166: syntax error: token -> 'BOOL' ; column 16
心配した変なファイルパスは通っているようですね。スゴイ変な感じ。ありがたいけど。

fx2.hは、結局、
https://raw.github.com/stefanrauch/bel_projects/master/cy7/cyfx2usbuart/fx2.h
から取得したものを使用しました。

fx2.hの"BOOL"がお気に召さないのは、SDCCが"bit"を解釈してくれない(型として持ってない?)ので、
typedef bit             BOOL;
の前に、
#define bit __bit
が追加されています。"__bit"とするとわかってくれるみたいです。

さらに、
extern code BYTE   USB_AutoVector;
でエラーが出ました。
SDCCでは"__code"と書くべきらしいので、直前に
#define code __code
が追加されています。

fx2regs.hも、結局
https://raw.github.com/stefanrauch/bel_projects/master/cy7/cyfx2usbuart/fx2regs.h
を取得して使用しました。

xcode at (0xE400) hogehoge;
のようなところは
__xdata __at(0xE400) hogehoge;
と書くと良いようで、
#define at __at
#define xdata __xdata
が追加されています。


fx2sdly.hも
https://raw.github.com/stefanrauch/bel_projects/0d04410aaf9fdf08728649f722dc5bae1083dc65/cy7/softuart/fx2sdly.h
から取得して使用しました。

その他、
intrins.h
の冒頭部分を
#ifndef _nop_
#ifndef SDCC //added 2013-11-17
#define _nop_() { \
  _asm \
    nop \
  _endasm; \
}
#else//added 2013-11-17 bigin
#define _nop_() { \
  __asm \
    nop \
  __endasm; \
}
#endif//added 2013-11-17 end
#endif
としました。


makefileにある"AS = asx8051"なんですが、どうやら名前が変わったようです。
"AS = sdas8051"とすることで動きました。


fw.c の
//-----------------------------------------------------------------------------
// Interrupt Functions For SDCC
//-----------------------------------------------------------------------------
#ifdef SDCC
の下に、
#ifndef interrupt
#define interrupt __interrupt
#endif
を追加しました。

fw.c と periph.cで、
#include "syncdly.h"
をコメントアウトして
#include "fx2sdly.h"
を足しました。


他にもちょこちょこと触った気がしますが
細かくは覚えてなくて(汗)


この段階でのmakeの結果は
export PATH=/usr/bin:/usr/local/bin:$PATH; \
rm -f ./build_by_sdcc/depend.inc; \
for i in fw.c periph.c; do \
sdcc -E -MMM -I../pfenrir_inc -V  $i 1>> tempfile; \
if ! [ $? = 0 ]; then \
rm -f tempfile; \
exit 1; \
fi; \
done; \
#cat tempfile | sed -e 's/^+.*//g' -e 's/[^\.]*\.rel/./build_by_sdcc\/&/g' >> ./build_by_sdcc/depend.inc; \
sed -e 's/^+.*//g' -e 's/[^\.]*\.rel/\.\/build_by_sdcc\/&/g' tempfile > ./build_by_sdcc/depend.inc; \
cat tempfile > ./build_by_sdcc/tempfile.txt; \
rm -f tempfile
export PATH=/usr/bin:/usr/local/bin:$PATH; \
cp USBJmpTb.asm ./build_by_sdcc/; \
cd ./build_by_sdcc; \
sdas8051 -plosgff USBJmpTb.asm
export PATH=/usr/bin:/usr/local/bin:$PATH; \
cp dscr.asm ./build_by_sdcc/; \
cd ./build_by_sdcc; \
sdas8051 -plosgff dscr.asm
export PATH=/usr/bin:/usr/local/bin:$PATH; \
sdcc -V --debug --model-small --xram-loc 0xe000 --xram-size 0x200 --iram-size 0x100 -I../pfenrir_inc -o build_by_sdcc/bulkloop.hex -L ../pfenrir_lib -l ezusb build_by_sdcc/fw.rel build_by_sdcc/periph.rel build_by_sdcc/USBJmpTb.rel build_by_sdcc/dscr.rel
?ASlink-Error-Bad offset in library file ../pfenrir_lib/ezusb.lib(discon)
+ c:\PROGRA~1\SDCC\bin\sdld.exe -nf "build_by_sdcc/bulkloop.lk"
+ c:\PROGRA~1\SDCC\bin\sdld.exe -nf "build_by_sdcc/bulkloop.lk" returned errorcode 1
make: *** [build_by_sdcc/bulkloop.hex] Error 1
なんでしょうねぇ。
exusb.lib が気に入らないんでしょうか。