Raspberry PiでPICマイコンを焼く

2018/5/21追記:

公式サイト紹介しているブログを見てもらうと早いが、pickleが幅広いPICマイコンに対応している。下記で紹介されている方法では、限られたPICマイコンしか書き込みができない。pickleを使ったほうが、いろんなPICマイコンに対応していて便利かもしれないのでご参考に

 

何かわからないところがあったらコメントを書くか@akimasa2000にでも話しかけてくれると、答えるかも?

インストール

まずは適当なRaspberry Piを用意して、Raspbianを入れておく。そして、build-essential(おそらく初期で入っている)とgit(git cloneでダウンロードしない場合は不要)を入れる。その後、リポジトリを取得して、ビルドする。

sudo apt update
sudo apt install build-essential git
git clone https://github.com/WallaceIT/picberry
cd picberry
make raspberrypi #詳細は下表を参照

picberryの説明に次のような表がある。

TARGET Processor/Board
raspberrypi Raspberry Pi v1 or Zero
raspberrypi2 Raspberry Pi v2 or v3
am335x Boards based on TI AM335x (BeagleBone)
a10 Boards based on Allwinner A10 (Cubieboard)

自分の使うRasPiが1だったり、Zeroの場合はmake raspberrypiと、2や3の場合はmake raspberrypi2でビルドする。

接続

上の図はattiny85だと書いてあるが、これをPIC12F322だと思って欲しい。左に切り欠きがあって、左下に1ピンのサインがある。

電源以外に接続する必要があるピンはデータシートを参照してほしい。

picberryの説明に次のようにある

If not specified in the command line, the default GPIOs <-> PIC connections are the following:

for the Raspberry Pi:

PGC  <-> GPIO23
PGD  <-> GPIO24
MCLR <-> GPIO18

操作する

picberryのディレクトリに実行ファイルが出来上がっていると思うので、実行する。

次のようなメッセージが出た場合は、接続が間違っているか何か問題がある。

sudo ./picberry -f pic10f322 -b
picberry PIC Programmer v0.2
Device ID: 0x0
ERROR: unknown/unsupported device or programmer not connected.
Press ENTER to exit program mode...

ブランクチェック

新品のPIC10F322を使った場合は、次のようなメッセージが出てくる。

sudo ./picberry -f pic10f322 -b
picberry PIC Programmer v0.2
Device Name: PIC10F322
Device ID: 0x0000014c
Revision: 0x00000002
Blank check...chip is blank.
Press ENTER to exit program mode...

バルクイレース

 $ sudo ./picberry -f pic10f322 -e
picberry PIC Programmer v0.2
Device Name: PIC10F322
Device ID: 0x0000014c
Revision: 0x00000002
Bulk Erase...DONE!
Press ENTER to exit program mode...

書き込み

 $ sudo ./picberry -f pic10f322 -e
picberry PIC Programmer v0.2
Device Name: PIC10F322
Device ID: 0x0000014c
Revision: 0x00000002
Bulk Erase...DONE!
Press ENTER to exit program mode...

対応しているPIC

Pull Requestにあるように、次のデバイスでの読み書きはテストした。秋月で入手できた奴だけだ…。

  • PIC10F322
  • PIC12LF1822
  • PIC16F1823
  • PIC16F1825
  • PIC16F1827
  • PIC16F1828
  • PIC16F1829

次のデバイスでもテストは行っていないが可能なはず。(順番は昇順でなく適当なので注意)

  • PIC10F320
  • PIC10LF320
  • PIC16F1826
  • PIC16LF1826
  • PIC16LF1827
  • PICLF1823
  • PIC12F1822
  • PIC16F1824
  • PIC16LF1824
  • PIC16LF1825
  • PIC16LF1828
  • PIC16LF1829

RasPiでiSCSIを使うためカーネルをビルドした

TL;DR

Raspberry PiでiSCSIターゲットを利用したい場合Archを使うと楽かも

Kernel buildingを参照してカーネルをビルド、インストールすればよい。

menuconfigで、Device Drivers —> Generic Target Core Mod (TCM) and ConfigFS Infrastructureを有効にし、Generic Target Core Mod (TCM) and ConfigFS Infrastructureの中も必要なモジュールを有効にして、ビルドする。

あとはKernel buildingに従ってSDカードに転送する。

本文

Kernel buildingを参照していろいろ準備する。
Bash on Windowsで入るUbuntuではbc, build-essential, libncurses5-devが必要だった。
説明にある通り進めて、make bcm2709_defconfigのあとにmenuconfigに入る。
下記の感じ。

git clone https://github.com/raspberrypi/tools ~/tools
echo PATH=\$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin >> ~/.bashrc
source ~/.bashrc
git clone --depth=1 https://github.com/raspberrypi/linux
cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j16

