yoctoにはbuildプロセスを自動化してくれるツールHobがあります。
以下のサイトを参考にQemuのARMエミュレータ用のLINUXをbuildしてみました。
https://www.ibm.com/developerworks/jp/linux/library/l-yocto-linux/
まずBuildしたい対象を選択します。今回は、QEMUARMを選択します。次にどのようなイメージをBuildするか決めるレシピを選択します。今回はcore-image-satoを選択しました。
buildします。終わるまで、数時間待ちます。
Buildが終わると上のが面になります。ここでRun Imageを実行してエミュレータを実行します。
YOCTOでARMのBuildおよびHobの仕様が出きるようになりました。
月別アーカイブ: 2014年2月
LPC11U35 QSB IAP EEPROM API
LPC11U35には、EEPROMが内蔵されています。不揮発メモリとして利用できるので使用してみました。
IDEには、LPCXpresso v6.1.0_164を使用しました。LPC11Uxx LPCXpresso Examplesには、eepROMapiというサンプルプログラムが含まれています。これを流用します。このサンプルは、UARTを使用したIFなので、ここをUSBのCDCに置き換えました。実際には、前に作ったCDCのプログラムにEEPROMの部分を加えていきました。EEPROMの部分を加えるとBuildでエラーが出るようになります。
fseek.c:(.text.fseek+0x2a): undefined reference to `_Csyscall1′
解決方法は以下URLにありました。
http://www.support.code-red-tech.com/CodeRedWiki/UndefinedReference
Propaties→Settings→MCU Linker→Targetの中のUse C libraryをRedlib(none)からRedlib(semihost)に変更しました。
これでBuildがとおりEEPROMの読み書きができるようになりました。
後、注意は、
SystemCoreClockUpdate();の前に
LPC_SYSCON->SYSAHBCLKCTRL |= (1UL<<9); /* enable clock */
を設定しないとLPC_CT32B0のタイマが動きません。
Flush書き込みと違いそのまま割り込みも使えるし、EEPROMは、電源切ってもデータが保持できるのでいろいろ使えそうです。
http://akizukidenshi.com/catalog/g/gM-06948/
http://www.embeddedartists.com/products/boards/lpc11u35_qsb.php
Yocto Project Quick Start
組込みLINUXの勉強の一環でYoctoに触れたいと思います。まずは、Quick Startに沿ってQEMUのエミュレータで起動するところまで行います。
https://www.yoctoproject.org/docs/Acurrent/yocto-project-qs/yocto-project-qs.html
Ubuntu12.04LTSで開発を行います。以下コマンドで開発環境を整えます。
sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath libsdl1.2-dev xterm
次に作業フォルダを作成します。自分は、ユーザのHomeの下にworkを作りその中にyoctoフォルダを作成しました。
$ wget http://downloads.yoctoproject.org/releases/yocto/yocto-1.5.1/poky-dora-10.0.1.tar.bz2
Yocto Projectをダウンロードします。
$ tar xjf poky-dora-10.0.1.tar.bz2
ダウンロードしたファイルを上で作成した作業フォルダで解凍します。
$ cd poky-dora-10.0.1
解凍してできたフォルダに移動します。
$ source oe-init-build-env
環境構築スクリプトを実行します。これでBuildの準備が完了です。
$ bitbake -k core-image-sato
OS imageを作成します。このBiuld時間は、自分のPCで半日くらいかかりました。
$ runqemu qemux86
出来たOS Imageを実行します。
起動画面です。
こんなGUIで立ち上がります。
LPC11U35 QSB USB CDC(VCom)
サンプルプログラムは以下サイトからダウンロードできます。
http://www.lpcware.com/content/nxpfile/sample-code-bundle-lpc11uxx-peripherals-using-lpcxpresso
USB_ROM_CDCのサンプルソフトは、QSBのサンプルと同じです。他のサンプルも試したいのでダウンロードしておきます。WindowsのCDCドライバはQSBのサンプルについているものを使用しました。上記URLからダウンロードした中には、Windwosのドライバは入っていません。IDEは、LPCXpresso v6.1.0_164を使用しました。新しくWorkspaceを作成し、ダウンロードしたLPC11Uxx LPCXpresso Examples.zipをインポートします。USB_ROM_CDCを改造します。まず、MPU SettingsをLPC11U35/401に設定します。また、USB ISPで書き込むのでbinファイルを生成する設定にします。Post-build stepsでarm-none-eabi-objcopy -O binary “${BuildArtifactFileName}” “${BuildArtifactFileBaseName}.bin” ; の前にある#を削除してbinファイルとチェックサム生成が行われるようにします。これでまず、一度buildし書き込みます。RESETするとドライバの要求があるのでQSBのサンプルにあるものを指定します。
デバイスマネージャでポートの確認をします。LPC11Uxx USB Vcom portとして認識されています。
とりあえず、ループバックに改造します。サンプルは、USARTとUSBのブリッジサンプルなので、まずこれをやめます。main.cにある#define UART_BRIDGE 1の宣言を削除します。これでブリッジはしなくなります。このままでは、繋いでも何も送信が返ってきません。
ErrorCode_t VCOM_bulk_out_hdlr(USBD_HANDLE_T hUsb, void* data, uint32_t event)関数を修正します。
受信イベントでサンプルは、受信しても送信バッファに何入れません。
if (pVcom->rxlen == 0) {
pVcom->rxlen = pUsbApi->hw->ReadEP(hUsb, USB_CDC_EP_BULK_OUT, pVcom->rxBuf);
pVcom->txlen = pVcom->rxlen;
memcpy(pVcom->txBuf, pVcom->rxBuf, pVcom->rxlen);
pVcom->send_fn(pVcom);
pVcom->rxlen = 0;
}
受信長を送信長にコピーし受信バッファを送信バッファにコピーします。これでループバックします。ハイパーターミナルで動作確認とれました。
http://www.embeddedartists.com/products/boards/lpc11u35_qsb.php
http://akizukidenshi.com/catalog/g/gM-06948/