2016年11月28日月曜日

FON2405Eのフラッシュメモリを交換→失敗

魔が差して、フラッシュメモリの交換をしてしまった。
MX25L8006EからSST26VF032へ。

しかし、書き込みで失敗してしまう。。。
Unlocking Kernel ...
Writing from /var/cgi9yh6g9 to Kernel ... [w]Post-Write check failed.

やっぱりよく調べてからじゃないといけないね。
せめて同じメーカーとかにしておけばよかった。
酩酊買いしたので、あと20個近くある!

不良在庫にしないためにも何とか解決したいものだ。
とりあえず、ロジアナ使って、SPIモードでJEDEC-ID は読めた。
さてこれからどうしようか・・。

2016年11月16日水曜日

FON2405E カスタムファーム用のドライバ開発(準備)

FON2405EのGPIOを使ってシリアル通信をさせるため、いろいろ回り道をしながら挑戦を続けてきた。
今回は、RalinkSDKで作った FON2405E用カスタムファームに向けたドライバ開発について。

1.カスタムファームの変更

まずは、カーネルコンフィングの変更
[make menuconfig]で、[Loadable module support]以降を適当に有効化しておく
Enable loadable module supportとか。
これを忘れていて、make時にprintkとかが定義されていないと怒られた。ハマった。
http://stackoverflow.com/questions/31195516/error-building-android-kernel-module-on-ubuntu-14-04

その他に、insmodとかlsmodとか必要に応じで、有効にしておく。

ファームができたら、FONに入れておく。

2.テスト用ドライバの作成

とりあえず、準備なので何でも良い。やっつけコードを、末尾に記載。

3.Makefileの準備

 ここがいろいろ試行錯誤した。
HOME:= /home/adeno/fongpio/sdk3301/RT288x_SDK
ARCH := mips
CROSS_COMPILE := /opt/buildroot-gcc342/bin/mipsel-linux-
KPATH := $(HOME)/source/linux-2.6.21.x
obj-m += my1st.o
all:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KPATH) M=$(PWD) modules
clean:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KPATH) M=$(PWD) clean
view raw Makefile hosted with ❤ by GitHub

4.いざ、Make


一撃! うれしい!! 未使用変数の注意が出ているけど、知っているやつなので、放置。

これで、my1st.koができた。

5.NFSマウント

SDKのマニュアルどおり。
mount -o nolock 10.10.10.3:/var/lib/tftpboot /mnt
でOK

6.insmodしてみる

作成したmy1st.koをinsmodすると・・・。


