ドライバでちゃんと動作しているのか確認するために色々見ていたところ、メモリーアクセス時のアライメントはどうなっているのか?という点
試しにGPIOレジスタ周りで実際に表示させてみたところ
[250867.394720] f0abd000 00008900
[250867.394733] f0abd000 00008900[250867.394749] f0abd001 00677069
[250867.394764] f0abd002 69006770
[250867.394778] f0abd003 70690067
[250867.394790] f0abd004 00024000
アドレスとその内容を出力させてみると、4バイトごとの時には正しくアクセスできているようですが、アライメントからずれているとどうも前後ではない部分にアクセスしている感じ。
気になるのはその「どこか」の内容がそれなりにずれているのも気になります。
その次に気になったのは、pythonからioctl呼出し時に自動的に呼び出されているコマンドがあったという点。
[251265.309174] gpioread_open
[251265.309224] unsupported command 21505
[251265.309306] unsupported command 21505
[251265.309410] GPIOREAD_INIT_VALUES
[251265.309441] GPIOREAD_GET_SAMPLING_VALUES
[251265.309224] unsupported command 21505
[251265.309306] unsupported command 21505
[251265.309410] GPIOREAD_INIT_VALUES
[251265.309441] GPIOREAD_GET_SAMPLING_VALUES
21505は10進表記なのでこれを16進表記に直すと、0x5401。
これで検索して見ると、どうやらglibcから呼び出されているとかなんとか。
pi@rasp4b4g:~/gpioread $ grep 0x5401 -rl /usr/include
/usr/include/asm-generic/ioctls.h
pi@rasp4b4g:~/gpioread $ cat /usr/include/asm-generic/ioctls.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef __ASM_GENERIC_IOCTLS_H
#define __ASM_GENERIC_IOCTLS_H
#include <linux/ioctl.h>
/*
* These are the most common definitions for tty ioctl numbers.
* Most of them do not use the recommended _IOC(), but there is
* probably some source code out there hardcoding the number,
* so we might as well use them for all new platforms.
*
* The architectures that use different values here typically
* try to be compatible with some Unix variants for the same
* architecture.
*/
/* 0x54 is just a magic number to make these relatively unique ('T') */
#define TCGETS 0x5401
#define TCSETS 0x5402
#define TCSETSW 0x5403
/usr/include/asm-generic/ioctls.h
pi@rasp4b4g:~/gpioread $ cat /usr/include/asm-generic/ioctls.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef __ASM_GENERIC_IOCTLS_H
#define __ASM_GENERIC_IOCTLS_H
#include <linux/ioctl.h>
/*
* These are the most common definitions for tty ioctl numbers.
* Most of them do not use the recommended _IOC(), but there is
* probably some source code out there hardcoding the number,
* so we might as well use them for all new platforms.
*
* The architectures that use different values here typically
* try to be compatible with some Unix variants for the same
* architecture.
*/
/* 0x54 is just a magic number to make these relatively unique ('T') */
#define TCGETS 0x5401
#define TCSETS 0x5402
#define TCSETSW 0x5403
:
:
検索して見ると見事にTCGETSとして定義されています。
ptyhonだと、fcntlで標準出力を受け取るようになってるのかな?
ちなみにcで作った呼出しでは
[256708.713509] gpioread_open
[256708.713739] GPIOREAD_INIT_VALUES
[256708.733834] GPIOREAD_GET_SAMPLING_VALUES
[256708.748644] gpioread_close
[256710.748832] gpioread_open
[256710.749042] GPIOREAD_INIT_VALUES
[256710.769080] GPIOREAD_GET_SAMPLING_VALUES
となっていて、余分な呼出しは行われていなかった。
[256708.713739] GPIOREAD_INIT_VALUES
[256708.733834] GPIOREAD_GET_SAMPLING_VALUES
[256708.748644] gpioread_close
[256710.748832] gpioread_open
[256710.749042] GPIOREAD_INIT_VALUES
[256710.769080] GPIOREAD_GET_SAMPLING_VALUES
となっていて、余分な呼出しは行われていなかった。
実害はない物の気になる部分がちらほらありました。
0 件のコメント:
コメントを投稿