menuconfigではDevice Drivers —> Generic Target Core Mod (TCM) and ConfigFS Infrastructureを選択してMキーを押す。割と最初の方にある。

そして、zImage modules dtbsを(modulesだけでよかったかも?)makeすると、いろいろ生成されるが、次のファイルが重要になる。

 LD [M] crypto/crct10dif_common.ko
 LD [M] crypto/crct10dif_generic.ko
 LD [M] drivers/target/target_core_mod.ko
 LD [M] lib/crc-t10dif.ko

scp使うのも面倒なので、tar c crypto/crct*.ko drivers/target/target_core_mod.ko lib/crc-t10dif.ko | gzip | base64 でbase64を吐き出させて(実際は> /mnt/c/Users/hoge/hoge.txtみたいにデスクトップ上の適当なファイルに吐き出させた。)、 base64 -d | tar zxvをRaspberry Piの方で実行して、吐き出されたbase64を貼り付けて、開業して、Ctrl-dで転送した。

sudo insmod crypto/* lib/* drivers/target/*

これでよいかと思ったら、Generic Target Core Mod (TCM) and ConfigFS InfrastructureをMキー押して有効にしたら、開いたところにさらに選べるのが出てきていて、それが足りていなくてダメなようだった。
仕方がないので有効にしてビルドしなおしているが、エラーが出た。
cleanして、modulesだけmakeして何とかなった。
面倒なので、RasPiでnc -l -p 8000 > ~/mod.tar.gz実行して、
Bash on Windows

mkdir -p mnt/ext4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
cd mnt/ext4
tar czvf ~/mod.tar.gz ./
cat ~/mod.tar.gz | nc (RasPi IP Address) 8000

RasPi

cd /
sudo tar xf ~/mod.tar.gz

で、適当に転送して書き換えた。
うまくいかんので、”depmod -a”したが意味ない。
cat lib/modules/4.9.76-v7+/modules.builtin見てみたらkernel/lib/crc-t10dif.koとかあったので、curl https://raw.githubusercontent.com/Hexxeh/rpi-firmware/master/modules/4.9.76-v7%2B/modules.builtin | sudo tee modules.builtinとかやってみたが、意味なかった。

mkdir -p mnt/fat32/overlays/
cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
cp arch/arm/boot/dts/*.dtb mnt/fat32/
cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

あとはmnt/fat32/をRasPiの/boot/にコピーして、再起動するだけでよかった。
そしたら、無事targetcli-fbが入った。

iSCSIをRasPiで使いたい

やりたいこと

Raspberry Pi 3をiSCSIターゲットにしたい。

TL;DR

Raspberry PiでiSCSIターゲットを利用したい場合Archを使うと楽かも

RasPiでiSCSIを使うためカーネルをビルドした

iSCSI Enterprise Targetのパッケージiscsitargetは古いので、LIOターゲットを使うべき。らしい。LIOターゲットのパッケージであるtargetcli-fbはRaspbianに入ってはいるが、カーネルを自分でビルドしないと使えなさそう。

試行記録

Raspbianでiscsitarget-dkmsを入れようとしたら次のようなエラーが出た

Setting up linux-kbuild-3.6 (3.6-1~experimental.1+rpi2+b2) ...
Setting up iscsitarget-dkms (1.4.20.3+svn502-2) ...

Creating symlink /var/lib/dkms/iscsitarget/1.4.20.3+svn502/source ->
 /usr/src/iscsitarget-1.4.20.3+svn502

DKMS: add completed.
Error! echo
Your kernel headers for kernel 4.9.59-v7+ cannot be found at
/lib/modules/4.9.59-v7+/build or /lib/modules/4.9.59-v7+/source.
Removing old iscsitarget-1.4.20.3+svn502 DKMS files...

------------------------------
Deleting module version: 1.4.20.3+svn502
completely from the DKMS tree.
------------------------------
Done.
Loading new iscsitarget-1.4.20.3+svn502 DKMS files...
It is likely that 4.9.59-v7+ belongs to a chroot's host
Building for 3.6-trunk-rpi, 4.9.59+ and 4.9.59-v7+
Building initial module for 3.6-trunk-rpi
Error! Bad return status for module build on kernel: 3.6-trunk-rpi (armv7l)
Consult /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/make.log for more information.
Setting up linux-headers-3.6-trunk-rpi (3.6.9-1~experimental.1+rpi7) ...
Examining /etc/kernel/header_postinst.d.
run-parts: executing /etc/kernel/header_postinst.d/dkms 3.6-trunk-rpi
Error! Bad return status for module build on kernel: 3.6-trunk-rpi (armv7l)
Consult /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/make.log for more information.

raspberrypi-kernel-headersを入れてみたが、古いようでダメだった。
rpi-updateで入るかと思ったが、これでもダメだった。

調べてみて出てきたので、rpi-sourceを使ってみた。そのままではGCCのバージョンが違うようで実行できないので、rpi-source --skip-gccで通った。が、dkms autoinstallが通らない。

sudo apt install gcc-4.9 g++-4.9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 20
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 50
cd ~/linux/
make clean
make modules_prepare
sudo dkms autoinstall

しかし、やはり通らない。

$ cat /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/make.log  DKMS make.log for iscsitarget-1.4.20.3+svn502 for kernel 4.9.76-v7+ (armv7l)
Sun 14 Jan 18:29:00 JST 2018
make: Entering directory '/home/pi/linux-5aa4c3138c62f89b0f805c6591018d16c562e77c'
  LD      /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/built-in.o
  LD      /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/built-in.o
  CC [M]  /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/tio.o
  CC [M]  /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.o
  CC [M]  /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.o
  CC [M]  /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/wthread.o
In file included from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/tio.c:7:0:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:274:19: error: field ‘rx_hash’ has incomplete type
  struct hash_desc rx_hash;
                   ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:275:19: error: field ‘tx_hash’ has incomplete type
  struct hash_desc tx_hash;
                   ^
In file included from ./include/linux/sched.h:17:0,
                 from ./include/linux/blkdev.h:4,
                 from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:11,
                 from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/tio.c:7:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/tio.c: In function ‘tio_add_data’:
./include/linux/kernel.h:739:16: warning: comparison of distinct pointer types lacks a cast
  (void) (&min1 == &min2);   \
                ^
./include/linux/kernel.h:742:2: note: in expansion of macro ‘__min’
  __min(typeof(x), typeof(y),   \
  ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/tio.c:75:25: note: in expansion of macro ‘min’
  const size_t to_copy = min(tio->pg_cnt * PAGE_SIZE - iter->size, len);
                         ^
./include/linux/kernel.h:739:16: warning: comparison of distinct pointer types lacks a cast
  (void) (&min1 == &min2);   \
                ^
./include/linux/kernel.h:742:2: note: in expansion of macro ‘__min’
  __min(typeof(x), typeof(y),   \
  ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/tio.c:82:18: note: in expansion of macro ‘min’
   size_t chunk = min(PAGE_SIZE - iter->pg_off, residual);
                  ^
In file included from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/wthread.c:9:0:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:274:19: error: field ‘rx_hash’ has incomplete type
  struct hash_desc rx_hash;
                   ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:275:19: error: field ‘tx_hash’ has incomplete type
  struct hash_desc tx_hash;
                   ^
In file included from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:16:0:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:274:19: error: field ‘rx_hash’ has incomplete type
  struct hash_desc rx_hash;
                   ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:275:19: error: field ‘tx_hash’ has incomplete type
  struct hash_desc tx_hash;
                   ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c: In function ‘iscsi_conn_init_read’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:45:16: error: ‘struct msghdr’ has no member named ‘msg_iov’
  conn->read_msg.msg_iov = conn->read_iov;
                ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:46:16: error: ‘struct msghdr’ has no member named ‘msg_iovlen’
  conn->read_msg.msg_iovlen = 1;
                ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c: In function ‘forward_iov’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:86:12: error: ‘struct msghdr’ has no member named ‘msg_iov’
  while (msg->msg_iov->iov_len <= len) { ^ /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:87:13: error: ‘struct msghdr’ has no member named ‘msg_iov’ len -= msg->msg_iov->iov_len;
             ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:88:6: error: ‘struct msghdr’ has no member named ‘msg_iov’
   msg->msg_iov++;
      ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:89:6: error: ‘struct msghdr’ has no member named ‘msg_iovlen’
   msg->msg_iovlen--;
      ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:92:5: error: ‘struct msghdr’ has no member named ‘msg_iov’
  msg->msg_iov->iov_base = (char *) msg->msg_iov->iov_base + len;
     ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:92:39: error: ‘struct msghdr’ has no member named ‘msg_iov’
  msg->msg_iov->iov_base = (char *) msg->msg_iov->iov_base + len;
                                       ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:93:5: error: ‘struct msghdr’ has no member named ‘msg_iov’
  msg->msg_iov->iov_len -= len;
     ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c: In function ‘do_recv’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:113:5: error: ‘struct msghdr’ has no member named ‘msg_iov’
  msg.msg_iov = iov;
     ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:114:5: error: ‘struct msghdr’ has no member named ‘msg_iovlen’
  msg.msg_iovlen = min_t(size_t, conn->read_msg.msg_iovlen, ISCSI_CONN_IOV_MAX);
     ^
In file included from ./include/linux/list.h:8:0,
                 from ./include/linux/module.h:9,
                 from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:9:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:114:47: error: ‘struct msghdr’ has no member named ‘msg_iovlen’
  msg.msg_iovlen = min_t(size_t, conn->read_msg.msg_iovlen, ISCSI_CONN_IOV_MAX);
                                               ^
./include/linux/kernel.h:737:13: note: in definition of macro ‘__min’
  t1 min1 = (x);     \
             ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:114:19: note: in expansion of macro ‘min_t’
  msg.msg_iovlen = min_t(size_t, conn->read_msg.msg_iovlen, ISCSI_CONN_IOV_MAX);
                   ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:115:30: error: ‘struct msghdr’ has no member named ‘msg_iovlen’
  for (i = 0, len = 0; i < msg.msg_iovlen; i++) { ^ /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:116:26: error: ‘struct msghdr’ has no member named ‘msg_iov’ iov[i] = conn->read_msg.msg_iov[i];
                          ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:122:8: error: too many arguments to function ‘sock_recvmsg’
  res = sock_recvmsg(conn->sock, &msg, len, MSG_DONTWAIT | MSG_NOSIGNAL);
        ^
In file included from ./include/linux/skbuff.h:29:0,
                 from ./include/linux/if_ether.h:23,
                 from ./include/uapi/linux/ethtool.h:18,
                 from ./include/linux/ethtool.h:17,
                 from ./include/linux/netdevice.h:42,
                 from ./include/net/sock.h:51,
                 from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:19,
                 from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:16:
./include/linux/net.h:228:5: note: declared here
 int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags);
     ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c: In function ‘write_data’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:343:9: error: too few arguments to function ‘vfs_writev’
   res = vfs_writev(file, (struct iovec __user *) iop, count, &off);
         ^
In file included from ./include/linux/seq_file.h:10:0,
                 from ./include/linux/pinctrl/consumer.h:17,
                 from ./include/linux/pinctrl/devinfo.h:21,
                 from ./include/linux/device.h:24,
                 from ./include/linux/genhd.h:64,
                 from ./include/linux/blkdev.h:9,
                 from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:11,
                 from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:16:
./include/linux/fs.h:1782:16: note: declared here
 extern ssize_t vfs_writev(struct file *, const struct iovec __user *,
                ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:378:18: error: ‘PAGE_CACHE_SHIFT’ undeclared (first use in this function)
  idx = offset >> PAGE_CACHE_SHIFT;
                  ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:378:18: note: each undeclared identifier is reported only once for each function it appears in
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:379:13: error: ‘PAGE_CACHE_MASK’ undeclared (first use in this function)
  offset &= ~PAGE_CACHE_MASK;
             ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:386:14: error: ‘PAGE_CACHE_SIZE’ undeclared (first use in this function)
   sendsize = PAGE_CACHE_SIZE - offset;
              ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c: In function ‘close_conn’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.c:669:32: warning: assignment from incompatible pointer type
  conn->sock->sk->sk_data_ready = target->nthread_info.old_data_ready;
                                ^
scripts/Makefile.build:293: recipe for target '/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/tio.o' failed
make[2]: *** [/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/tio.o] Error 1
make[2]: *** Waiting for unfinished jobs....
scripts/Makefile.build:293: recipe for target '/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/wthread.o' failed
make[2]: *** [/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/wthread.o] Error 1
scripts/Makefile.build:293: recipe for target '/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.o' failed
make[2]: *** [/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/nthread.o] Error 1
In file included from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:13:0:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:274:19: error: field ‘rx_hash’ has incomplete type
  struct hash_desc rx_hash;
                   ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:275:19: error: field ‘tx_hash’ has incomplete type
  struct hash_desc tx_hash;
                   ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c: In function ‘cmnd_skip_pdu’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:485:21: error: ‘PAGE_CACHE_SIZE’ undeclared (first use in this function)
  for (i = 0; size > PAGE_CACHE_SIZE; i++, size -= PAGE_CACHE_SIZE) {
                     ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:485:21: note: each undeclared identifier is reported only once for each function it appears in
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:492:16: error: ‘struct msghdr’ has no member named ‘msg_iov’
  conn->read_msg.msg_iov = conn->read_iov;
                ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:493:16: error: ‘struct msghdr’ has no member named ‘msg_iovlen’
  conn->read_msg.msg_iovlen = ++i;
                ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c: In function ‘cmnd_recv_pdu’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:712:39: error: ‘PAGE_CACHE_SIZE’ undeclared (first use in this function)
  if (!(offset + size <= tio->pg_cnt * PAGE_CACHE_SIZE)) {
                                       ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:718:18: error: ‘PAGE_CACHE_SHIFT’ undeclared (first use in this function)
  idx = offset >> PAGE_CACHE_SHIFT;
                  ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:719:13: error: ‘PAGE_CACHE_MASK’ undeclared (first use in this function)
  offset &= ~PAGE_CACHE_MASK;
             ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:721:16: error: ‘struct msghdr’ has no member named ‘msg_iov’
  conn->read_msg.msg_iov = conn->read_iov;
                ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:733:18: error: ‘struct msghdr’ has no member named ‘msg_iovlen’
    conn->read_msg.msg_iovlen = ++i;
                  ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:740:18: error: ‘struct msghdr’ has no member named ‘msg_iovlen’
    conn->read_msg.msg_iovlen = i;
                  ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c: In function ‘nop_out_start’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:921:17: error: ‘struct msghdr’ has no member named ‘msg_iov’
   conn->read_msg.msg_iov = conn->read_iov;
                 ^
In file included from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:13:0:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:456:36: error: ‘PAGE_CACHE_SIZE’ undeclared (first use in this function)
 #define get_pgcnt(size) (((size) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)
                                    ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:924:17: note: in expansion of macro ‘get_pgcnt’
    int pg_cnt = get_pgcnt(size);
                 ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:456:60: error: ‘PAGE_CACHE_SHIFT’ undeclared (first use in this function)
 #define get_pgcnt(size) (((size) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)
                                                            ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:924:17: note: in expansion of macro ‘get_pgcnt’
    int pg_cnt = get_pgcnt(size);
                 ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:949:17: error: ‘struct msghdr’ has no member named ‘msg_iovlen’
   conn->read_msg.msg_iovlen = i;
                 ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c: In function ‘scsi_cmnd_start’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:989:7: error: ‘SERVICE_ACTION_IN’ undeclared (first use in this function)
  case SERVICE_ACTION_IN:
       ^
In file included from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:13:0:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:456:36: error: ‘PAGE_CACHE_SIZE’ undeclared (first use in this function)
 #define get_pgcnt(size) (((size) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)
                                    ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:1030:24: note: in expansion of macro ‘get_pgcnt’
   req->tio = tio_alloc(get_pgcnt(length));
                        ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:456:60: error: ‘PAGE_CACHE_SHIFT’ undeclared (first use in this function)
 #define get_pgcnt(size) (((size) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)
                                                            ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:1030:24: note: in expansion of macro ‘get_pgcnt’
   req->tio = tio_alloc(get_pgcnt(length));
                        ^
In file included from /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:14:0:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c: In function ‘nop_out_exec’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:456:36: error: ‘PAGE_CACHE_SIZE’ undeclared (first use in this function)
 #define get_pgcnt(size) (((size) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)
                                    ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi_dbg.h:60:9: note: in definition of macro ‘assert’
   if (!(p)) {      \
         ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:1479:10: note: in expansion of macro ‘get_pgcnt’
   assert(get_pgcnt(req->pdu.datasize) < ISCSI_CONN_IOV_MAX); ^ /var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.h:456:60: error: ‘PAGE_CACHE_SHIFT’ undeclared (first use in this function) #define get_pgcnt(size) (((size) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)
                                                            ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi_dbg.h:60:9: note: in definition of macro ‘assert’
   if (!(p)) {      \
         ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:1479:10: note: in expansion of macro ‘get_pgcnt’
   assert(get_pgcnt(req->pdu.datasize) < ISCSI_CONN_IOV_MAX);
          ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c: In function ‘__cmnd_send_pdu’:
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.c:1638:40: error: ‘PAGE_CACHE_SIZE’ undeclared (first use in this function)
  assert(offset + size <= tio->pg_cnt * PAGE_CACHE_SIZE);
                                        ^
/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi_dbg.h:60:9: note: in definition of macro ‘assert’
   if (!(p)) {      \
         ^
scripts/Makefile.build:293: recipe for target '/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.o' failed
make[2]: *** [/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel/iscsi.o] Error 1
scripts/Makefile.build:544: recipe for target '/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel' failed
make[1]: *** [/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build/kernel] Error 2
Makefile:1497: recipe for target '_module_/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build' failed
make: *** [_module_/var/lib/dkms/iscsitarget/1.4.20.3+svn502/build] Error 2
make: Leaving directory '/home/pi/linux-5aa4c3138c62f89b0f805c6591018d16c562e77c'

https://bugs.launchpad.net/ubuntu/+source/iscsitarget/+bug/1668808/comments/2

こんな記述を発見した。どうやら不要らしい。

と思いきや、 iscsitarget not enabled in “/etc/default/iscsitarget”, not starting…で起動していなかったので言われたファイルを編集する。

モジュールが足りなくて起動しなかった。

よく調べたら、現在の標準はIETではなくLIOらしい。

そこで、targetcli-fbを入れたがサービス起動時に次のようなエラーが出てダメだった。target_coreがないらしい。

Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: Loading rstlib-fb targetctl: targetctlTraceback (most recent call last):
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: File "/usr/bin/targetctl", line 82, in <module>
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: main()
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: File "/usr/bin/targetctl", line 79, in main
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: funcs[sys.argv[1]](savefile)
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: File "/usr/bin/targetctl", line 47, in restore
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: errors = RTSRoot().restore_from_file(restore_file=from_file)
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: File "/usr/lib/python2.7/dist-packages/rtslib_fb/root.py", line 67, in __init__
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: modprobe('target_core_mod')
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: File "/usr/lib/python2.7/dist-packages/rtslib_fb/utils.py", line 392, in modprobe
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: raise RTSLibError(stderrdata)
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: rtslib_fb.utils.RTSLibError: modprobe: FATAL: Module target_core_mod not found in directory /lib/modules/4.9.76-v7+
Jan 14 20:31:04 rpi3-iscsi rtslib-fb-targetctl[1031]: failed!

githubにそれっぽいissueがあったが、進展が今のところない。自分でカーネルをビルドしなおすしかなさそうな感じだった。

Build OpenOCD on Raspberry Pi

Raspberry Pi 3でOpenOCDをビルドしてみた。

$ git clone git://repo.or.cz/openocd.git
$ cd openocd/
$ ./bootstrap
$ ./configure --enable-sysfsgpio --enable-bcm2835gpio
$ make -j4

上記コマンドを実行する。ビルドにそんなに時間はかからなかったと思う。終わったら、tarに固めて、手元にあるRaspberry Pi Zero Wに転送して、使った。

秋月のAE-TYBLE16のFlashを読み取るのには成功したと思う。書き込みはまだ試していない。ちなみに、openocd.cfgの内容は下記の通り。Raspberry Pi Zero Wなので、初代RasPiと同じCPUを積んでいて、GPIOのメモリアドレスは初代のものを使う。adafruitの記事を真似て書いた。そちらの記事にも書いてあるが、下記のopenocd.cfgだと、SWDIOがBCM24ピン、SWDCLKがBCM25ピンになる。なお、Raspberry Pi 2以降で使う別のファイルであるinterface/raspberrypi2-native.cfgだと標準でSWDのピンが選ばれていたと思うので、openocd.cfgでわざわざ指定しなくてもSWDIOがBCM24ピン、SWDCLKがBCM25ピンになるはず。(2019年1月追記:ピンヘッダでは18ピンと22ピンになる)

source [find interface/raspberrypi-native.cfg]
transport select swd
bcm2835gpio_swd_nums 25 24
bcm2835gpio_trst_num 7
bcm2835gpio_srst_num 18
source [find target/nrf51.cfg]

Debianのopenocdパッケージのソースを見てみたが、普通に--enable-bcm2835gpioってconfigureのフラグに普通にあったので、多分RasPiで使える。

時間がない方や急いでいる人は、Debian(もしかしたらRaspbianも?)のパッケージをインストールすると良いかもしれない。試していないので、動くかどうかはよくわからない。

Raspberry Pi ZeroがUSB LANアダプタとして認識されない

/boot/config.txtにdtoverlay=dwc2を追記、/boot/cmdline.txtの最後に modules-load=dwc2,g_etherを追記した(スペース入れてから追記する。改行はしないで1行のまま追記する。)
しかし、Windowsだとプラグ・アンド・プレイで認識されないらしい。

その場合は、適当なRNDISドライバを使うと良いらしい。
デバイスマネージャーで、認識されてしまっている怪しげなシリアルポートのドライバを更新する。その際に、ダウンロードしたcabファイルを展開したフォルダを選択する。

 

https://qiita.com/gpsnmeajp/items/126fadd3e47cdd4a6c00

OpenOCDをビルドする(再び)w/ MSYS2

Building OpenOCD under Windows using MSYS2

上記ページを参考に進めている。

ハマったところがあったら書いていく。

Bash on Ubuntu on Windowsでビルドすることもできる。昨日書いた情報が参考になればと思う。

ソースを落とせない

git cloneでタイムアウトしたみたい。PKGBUILDを編集して、
source=("${_realname}::git+https://git.code.sf.net/p/openocd/code")のURLをhttp://repo.or.cz/openocd.gitにした。sourceforgeは終わっている…。ミラーの方が速い。

ビルドした

https://github.com/Alexpux/MINGW-packages/を適当な場所に落として、mingw-w64-openocd-gitに移動した。前の項にあるように、ソースが落とせなかったらミラーを変えると良い。あとは MINGW_INSTALLS=mingw64 makepkg-mingw -sLで自動的に依存するパッケージが入って、ビルドが走る。

パッケージファイルが吐き出された。正常かどうかはまだ試していない。

少し試した(1/11更新)

とりあえず、ドライバを入れて認識させるところまで進んだ。

Zadigを入れて、libusbKのドライバを入れると良い。最初は、Alteraのドライバを入れてみたが、意味がなかった。次に、libusb-win32でやってみたが、うまくいかなかった。

libusb-win32だと、以下のような出力が出ていた。

$ openocd -f interface/altera-usb-blaster.cfg

Open On-Chip Debugger 0.10.0+dev-00230-g81a33244d (2018-01-08-18:01)
Licensed under GNU GPL v2
For bug reports, read
 http://openocd.org/doc/doxygen/bugs.html
Warn : Adapter driver 'usb_blaster' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
Info : No lowlevel driver configured, will try them all
Info : usb blaster interface using libftdi
Error: unable to open ftdi device: ftdi_usb_reset failed

libusbKだと次のような感じだ

Open On-Chip Debugger 0.10.0+dev-00230-g81a33244d (2018-01-08-18:01)
Licensed under GNU GPL v2
For bug reports, read
 http://openocd.org/doc/doxygen/bugs.html
Warn : Adapter driver 'usb_blaster' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
Info : No lowlevel driver configured, will try them all
Info : usb blaster interface using libftdi
Error: unable to get latency timer
Info : This adapter doesn't support configurable speed
Warn : There are no enabled taps. AUTO PROBING MIGHT NOT WORK!!
Error: JTAG scan chain interrogation failed: all ones
Error: Check JTAG interface, timings, target power, etc.
Error: Trying to use configured scan chain anyway...
Warn : Bypassing JTAG setup events due to errors
Warn : gdb services need one or more targets defined

これの方がうまくいっている気がする。

自分の環境では意味なかった

TL;DR

nrf51822の書き込みはできない。

結局、USB Blasterは認識されたみたいだが、JTAGにしか対応していないらしく、SWDが必要なnrf51822の書き込みはできないみたいだった。

$ openocd -f interface/altera-usb-blaster.cfg -f target/nrf51.cfg -c 'transport select swd'
Open On-Chip Debugger 0.10.0+dev-00230-g81a33244d (2018-01-08-18:01)
Licensed under GNU GPL v2
For bug reports, read
 http://openocd.org/doc/doxygen/bugs.html
Warn : Adapter driver 'usb_blaster' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
embedded:startup.tcl:21: Error: newtap: nrf51.cpu missing IR length
in procedure 'script'
at file "embedded:startup.tcl", line 60
in procedure 'swj_newdap' called at file "C:/tools/msys64/mingw64/bin/../share/openocd/scripts/target/nrf51.cfg", line 33
in procedure 'jtag' called at file "C:/tools/msys64/mingw64/bin/../share/openocd/scripts/target/swj-dp.tcl", line 30
in procedure 'ocd_bouncer'
at file "embedded:startup.tcl", line 21
$ openocd -f interface/altera-usb-blaster.cfg -c 'transport select swd' -f target/nrf51.cfg
Open On-Chip Debugger 0.10.0+dev-00230-g81a33244d (2018-01-08-18:01)
Licensed under GNU GPL v2
For bug reports, read
 http://openocd.org/doc/doxygen/bugs.html
Warn : Adapter driver 'usb_blaster' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
Error: Can't change session's transport after the initial selection was made
embedded:startup.tcl:21: Error:
in procedure 'transport'
in procedure 'ocd_bouncer'
at file "embedded:startup.tcl", line 21

どうやらAltera USB Blaster(によく似た何か)はJTAGにしか対応していないらしく、nrf51822の書き込みには使えないみたいだ。ワイヤをつないで、入力と出力が別のピンになっていて、あれ?となって、コマンドを打ってみたら見事にエラーが出た。

OpenOCDをビルドする w/ Bash on Windows

TL;DR

どっかからビルド済みのバイナリを拾うと簡単。ただし古いかも。

Bash on WindowsのUbuntu 16.04LTSでビルドしてみている。

libusb-devが入っているとコンパイルエラーが出る

In file included from src/jtag/drivers/arm-jtag-ew.c:26:0:
src/jtag/drivers/usb_common.h:24:10: error: ‘struct usb_dev_handle’ declared inside parameter list [-Werror]
 struct usb_dev_handle **out);
 ^
src/jtag/drivers/usb_common.h:24:10: error: its scope is only this definition or declaration, which is probably not what you want [-Werror]
src/jtag/drivers/arm-jtag-ew.c: In function ‘armjtagew_usb_open’:
src/jtag/drivers/arm-jtag-ew.c:681:2: error: implicit declaration of function ‘usb_init’ [-Werror=implicit-function-declaration]
 usb_init();
 ^
src/jtag/drivers/arm-jtag-ew.c:686:32: error: passing argument 3 of ‘jtag_usb_open’ from incompatible pointer type [-Werror=incompatible-pointer-types]
 if (jtag_usb_open(vids, pids, &dev) != ERROR_OK)
 ^
In file included from src/jtag/drivers/arm-jtag-ew.c:26:0:
src/jtag/drivers/usb_common.h:23:5: note: expected ‘struct usb_dev_handle **’ but argument is of type ‘struct usb_dev_handle **’
 int jtag_usb_open(const uint16_t vids[], const uint16_t pids[],
 ^
src/jtag/drivers/arm-jtag-ew.c:696:2: error: implicit declaration of function ‘usb_claim_interface’ [-Werror=implicit-function-declaration]
 usb_claim_interface(dev, 0);
 ^
src/jtag/drivers/arm-jtag-ew.c: In function ‘armjtagew_usb_close’:
src/jtag/drivers/arm-jtag-ew.c:709:2: error: implicit declaration of function ‘usb_close’ [-Werror=implicit-function-declaration]
 usb_close(armjtagew->usb_handle);
 ^
src/jtag/drivers/arm-jtag-ew.c: In function ‘armjtagew_usb_write’:
src/jtag/drivers/arm-jtag-ew.c:746:11: error: implicit declaration of function ‘usb_bulk_write’ [-Werror=implicit-function-declaration]
 result = usb_bulk_write(armjtagew->usb_handle, ARMJTAGEW_EPT_BULK_OUT, \
 ^
src/jtag/drivers/arm-jtag-ew.c: In function ‘armjtagew_usb_read’:
src/jtag/drivers/arm-jtag-ew.c:760:15: error: implicit declaration of function ‘usb_bulk_read’ [-Werror=implicit-functMakefile:3202: ターゲット 'src/jtag/drivers/src_jtag_drivers_libocdjtagdrivers_la-arm-jtag-ew.lo' のレシピで失敗しました
make[2]: *** [src/jtag/drivers/src_jtag_drivers_libocdjtagdrivers_la-arm-jtag-ew.lo] エラー 1
make[2]: *** 未完了のジョブを待っています....
mv -f src/jtag/drivers/.deps/src_jtag_drivers_libocdjtagdrivers_la-vsllink.Tpo src/jtag/drivers/.deps/src_jtag_drivers_l
ibocdjtagdrivers_la-vsllink.Plo

libusb-1.0-0-devを入れて、libusb-devを消したらうまくいった??

[情報源]

libusbが見つからない

mingwでWindowsのバイナリをコンパイルしようとしてもlibusbが見つからない様でこける。

仕方がないのでlibusbのソースを落としてきて、展開した場所で下記を実行した。

情報源

./configure --host=i686-w64-mingw32 --prefix=/usr/i686-w64-mingw32
sudo make install

USB-Blasterに非対応

とりあえずビルドは通ったが、configureの結果からみてUSB-Blasterに非対応の模様。libFTDIを入れれば解決するっぽい。あとでやる

バイナリが走らん

---------------------------
openocd.exe - システム エラー
---------------------------
libgcc_s_sjlj-1.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。 
---------------------------
OK 
--------------------------

らしい。

./configure –host=i686-w64-mingw32 –prefix=/usr/i686-w64-mingw32 C_FLAGS=”-static-libgcc”でやり直している。

CFLAGS=”-static-libgcc -static-libstdc++” CPPFLAGS=”-static-libgcc -static-libstdc++”
CXXFLAGS=”-static-libgcc -static-libstdc++” LDFLAGS=”-static-libgcc -static-libstdc++” ./configure –host=i686-w64-mingw32 –prefix=/usr/i686-w64-mingw32でやってみたが、objdump -pで見たら、DLLの依存が取れない。

参考情報

libgcc_s_sjlj-1.dllがあった

/usr/lib/gcc/i686-w64-mingw32/5.3-win32/libgcc_s_sjlj-1.dllに転がっていた。openocd.exeやlibusb-1.0.dllと一緒のところにコピーしたら普通に動いた。ただし、JTAGアダプタをつないでテストしていないので動くかどうかは謎。

MSYS2使えばよかったのでは?

MSYS2のパッケージマネージャを使えば一発で入るらしい情報を目にした。最初からこれを使えばよかったかもしれない。

MSYS2でpacmanを使えば一発で入るが、安定版なので少し古い。結局、自分でビルドした。