よかったーーー。 ちゃんとprintkも動いている。
あきらめずに続けてよかった。
ラズベリー・パイで下準備しておいて本当によかった。

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/kdev_t.h>
#include <linux/errno.h>
#include <linux/cdev.h>
#include <linux/sched.h>
#include <linux/stat.h>
#include <linux/io.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/version.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <linux/timer.h>
MODULE_AUTHOR("Adeno");
MODULE_LICENSE("Dual BSD/GPL");
#define MYSFR9_VERSION "0.1"
#define MYSFR9_NUM_DEVS 1 /* このドライバが制御するデバイスの数 */
#define MYSFR9_DEVNAME "My1st" /* このデバイスドライバの名称 */
#define MYSFR9_MAJOR 0 /* メジャー番号だが自動設定なので0 */
#define MYSFR9_MINOR 0 /* マイナー番号のベース番号 */
static int _mysfr9_major = MYSFR9_MAJOR;
static int _mysfr9_minor = MYSFR9_MINOR;
static struct cdev *mysfr9_cdev_array = NULL;
static struct class *mysfr9_class = NULL;
/*プロトタイプ宣言*/
//カーネルへの登録関係
//デバイスに対する処理
static int mysfr9_open(struct inode *inode, struct file *filep);
static int mysfr9_release(struct inode *inode, struct file *filep);
static ssize_t mysfr9_write(struct file *filep,const char __user *buf, size_t count, loff_t *f_pos);
static ssize_t mysfr9_read(struct file *filep,char __user *buf,size_t count, loff_t *f_pos);
//File Operations構造体
struct file_operations mysfr9_fops = {
.open = mysfr9_open,
.release = mysfr9_release,
.write = mysfr9_write,
.read = mysfr9_read,
};
///////////////////////////////////////////////////////////////////////////////////////////////////
//デバイスドライバがロードされた時の処理
static int mysfr9_init(void)
{
/* 開始のメッセージ */
printk(KERN_INFO "%s Ver.%s loading...\n", MYSFR9_DEVNAME,MYSFR9_VERSION );
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
//デバイスドライバがアンロードされた時の処理
static void mysfr9_exit(void)
{
printk( KERN_INFO "[%s] driver unregister sccessed.\n",MYSFR9_DEVNAME);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
//デバイスに対する処理
static int mysfr9_open(struct inode *inode, struct file *filep)
{
printk(KERN_INFO "[%s] Device open sccessed.\n",MYSFR9_DEVNAME);
return 0;
}
static int mysfr9_release(struct inode *inode, struct file *filep)
{
printk(KERN_INFO "[%s] Device release sccessed.\n",MYSFR9_DEVNAME);
return 0;
}
static ssize_t mysfr9_write(struct file *filep,const char __user *buf, size_t count, loff_t *f_pos)
{
return 0;
}
static ssize_t mysfr9_read(struct file *filep,char __user *buf,size_t count, loff_t *f_pos){
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
//initの登録
module_init(mysfr9_init);
//exitの登録
module_exit(mysfr9_exit);
view raw my1st.c hosted with ❤ by GitHub

2016年11月14日月曜日

FON2405EにOpenwrt導入の挑戦

約2年ほど前、FON2405Eにカスタムファーム導入に挑戦した。
http://continue-to-challenge.blogspot.jp/2015/01/fon2405e.html

その時は、Openwrtはサイズが2MB以上になってしまい、
結局 RalinkSDK的なものを使ったカスタムファームを導入することにした。
http://continue-to-challenge.blogspot.jp/2015/01/fon2405e_24.html
http://continue-to-challenge.blogspot.jp/2015/01/fon2405e_27.html

でも、最近になって、FONのGPIOでシリアル通信をやらせたいと考えるなかで、
SDKのバージョンも古いし、FONのフラッシュ2MBしか無いのが不満に思えてきた。

いまさらだけど、フラッシュメモリを載せ替えたら幸せになれるんじゃないかと思えてきた。すでにやっている方もいるみたいだし。
https://awaitingstock.wordpress.com/2013/01/11/fon2405efonara-simpl-flsah%E8%BC%89%E3%81%9B%E6%9B%BF%E3%81%88/

そのための準備として、最新のOpenwrtはFON2405E でも動くのか?というのを確認した。


手順1 Openwrtのカーネルソース入手

基本的には、以下の手順だけど、 別にtrunkじゃなくて、安定版が欲しい時は、
https://wiki.openwrt.org/jp/doc/howto/buildroot.exigence
https://dev.openwrt.org/wiki/GetSource

svn co svn://svn.openwrt.org/openwrt/trunk/
git clone -b chaos_calmer git://github.com/openwrt/openwrt.git
にしたら幸せになれた。
 
 手順2 Make!

「make menuconfig」後の話
   Tartget System = Ralink RT288x/RT3xxx
  Subtarget           = RT3x5x/RT5350 based boards

ほかは必要に応じて変更
pppやusb関係が不要なら削除など。

手順3 FON2405Eにお試しインストール

先の手順で、bin/ramips/以下にバイナリイメージがたくさん作成される。
そのなかで、これを試してみる
2369793 bin/ramips/openwrt-ramips-rt305x-rt-g32-b1-initramfs-uImage.bin
なぜお試しかというと、イメージサイズが、2MB以上だからOrz
インストールできない!!

作成したイメージをTFTPサーバー上においておく、名前は適当に今回はuImage.bin。
このサーバーのIPは10.10.10.3とした(FONのU-Bootのデフォルトがそうだから) 。

FONはリセットボタンを押しながら電源ONして、U-Bootの起動オプションで3を選択!

その後、 コマンドラインから
tftpboot 80800000  uImage.bin
そして、
bootm
とすると、Openwrtが起動しました!



嬉しいけど、やっぱりインストールしたい!
フラッシュメモリを載せ替えるか!?



ラズベリー・パイのカーネルビルドとクロスコンパイル環境のメモ

時間がたつと忘れそうなので、メモ

 カーネルビルドとクロスコンパイル環境の作成
https://www.raspberrypi.org/documentation/linux/kernel/building.md

Raspiのバージョンによって手順が異なるので注意。
以下はRaspi1の場合
git clone --depth=1 https://github.com/raspberrypi/linux
cd linux
KERNEL=kernel
make bcmrpi_defconfig