Armadillo実践開発ガイド

Similar documents
入 札 参 加 資 格 申 請 システム 操 作 マニュアル 入 札 参 加 資 格 の 資 格 有 効 ( 変 更 ) 日 を 迎 えると 追 加 届 の 登 録 ができるようになります ( 入 札 参 加 資 格 申 請 の 定 時 受 付 では いずれかの 申 請 先 団 体 から 入 札 参

ファイルサーバー(NFS) 構築ガイド

検 討 検 討 の 進 め 方 検 討 状 況 簡 易 収 支 の 世 帯 からサンプリング 世 帯 名 作 成 事 務 の 廃 止 4 5 必 要 な 世 帯 数 の 確 保 が 可 能 か 簡 易 収 支 を 実 施 している 民 間 事 業 者 との 連 絡 等 に 伴 う 事 務 の 複 雑

CENTNET 導 入 の 手 引 き 変 更 履 歴 No. 変 更 日 変 更 番 号 変 更 枚 数 備 考 /07/ 版 発 行 - システムリプレースにより 全 面 刷 新 //07/ 版 発 行 3 誤 字 等 の 修 正 /

MetaMoJi ClassRoom/ゼミナール 授業実施ガイド

サービス説明書 - STP 10000TLEE-JP-10 / STP 10000TLEE-JP-11 / STP 20000TLEE-JP-11 / STP 25000TL-JP-30

WATCH LOGGER

OKIKAE-KAIRYOU-V3.xdw

参 考 1 無 線 局 情 報 入 力 支 援 ( 基 地 局 と 固 定 局 の 事 項 書 のみに 対 応 ) 無 線 局 情 報 入 力 支 援 機 能 とは 過 去 に 申 請 したデータをダウンロードし 無 線 局 インターネット 申 請 アプリケーション で 利 用 できる 便 利 な

PC 移 行 は 以 下 の 流 れで 行 います 次 ページ 以 降 に 各 手 順 を 記 載 しますのでご 確 認 ください ( をクリックすると 該 当 の 説 明 にジャンプします ) 移 行 元 のPCでの 作 業 Step1 移 行 するデータをバックアップする (3ページ) [データ

治 験 実 施 管 理 システム NMGCP 向 け Excel 形 式 プロトコール 作 成 手 順 書 V4.0.3 対 応 版 第 1 版 株 式 会 社 富 士 通 アドバンストエンジニアリング All Rights Reserved,Copyright 株 式 会 社 富 士 通 アドバン

大田市固定資産台帳整備業務(プロポーザル審査要項)

TIPS - 棚 割 りを 開 始 するまで Liteを 起 動 し 企 業 情 報 の 追 加 を 行 い 棚 割 を 行 う 企 業 の 追 加 をして 下 さい 企 業 情 報 の 追 加 時 に エラーメッセージが 表 示 された 場 合 別 途 TIPS トラブルが 発 生 した 場 合

POWER EGG V2.01 ユーザーズマニュアル ファイル管理編

ez_meishi.ppt

<4D F736F F F696E74202D2082C882E982D982C DD8ED88EE688F882CC82B582AD82DD C668DDA9770>

< 目 次 > 8. 雇 用 保 険 高 年 齢 雇 用 継 続 給 付 27 ( 育 児 休 業 給 付 介 護 休 業 給 付 ) 8.1 高 年 齢 雇 用 継 続 給 付 画 面 のマイナンバー 設 定 高 年 齢 雇 用 継 続 給 付 の 電 子 申 請 高

T T VWAPギャランティ 取 引 とは T T VWAPギャランティ 取 引 とは これまでの 成 行 や 指 値 とは 異 なる 東 海 東 京 証 券 が 提 供 する 新 しい 形 の 売 買 方 法 です その 方 法 とは 1 金 融 商 品 取 引 所 ( 以 下 取 引 所 )に

・モニター広告運営事業仕様書

工 事 名 渟 城 西 小 学 校 体 育 館 非 構 造 部 材 耐 震 改 修 工 事 ( 建 築 主 体 工 事 ) 入 札 スケジュール 手 続 等 期 間 期 日 期 限 等 手 続 きの 方 法 等 1 設 計 図 書 等 の 閲 覧 貸 出 平 成 28 年 2 月 23 日 ( 火

<4D F736F F D F93878CA797708F4390B3816A819A95CA8B4C976C8EAE91E682538B4C8DDA97E12E646F6378>

工 事 名 能 代 南 中 学 校 体 育 館 非 構 造 部 材 耐 震 改 修 工 事 ( 建 築 主 体 工 事 ) 入 札 スケジュール 手 続 等 期 間 期 日 期 限 等 手 続 きの 方 法 等 1 設 計 図 書 等 の 閲 覧 貸 出 平 成 28 年 5 月 24 日 ( 火

<4D F736F F D2095CA8E A90DA91B18C9F93A289F1939A8F D8288B3816A5F E646F63>

もくじ はじめに 本 書 はスマートフォンやタブレットのアプリ LINE の 設 定 を 行 うためのマニュアルとなります 詳 しい 操 作 方 法 については メーカーホームページ 上 の 基 本 的 な 使 い 方 を 参 照 ください LINE 基 本 的 な 使 い 方

4 応 募 者 向 けメニュー 画 面 が 表 示 されます 応 募 者 向 けメニュー 画 面 で [ 交 付 内 定 時 の 手 続 を 行 う] [ 交 付 決 定 後 の 手 続 を 行 う]をクリックします 10

スライド 1

目 次 目 次... 本 書 の 見 かた... 2 商 標 について... 2 オープンソースライセンス 公 開... 2 はじめに... 3 概 要... 3 使 用 環 境 について... 4 対 応 している OS およびアプリケーション... 4 ネットワーク 設 定... 4 Googl

1 書 誌 作 成 機 能 (NACSIS-CAT)の 軽 量 化 合 理 化 電 子 情 報 資 源 への 適 切 な 対 応 のための 資 源 ( 人 的 資 源,システム 資 源, 経 費 を 含 む) の 確 保 のために, 書 誌 作 成 と 書 誌 管 理 作 業 の 軽 量 化 を 図

( 注 変 更 申 請 で 対 象 となる 項 目 と 郵 送 書 類 についての 詳 細 は 下 表 を 参 照 してください 東 京 電 子 自 治 体 共 同 運 営 電 子 調 達 サービス 6. 変 更 申 請 物 品 買 入 れ 等 変 更 申 請 項 目 及 び 郵 送 書 類 等 一

ができます 4. 対 象 取 引 の 範 囲 第 1 項 のポイント 付 与 の 具 体 的 な 条 件 対 象 取 引 自 体 の 条 件 は 各 加 盟 店 が 定 めます 5.ポイントサービスの 利 用 終 了 その 他 いかなる 理 由 によっても 付 与 されたポイントを 換 金 すること

<4D F736F F D20819C B78AFA95DB91538C7689E68DEC90AC289

<4D F736F F D20819C486F70658F6F93588ED297708AC7979D89E696CA837D836A B E A2E646F63>

KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2

「給与・年金の方」からの確定申告書作成編

続 に 基 づく 一 般 競 争 ( 指 名 競 争 ) 参 加 資 格 の 再 認 定 を 受 けていること ) c) 会 社 更 生 法 に 基 づき 更 生 手 続 開 始 の 申 立 てがなされている 者 又 は 民 事 再 生 法 に 基 づき 再 生 手 続 開 始 の 申 立 てがなさ

戦略担当者のための

全設健発第     号

中根・金田台地区 平成23年度補償説明業務

( 別 紙 ) 以 下 法 とあるのは 改 正 法 第 5 条 の 規 定 による 改 正 後 の 健 康 保 険 法 を 指 す ( 施 行 期 日 は 平 成 28 年 4 月 1 日 ) 1. 標 準 報 酬 月 額 の 等 級 区 分 の 追 加 について 問 1 法 改 正 により 追 加

<8C9A90DD94AD90B696D88DDE939982CC8DC48E918CB989BB82C98AD682B782E98E9696B18EE688B CC FC90B3816A2E786477>

(表紙)

(Microsoft PowerPoint - Ver12\203o\201[\203W\203\207\203\223\203A\203b\203v\216\221\227\277.ppt)

目 次 1. 積 算 内 訳 書 に 関 する 留 意 事 項 1 ページ 2. 積 算 内 訳 書 のダウンロード 3 ページ 3. 積 算 内 訳 書 の 作 成 (Excel 2003の 場 合 ) 6 ページ 4. 積 算 内 訳 書 の 作 成 (Excel 2007の 場 合 ) 13

購買ポータルサイトyOASIS簡易説明書 b

<4D F736F F F696E74202D C90BF8F CC8DEC90AC97E181698A4F8D E8816A5F56322E707074>

PowerPoint Presentation

AGT10 ( Android(TM) 4.1) ファームウェア更新方法

目 次 1.はじめに 書 式 の 説 明 表 紙 スケジュール 組 入 れ 基 準 併 用 禁 止 薬 併 用 注 意 薬 同 種 同 効 薬 医 師 モニタリング..

「1 所得税及び復興特別所得税の確定申告書データをお持ちの方」からの更正の請求書・修正申告書作成編

あいち電子調達共同システム

Microsݯft Word - 91 forܠ2009November.docx

同 期 を 開 始 する( 初 期 設 定 ) 2 1 Remote Link PC Sync を 起 動 する 2 1 接 続 機 器 の [PIN コード ] [ ユーザー 名 ] [ パスワード ] を 入 力 する [PIN コード ] などの 情 報 は 接 続 機 器 の 設 定 画 面

私立大学等研究設備整備費等補助金(私立大学等

5-2.操作説明書(支店連携)_xlsx

<4D F736F F D2091E F18CB48D C481698E7B90DD8F9590AC89DB816A2E646F63>

目 次 利 用 に 際 しての 注 意 事 項... ユーザー 登 録... ログイン... 課 題 申 請... 5 装 置 予 約... 6 ライセンス 取 得 方 法... 7 利 用 料 金 の 確 認 ( 準 備 中 ) 外 部 発 表 登 録 の 方 法... 5 < 附

<4D F736F F F696E74202D B E E88E68C9A90DD8BC65F E DC58F4994C52E >

< F2D D D837C815B B8EC08E7B97768D80>

入札公告 機動装備センター

養 老 保 険 の 減 額 払 済 保 険 への 変 更 1. 設 例 会 社 が 役 員 を 被 保 険 者 とし 死 亡 保 険 金 及 び 満 期 保 険 金 のいずれも 会 社 を 受 取 人 とする 養 老 保 険 に 加 入 してい る 場 合 を 解 説 します 資 金 繰 りの 都

(平成13年9月25日現在)

<4D F736F F D2093CD8F6F82AA954B977682C88C9A95A882CC94BB926682CC DD5F48508C668DDA E646F63>

設定フロー ★印は必須の設定です

V-CUBE One

この 章 では 電 子 入 札 システムをご 利 用 いただくための 事 前 準 備 について 説 明 します 事 前 準 備 と して ID 初 期 パスワードの 確 認 初 期 パスワード 初 期 見 積 用 暗 証 番 号 の 変 更 IC カード 登 録 またはICカード 更 新 を 行 っ

<4D F736F F D C97F195CF8AB DEC90E096BE8F912091E6312E313294C52E646F63>

事前チェック提出用現況報告書作成ツール入力マニュアル(法人用)

操 作 の 手 順 : 個 人 住 民 税 一 括 納 付 / 新 規 依 頼 修 正 複 写 個 人 住 民 税 一 括 納 付 メニュー 個 人 住 民 税 一 括 納 付 新 規 依 頼 修 正 複 写 依 頼 / 委 託 者 情 報 入 力 (P100) 依 頼 修 正 / 委 託 者 情

目 次 JAVIS Appli の 基 本 機 能... 3 JAVIS Appli について... 3 音 声 確 認 機 能 JAVIS Appli( 有 償 版 )の 機 能... 4 音 声 で 読 みの 確 認 をする... 4 辞 書 機 能... 5 単 語 を 登 録 する... 5

U/Cサーバ 業務システム間転送プログラムインターフェース仕様書

<4D F736F F D208ED089EF95DB8CAF89C193FC8FF38BB CC8EC091D492B28DB88C8B89CA82C982C282A282C42E646F63>

Microsoft Word - ML_ListManager_10j.doc

弁護士報酬規定(抜粋)

< F2D8ED089EF95DB8CAF939996A289C193FC91CE8DF42E6A7464>

1.3 利 用 方 法 図 1 国 立 国 会 図 書 館 デジタルコレクション 送 信 サービスの 対 象 資 料 本 文 の 閲 覧 は 図 書 館 サービスカウンター 備 え 付 けの 専 用 パソコン(1 台 )のみでの 利 用 となります 利 用

スライド 1

<4D F736F F D20975A817C D9195DB8FD88F5A91EE838D815B F824F A2E646F63>

目 次 機 能 運 用 上 の 注 意 処 理 手 順 画 面 説 明 ログイン 直 送 先 選 択

4 調 査 の 対 話 内 容 (1) 調 査 対 象 財 産 の 土 地 建 物 等 を 活 用 して 展 開 できる 事 業 のアイディアをお 聞 かせく ださい 事 業 アイディアには, 次 の 可 能 性 も 含 めて 提 案 をお 願 いします ア 地 域 の 活 性 化 と 様 々な 世

1-1 一覧画面からの印刷

計算式の取り扱い

目 次 はじめに キャンパスメールを 利 用 するには キャンパスメール 利 用 申 請 を 行 う アカウント 有 効 化 (アクティベーション)を 行 う メールの 利 用 WEB ブラウザからメールを 利 用

工 事 名 沢 口 浄 配 水 場 建 設 工 事 ( 浄 水 管 理 棟 ) 入 札 スケジュール 手 続 等 期 間 期 日 期 限 等 手 続 きの 方 法 等 平 成 24 年 5 月 8 日 ( 火 ) 正 午 から 1 設 計 図 書 等 の 閲 覧 貸 出 基 本 事 項 2のとおり

預 金 を 確 保 しつつ 資 金 調 達 手 段 も 確 保 する 収 益 性 を 示 す 指 標 として 営 業 利 益 率 を 採 用 し 営 業 利 益 率 の 目 安 となる 数 値 を 公 表 する 株 主 の 皆 様 への 還 元 については 持 続 的 な 成 長 による 配 当 可

(1) 社 会 保 険 等 未 加 入 建 設 業 者 の 確 認 方 法 等 受 注 者 から 提 出 される 施 工 体 制 台 帳 及 び 添 付 書 類 により 確 認 を 行 います (2) 違 反 した 受 注 者 へのペナルティー 違 反 した 受 注 者 に 対 しては 下 記 のペ

Windows 7ファイル送信方法 SMB編

01_07_01 データのインポート_エクスポート_1

入札方式別操作

<4D F736F F F696E74202D B B83678E9197BF2E B93C782DD8EE682E890EA97705D>

4 参 加 資 格 要 件 本 提 案 への 参 加 予 定 者 は 以 下 の 条 件 を 全 て 満 たすこと 1 地 方 自 治 法 施 行 令 ( 昭 和 22 年 政 令 第 16 号 ) 第 167 条 の4 第 1 項 各 号 の 規 定 に 該 当 しない 者 であること 2 会 社

目 次 目 次 1 ログイン ログアウト ログインする...1 ログイン 画 面 が 表 示 されないときは?... 1 初 めてログインするときのパスワードは?... 2 初 期 パスワードを 忘 れてしまったときは?... 2 変 更 したパスワードを 忘 れてしまったときは?.

特別徴収封入送付作業について

-2-

入 札 参 加 者 は 入 札 の 執 行 完 了 に 至 るまではいつでも 入 札 を 辞 退 することができ これを 理 由 として 以 降 の 指 名 等 において 不 利 益 な 取 扱 いを 受 けることはない 12 入 札 保 証 金 免 除 13 契 約 保 証 金 免 除 14 入

目 次 1. Cyber Edy とは P3. Cyber Edy 決 済 の 方 法 P4 3. 画 面 の 説 明 P6 4. 変 更 が 発 生 した 場 合 P8 5. 特 定 の 取 引 を 検 索 する 場 合 P9 6. 検 索 結 果 をダウンロードする 場 合 P10

3. 選 任 固 定 資 産 評 価 員 は 固 定 資 産 の 評 価 に 関 する 知 識 及 び 経 験 を 有 する 者 のうちから 市 町 村 長 が 当 該 市 町 村 の 議 会 の 同 意 を 得 て 選 任 する 二 以 上 の 市 町 村 の 長 は 当 該 市 町 村 の 議

2 県 公 立 高 校 の 合 格 者 は このように 決 まる (1) 選 抜 の 仕 組 み 選 抜 の 資 料 選 抜 の 資 料 は 主 に 下 記 の3つがあり 全 高 校 で 使 用 する 共 通 の ものと 高 校 ごとに 決 めるものとがあります 1 学 力 検 査 ( 国 語 数

PowerPoint プレゼンテーション

R4財務対応障害一覧

「災害用伝言板(web171)」の提供について~「災害用ブロードバンド伝言板(web171)」に新機能を追加しリニューアル~

Transcription:

~ 組 み 込 み Linux の 導 入 から 製 品 化 まで~ 第 3 部 Version 3.0.0 2015/10/26 linux-3.14-at 対 応

: ~ 組 み 込 み Linux の 導 入 から 製 品 化 まで~: 第 3 部 株 式 会 社 アットマークテクノ 060-0035 札 幌 市 中 央 区 北 5 条 東 2 丁 目 AFT ビル TEL 011-207-6550 FAX 011-207-6570 製 作 著 作 2015 Atmark Techno, Inc. Version 3.0.0 2015/10/26

Armadillo 実 践 開 発 ガイド 目 次 1. はじめに... 7 1.1. 対 象 読 者... 7 1.2. 表 記 方 法... 7 1.2.1. 使 用 するフォント... 7 1.2.2. コマンド 入 力 例 の 表 記 方 法... 7 1.2.3. コラムの 表 記 方 法... 8 1.3. サンプルソースコード... 9 1.4. 困 った 時 は... 9 1.5. お 問 い 合 わせ 先... 10 1.6. 商 標... 10 1.7. ライセンス... 10 1.8. 謝 辞... 10 2.... 11 2.1. シリアルインターフェース... 11 2.1.1. コンソールとして 別 のシリアルインターフェースを 使 用 する... 11 2.1.2. コンソールへの 出 力 を 止 める... 13 2.2. I2C 接 続 A/D コンバーター... 14 2.2.1. I2C 概 要... 14 2.2.2. サンプル 回 路... 15 2.2.3. PCF8591 通 信 プロトコル... 16 2.2.4. i2cdev ドライバー... 18 2.2.5. サンプルプログラム... 19 2.3. SPI 接 続 A/D コンバーター... 26 2.3.1. SPI 概 要... 26 2.3.2. サンプル 回 路... 27 2.3.3. MCP3204 通 信 プロトコル... 28 2.3.4. spidev ドライバー... 29 2.3.5. カーネルコンフィギュレーション... 30 2.3.6. サンプルプログラム... 31 2.4. 1-Wire 接 続 温 度 センサ... 37 2.4.1. 1-Wire 概 要... 38 2.4.2. DS18B20... 39 2.4.3. サンプル 回 路... 40 2.4.4. 温 度 センサドライバー... 41 2.4.5. カーネルコンフィギュレーション... 42 2.5. CAN... 43 2.5.1. CAN 概 要... 44 2.5.2. サンプル 回 路... 47 2.5.3. CAN ドライバー... 47 2.5.4. カーネルコンフィギュレーション... 48 2.5.5. ip コマンドの 準 備... 49 2.5.6. CAN 通 信 プログラムの 準 備... 50 2.5.7. 使 用 例... 50 3

Armadillo 実 践 開 発 ガイド 図 目 次 1.1. コマンド 入 力 表 記 例 (Linux システム)... 7 1.2. コマンド 入 力 表 記 例 ( 保 守 モード)... 8 1.3. クリエイティブコモンズライセンス... 10 2.1. コンソールをシリアルインターフェース 2 に 変 更 する... 11 2.2. カーネルパラメータの 確 認... 11 2.3. ログインプロンプトの 表 示... 12 2.4. 標 準 の inittab... 12 2.5. 標 準 の securetty... 12 2.6. ログインプロンプトをシリアルインターフェース 2 にした inittab... 12 2.7. シリアルインターフェース 2 からの root ログインを 許 可 した securetty... 13 2.8. Armadillo-400 シリーズ 用 Debian GNU/Linux の inittab( 抜 粋 )... 13 2.9. Armadillo-400 シリーズ 用 Debian GNU/Linux の securetty( 抜 粋 )... 13 2.10. コンソールへの 出 力 を 止 める... 13 2.11. ログインプロンプトを 表 示 しない( 標 準 の inittab)... 13 2.12. ログインプロンプトを 表 示 しない(Armadillo-400 シリーズ 用 Debian GNU/Linux の inittab)... 14 2.13. I2C プロトコル... 15 2.14. I2C 接 続 A/D コンバーター 回 路 図... 16 2.15. PCF8591 通 信 フォーマット(コントロールバイト 書 き 込 み)... 16 2.16. PCF8591 通 信 フォーマット(アドレスバイト)... 16 2.17. PCF8591 通 信 フォーマット(コントロールバイト)... 17 2.18. PCF8591 通 信 フォーマット(データバイト 読 み 出 し)... 17 2.19. PCF8591 通 信 フォーマット(データバイト)... 18 2.20. I2C デバイスファイルのオープン... 18 2.21. I2C スレーブデバイスのアドレス 指 定... 18 2.22. PCF8591 を 使 用 した A/D 変 換 プログラム... 19 2.23. adc_pcf8591.c... 19 2.24. pcf8591.h... 21 2.25. pcf8591.c... 21 2.26. adc_pcf8591 をビルドする makefile... 25 2.27. adc_pcf8591 のビルド... 25 2.28. adc_pcf8591 コマンドの 実 行... 25 2.29. SPI プロトコル... 27 2.30. SPI 接 続 A/D コンバーター 回 路 図... 28 2.31. MCP3204 通 信 フォーマット... 28 2.32. SPI デバイスファイルのオープン... 29 2.33. Linux カーネルの 取 得 と 展 開... 30 2.34. Linux カーネルに Armadillo-400 シリーズ 標 準 コンフィギュレーションを 適 用 する... 30 2.35. menuconfig を 使 用 してカーネルコンフィギュレーションを 変 更 する... 30 2.36. SPI ドライバーを 有 効 にする... 30 2.37. SPI に 使 用 するピンを 指 定 する... 30 2.38. CSPI3 SS0 を spidev で 使 用 する 修 正... 31 2.39. Linux カーネルをビルドする... 31 2.40. MCP3204 を 使 用 した A/D 変 換 プログラム... 31 2.41. adc_mcp3204.c... 32 2.42. mcp3204.h... 33 2.43. mcp3204.c... 34 2.44. adc_mcp3204 をビルドする makefile... 36 2.45. adc_mcp3204 のビルド... 37 2.46. adc_mcp3204 コマンドの 実 行... 37 4

Armadillo 実 践 開 発 ガイド 2.47. 1-Wire プロトコル(ビット 転 送 )... 38 2.48. 1-Wire プロトコル... 39 2.49. DS18B20 Temperature Register フォーマット... 40 2.50. 1-Wire 接 続 温 度 センサ 回 路 図... 41 2.51. 1-Wire 接 続 温 度 センサドライバーの 使 用 例... 42 2.52. Linux カーネルの 取 得 と 展 開... 42 2.53. Linux カーネルに Armadillo-400 シリーズ 標 準 コンフィギュレーションを 適 用 する... 42 2.54. menuconfig を 使 用 してカーネルコンフィギュレーションを 変 更 する... 43 2.55. 1-Wire ドライバーを 有 効 にする... 43 2.56. Linux カーネルをビルドする... 43 2.57. CAN プロトコル(データフレーム)... 45 2.58. CAN プロトコル(リモートフレーム)... 46 2.59. CAN 接 続 回 路 図... 47 2.60. CAN バスを 介 した Armadillo 同 士 の 接 続... 47 2.61. CAN ソケットのオープン... 47 2.62. Linux カーネルの 取 得 と 展 開... 48 2.63. Linux カーネルに Armadillo-400 シリーズ 標 準 コンフィギュレーションを 適 用 する... 48 2.64. menuconfig を 使 用 してカーネルコンフィギュレーションを 変 更 する... 49 2.65. CAN ドライバーを 有 効 にする... 49 2.66. CAN に 使 用 するピンを 指 定 する... 49 2.67. Linux カーネルをビルドする... 49 2.68. iproute2 を 選 択 する... 49 2.69. can-utils を 選 択 する... 50 2.70. ip コマンドによる CAN 通 信 速 度 の 設 定 例... 50 2.71. CAN インターフェースの 有 効 化... 50 2.72. CAN メッセージの 受 信 準 備... 51 2.73. CAN メッセージの 送 信... 51 2.74. CAN メッセージの 受 信 結 果... 51 2.75. 連 続 した CAN メッセージの 送 信... 51 2.76. 連 続 した CAN メッセージの 受 信... 51 5

Armadillo 実 践 開 発 ガイド 表 目 次 1.1. 使 用 するフォント... 7 1.2. コマンドの 実 行 環 境 と 対 応 する 表 記... 7 1.3. ユーザーの 種 類 と 対 応 する 表 記... 8 2.1. I2C バスとデバイスファイルの 対 応... 18 2.2. SPI モード... 26 2.3. MCP3204 チャンネル 指 定... 28 2.4. SPI バスとデバイスファイルの 対 応... 29 2.5. DS18B20 内 蔵 レジスタ... 39 2.6. DS18B20 温 度 センサ 分 解 能... 40 2.7. CAN プロトコルフレーム... 44 6

はじめに 1. はじめに 第 1 部 では Armadillo を 使 った 組 み 込 みシステムを 構 築 する 方 法 の 全 体 像 について 説 明 を 行 いまし た また 第 2 部 では システムの 開 発 段 階 で 役 に 立 つ より 実 践 的 な 事 柄 について 説 明 しました 第 3 部 では 特 別 なデバイスを 扱 うなど 具 体 的 な 事 例 を 取 り 上 げ Howto 形 式 で 紹 介 します 1.1. 対 象 読 者 本 書 が 主 な 対 象 読 者 としているのは Armadillo を 使 って 組 み 込 みシステムを 開 発 したいと 考 えている ソフトウェア 開 発 者 です ソフトウェア 開 発 者 は 少 なくとも C 言 語 での 開 発 経 験 が 必 要 です Linux や Armadillo を 使 用 した 開 発 の 経 験 が 少 ない 場 合 や 開 発 の 全 体 像 を 把 握 していない 場 合 は 第 1 部 から 読 むことをお 勧 めします 1.2. 表 記 方 法 本 書 で 使 用 している 表 記 方 法 について 説 明 します 1.2.1. 使 用 するフォント フォントは 以 下 のものを 使 用 します 表 1.1 使 用 するフォント フォント 例 本 文 中 のフォント 等 幅 太 字 斜 体 下 線 使 用 箇 所 本 文 コマンド 入 力 例 やソースコード ユーザーが 入 力 する 文 字 状 況 によって 置 き 換 えられるもの キー 入 力 1.2.2. コマンド 入 力 例 の 表 記 方 法 1.2.2.1. Linux システムの 場 合 Linux システムでの 端 末 からのコマンド 入 力 例 は 以 下 のように 表 記 します [PC ~/]$ ls 図 1.1 コマンド 入 力 表 記 例 (Linux システム) [PC ~/]$ の 部 分 をプロンプトと 呼 びます プロンプトに 続 いてコマンドを 入 力 してください PC の 部 分 は コマンドを 実 行 する 環 境 によって 使 い 分 けます 実 行 環 境 には 以 下 のものがありま す 表 1.2 コマンドの 実 行 環 境 と 対 応 する 表 記 PC 表 記 作 業 用 PC 実 行 環 境 7

はじめに 表 記 実 行 環 境 ATDE ATDE(Atmark Techno Development Environment [a] ) armadillo Armadillo(Atmark Dist で 作 成 したユーザーランドの 場 合 ) darmadillo Armadillo(ユーザーランドが Debian GNU/Linux の 場 合 ) [a] アットマークテクノ 社 製 品 用 の 開 発 環 境 ~/ の 部 分 は カレントディレクトリのパスを 表 します $ の 部 分 は コマンドを 実 行 するユーザーの 種 類 によって 使 い 分 けます ユーザーの 種 類 には 以 下 の 二 種 類 があります 1.2.2.2. 保 守 モードの 場 合 表 1.3 ユーザーの 種 類 と 対 応 する 表 記 表 記 権 限 # 特 権 ユーザー $ 一 般 ユーザー Armadillo を 保 守 モードで 起 動 した 場 合 のコマンド 入 力 例 は 以 下 のように 表 記 します hermit> info 図 1.2 コマンド 入 力 表 記 例 ( 保 守 モード) 保 守 モードでは プロンプトは hermit> となります プロンプトに 続 いてコマンドを 入 力 してくだ さい 1.2.3. コラムの 表 記 方 法 本 書 では 随 所 にコラムを 記 載 しています コラムの 内 容 によって 以 下 の 表 記 を 用 います メモ 用 語 の 説 明 や 補 足 的 な 説 明 は このアイコンで 示 します ヒント 知 っていると 便 利 な 情 報 は このアイコンで 示 します 注 意 ユーザーの 注 意 が 必 要 な 情 報 は このアイコンで 示 します このアイコン が 付 いているコラムの 内 容 に 従 わない 場 合 ハードウェアやシステムを 破 8

はじめに 壊 したり 以 降 の 作 業 に 支 障 をきたす 場 合 があります 再 度 ご 確 認 くだ さい 注 意 : 本 書 の 内 容 を 実 践 する 前 に ご 使 用 になる 製 品 のマニュアル(ハードウェアマニュアル ソフトウェアマ ニュアル その 他 関 連 資 料 )をよく 読 み それらに 記 述 されている 注 意 事 項 に 従 って 正 しく 安 全 にお 使 いください 1.3. サンプルソースコード 本 書 で 紹 介 するサンプルソースコードは http://download.atmark-techno.com/armadillo-guide/ source/ からダウンロードできます サンプルソースコードは MIT ライセンス [1] の 下 に 公 開 します 1.4. 困 った 時 は 本 書 を 読 んでわからなかったり 困 ったことがあった 際 は ぜひ Armadillo サイト [2] で 情 報 を 探 してみ てください 本 書 には 記 載 しきれていない FAQ や Howto が 掲 載 されています Armadillo サイトでも 知 りたい 情 報 が 見 つからない 場 合 は Armadillo フォーラム [3] で 質 問 してみ てください Armadillo フォーラムは アットマークテクノユーザーズサイト 内 に 設 けられた Armadillo ブランド 製 品 での 開 発 や 周 辺 技 術 に 関 する 話 題 を 扱 うユーザー 向 けコミュニティです Armadillo に 関 す る 技 術 的 な 話 題 なら 何 でも 投 稿 できます 多 くのユーザーや 開 発 者 が 参 加 しているので 知 識 のある 人 や 同 じ 問 題 で 困 ったことがある 人 から 情 報 を 集 めることができます フォーラムに 参 加 するときの 心 構 え Armadillo フォーラムには その 前 身 となったメーリングリストから 引 き 続 き 数 百 人 のユーザーが 参 加 しています また フォーラムへ 投 稿 した 内 容 は Web 上 で 誰 でも 閲 覧 検 索 可 能 になるほか 通 知 を 希 望 している ユーザーにメールで 送 信 されます フォーラムには 多 くの 人 が 参 加 しており 投 稿 内 容 は 多 くの 人 の 目 に 触 れ ますので そこにはマナーが 存 在 します 一 般 的 な 対 人 関 係 と 同 様 に 受 け 取 り 手 に 対 して 失 礼 にならないよう 一 定 の 配 慮 はすべきです 技 術 系 コ ミュニティに 不 慣 れな 方 は 投 稿 する 前 に 技 術 系 メーリングリストで 質 問 するときのパターン ランゲージ [4] をご 一 読 されることをお 勧 めしま す メーリングリストに 投 稿 するときの 心 構 えや 適 切 な 回 答 を 得 るため に 有 用 なテクニックが 分 かりやすく 紹 介 されています メーリングリスト とフォーラムの 違 いはあれど 基 本 的 な 考 え 方 は 共 通 しており とても 参 考 になります [1] http://opensource.org/licenses/mit-license.php [2] http://armadillo.atmark-techno.com [3] https://users.atmark-techno.com/forum/armadillo [4] 結 城 浩 氏 によるサイトより http://www.hyuki.com/writing/techask.html 9

はじめに とはいえ 技 術 的 に 簡 単 なものであるとか ちょっとした 疑 問 だからとい う 理 由 で 投 稿 をためらう 必 要 はありません Armadillo に 関 係 のある 内 容 であれば 難 しく 考 えることなく 気 軽 にお 使 いください 1.5. お 問 い 合 わせ 先 本 書 に 関 するご 意 見 やご 質 問 は Armadillo フォーラム [3] にご 連 絡 ください 何 らかの 事 情 でフォーラ ムに 投 稿 する 事 ができない 場 合 は 以 下 にご 連 絡 ください 株 式 会 社 アットマークテクノ 横 浜 営 業 所 221-0835 横 浜 市 神 奈 川 区 鶴 屋 町 3 丁 目 30-4 明 治 安 田 生 命 横 浜 西 口 ビル 7F 電 話 045-548-5651 FAX 050-3737-4597 電 子 メール sales@atmark-techno.com 1.6. 商 標 Armadillo は 株 式 会 社 アットマークテクノの 登 録 商 標 です その 他 の 記 載 の 商 品 名 および 会 社 名 は 各 社 各 団 体 の 商 標 または 登 録 商 標 です マークは 省 略 しています 1.7. ライセンス 本 書 は クリエイティブコモンズの 表 示 - 改 変 禁 止 2.1 日 本 ライセンスの 下 に 公 開 します ライセンス の 内 容 は http://creativecommons.org/licenses/by-nd/2.1/jp/ でご 確 認 ください 1.8. 謝 辞 図 1.3 クリエイティブコモンズライセンス Armadillo や ATDE で 使 用 しているソフトウェアの 多 くは Free Software/Open Source Software で 構 成 されています Free Software/Open Source Software は 世 界 中 の 多 くの 開 発 者 や 関 係 者 の 貢 献 によって 成 り 立 っています この 場 を 借 りて 感 謝 の 意 を 表 します 10

2. 本 章 では Armadillo-400 シリーズの 方 法 について 説 明 します 2.1. シリアルインターフェース 2.1.1. コンソールとして 別 のシリアルインターフェースを 使 用 する Armadillo-400 シリーズは 標 準 状 態 でシリアルインターフェース 1(CON3)をコンソールとして 使 用 します コンソールには 起 動 ログやカーネルメッセージなどが 出 力 されるため 標 準 の 設 定 ではシリ アルインターフェース 1 に 外 部 機 器 を 接 続 して 使 用 するといったことはできません ここでは コンソー ルとして 別 のシリアルインターフェースを 使 用 する 方 法 について 説 明 します 例 として コンソールを シリアルインターフェース 2(CON9_3 CON9_5)に 変 更 します 第 1 部 起 動 の 仕 組 み でも 説 明 したように コンソールに 文 字 を 表 示 するプログラムには ブート ローダー Linux カーネル ユーザーランドアプリケーションプログラムの 3 種 類 があります まず ブートローダーの 起 動 ログとカーネルメッセージを 出 力 する 先 を 変 更 します カーネルメッセー ジの 出 力 先 は カーネルパラメータの console オプションで 指 定 できます カーネルパラメータは ブー トローダーの setenv コマンドで 設 定 します ブートローダーは console オプションが 指 定 されている 場 合 それと 同 じシリアルインターフェースに 起 動 ログを 出 力 します カーネルパラメータを 設 定 するには Armadillo を 保 守 モードで 起 動 して 図 2.1. コンソールをシリ アルインターフェース 2 に 変 更 する のように 使 用 するシリアルデバイスのデバイスファイル 名 を 入 力 します シリアルインターフェースとデバイスファイルの 対 応 は Armadillo-400 シリーズ ソフト ウェアマニュアル の UART の 章 を 参 照 してください hermit> setenv console=ttymxc2,115200 図 2.1 コンソールをシリアルインターフェース 2 に 変 更 する 現 在 のカーネルパラメータは setenv コマンドを 引 数 なしで 実 行 することで 確 認 できます また カー ネルパラメータの 指 定 を 解 除 し 標 準 状 態 にもどすには clearenv コマンドを 使 用 します hermit> setenv 1: console=ttymxc2,115200 図 2.2 カーネルパラメータの 確 認 console=ttymxc2,115200 を 指 定 した 状 態 で 起 動 すると 起 動 ログやカーネルメッセージなどはシリア ルインターフェース 2 に 出 力 されるようになります 但 し ログインプロンプトはまだシリアルインター フェース 1 に 出 力 されます 11

atmark-dist v1.45.0 (AtmarkTechno/Armadillo-420) Linux 3.14.36-at4 [armv5tejl arch] armadillo420-0 login: 図 2.3 ログインプロンプトの 表 示 ログインプロンプトをシリアルインターフェース 2 に 表 示 するには /etc/inittab と/etc/securetty を 修 正 する 必 要 があります 標 準 の Atmark Dist で 作 成 したユーザーランドの 場 合 /etc/inittab は 図 2.4. 標 準 の inittab のようになっています 3 行 目 の ttymxc1 を ttymxc2 に 変 更 すると ログイ ンプロンプトをシリアルインターフェース 2 に 表 示 するようになります また /etc/securetty は 図 2.5. 標 準 の securetty のようになっています ttymxc2 を 追 加 すると シリアルインターフェース 2 に 表 示 されたログインプロンプトから root ユーザーでログインできるようになります ::sysinit:/etc/init.d/rc ::respawn:/sbin/getty -L 115200 ttymxc1 vt102 ::shutdown:/etc/init.d/reboot ::ctrlaltdel:/sbin/reboot 図 2.4 標 準 の inittab ttymxc1 図 2.5 標 準 の securetty inittab や securetty を 変 更 するには ユーザーランドを 再 構 築 する 必 要 があります 第 1 部 Atmark Dist を 使 ったルートファイルシステムの 作 成 などを 参 照 し 使 用 するプロダクト 用 に 基 本 的 な 設 定 を して 一 度 ビルドした Atmark Dist を 用 意 してください そして atmark-dist/vendors/atmarktechno/ プロダクト 名 /etc/inittab と atmark-dist/vendors/atmarktechno/ プロダクト 名 /etc/securetty を 図 2.6. ログインプロンプトをシリアルインターフェース 2 にした inittab 図 2.7. シリアルインター フェース 2 からの root ログインを 許 可 した securetty に 示 すように 修 正 してユーザーランドをビルド し 作 成 されたルートファイルシステムイメージ(romfs.img.gz)を Armadillo のフラッシュメモリのユー ザーランド 領 域 に 書 き 込 んでください Armadillo を 再 起 動 すると ログインプロンプトもシリアルイン ターフェース 2 に 表 示 されるようになります ::sysinit:/etc/init.d/rc ::respawn:/sbin/getty -L 115200 ttymxc2 vt102 ::shutdown:/etc/init.d/reboot ::ctrlaltdel:/sbin/reboot 図 2.6 ログインプロンプトをシリアルインターフェース 2 にした inittab 12

ttymxc1 ttymxc2 図 2.7 シリアルインターフェース 2 からの root ログインを 許 可 した securetty ユーザーランドを Debian GNU/Linux で 構 築 している 場 合 は /etc/inittab のログインプロンプトに 関 連 する 部 分 は 図 2.8. Armadillo-400 シリーズ 用 Debian GNU/Linux の inittab( 抜 粋 ) のようになっ ています ログインプロンプトをシリアルインターフェース 2 に 出 力 するには ttymxc1 を ttymxc2 に 変 更 します また securetty は 図 2.9. Armadillo-400 シリーズ 用 Debian GNU/Linux の securetty( 抜 粋 ) のようになっているので ttymxc2 を 追 加 します # Example how to put a getty on a serial line (for a terminal) # #T0:23:respawn:/sbin/getty -L ttys0 9600 vt100 #T1:23:respawn:/sbin/getty -L ttys1 9600 vt100 # Example how to put a getty on a modem line. # #T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttys3 T1:23:respawn:/sbin/getty -L ttymxc1 115200 vt100 図 2.8 Armadillo-400 シリーズ 用 Debian GNU/Linux の inittab( 抜 粋 ) # MXC serial ports ttymxc0 ttymxc1 図 2.9 Armadillo-400 シリーズ 用 Debian GNU/Linux の securetty( 抜 粋 ) 2.1.2. コンソールへの 出 力 を 止 める 実 際 の 製 品 においては コンソールが 使 える 事 自 体 が 問 題 となる 場 合 もあるでしょう コンソールへ の 出 力 を 止 めるのも 2.1.1. コンソールとして 別 のシリアルインターフェースを 使 用 する と 同 様 の 手 順 で 行 うことができます コンソールへの 出 力 を 止 めるには カーネルパラメータの console に none を 指 定 します hermit> setenv console=none 図 2.10 コンソールへの 出 力 を 止 める また /etc/inittab の getty に 関 する 行 は 削 除 するかコメントアウトします /etc/securetty に 関 する 設 定 は ログインプロンプトを 表 示 しなければ 関 係 ないので そのままで 構 いません [1] ::sysinit:/etc/init.d/rc [1] もちろん セキュリティ 面 を 考 慮 すれば securetty にはログインを 許 可 するインターフェースのみを 記 述 すべきです 13

#::respawn:/sbin/getty -L 115200 ttymxc2 vt102 ::shutdown:/etc/init.d/reboot ::ctrlaltdel:/sbin/reboot 図 2.11 ログインプロンプトを 表 示 しない( 標 準 の inittab) # Example how to put a getty on a serial line (for a terminal) # #T0:23:respawn:/sbin/getty -L ttys0 9600 vt100 #T1:23:respawn:/sbin/getty -L ttys1 9600 vt100 # Example how to put a getty on a modem line. # #T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttys3 #T1:23:respawn:/sbin/getty -L ttymxc1 115200 vt100 図 2.12 ログインプロンプトを 表 示 しない(Armadillo-400 シリーズ 用 Debian GNU/Linux の inittab) 2.2. I2C 接 続 A/D コンバーター Armadillo-400 シリーズでは CON11 と CON14 に I2C バスが 出 ており 外 部 のデバイスと 接 続 す ることができます Armadillo-400 シリーズ LCD 拡 張 ボードや Armadillo-400 シリーズ RTC オプショ ンモジュール Armadillo-400 シリーズ WLAN モジュールでは I2C バスにリアルタイムクロックを 接 続 しています ここでは I2C バスに A/D コンバーターを 接 続 する 方 法 を 紹 介 します 使 用 するソフトウェア デバイスは 以 下 のとおりです 1. Linux カーネル: linux-3.14-at4 以 降 2. A/D コンバーター: PCF8591(NXP 社 製 ) 2.2.1. I2C 概 要 I2C(Inter Integrated Circuit)は IC 間 のデータ 転 送 に 使 われる 2 線 式 の 通 信 方 式 です 正 式 には I 2 C と 記 述 し I-squared-C(アイ スクエアド シー)と 読 みます [2] I2C ではシリアルデータライン(SDA)とシリアルクロック(SCL)の 2 本 の 信 号 線 のみを 使 用 して 通 信 を おこないます この 2 本 の 信 号 線 に 複 数 のデバイスを 接 続 し バスを 構 成 することができます I2C バ スに 接 続 するデバイスの 出 力 段 はオープンドレイン(またはオープンコレクタ)とし 信 号 線 はプルアップ します そのため 全 てのデバイスが High を 出 力 しているときだけ 信 号 線 は High となり どれかひと つのデバイスが Low を 出 力 すると 信 号 線 は Low となります [3] I2C バスに 接 続 されたデバイスは その 役 割 によってマスタとスレーブに 分 かれます マスタとスレー ブは 一 つの I2C バスにそれぞれ 複 数 接 続 することができます 通 信 は 必 ずマスタが 開 始 し バスに 接 続 されたスレーブとデータのやりとりを 行 います スレーブはそれぞれ 固 有 のアドレスを 持 っており マスタはアドレスを 指 定 することで 通 信 をおこなうスレーブを 特 定 します Armadillo-400 シリーズは I2C マスタとなることができます [2] I2C と 書 かれることから アイ ツー シーと 発 音 される 場 合 もあります [3] このような 接 続 を ワイヤード AND といいます 14

I2C では 1 クロックにつき 1bit のデータの 転 送 を 行 います そのため データ 転 送 速 度 はクロック の 速 度 によって 決 まります I2C にはいくつかのモードがあり モードごとに 転 送 速 度 の 上 限 が 決 まって います 標 準 モードでは 0 から 100kbit/sec ファーストモードでは 400kbit/sec まで ハイスピード モードでは 3.4Mbit/sec までとなっています Armadillo-400 シリーズは ファーストモードまで 対 応 しています データの 転 送 はクロックに 同 期 して 行 われます クロックは 転 送 を 開 始 するマスタが 生 成 します SCL が High の 時 に SDA を High から Low に 変 化 させることで 転 送 が 開 始 されます これをスタートコン ディションと 呼 びます また SCL が High の 時 に SDA を Low から High に 変 化 させることでデータ の 転 送 を 終 了 します これをストップコンディションといいます スタートコンディションとストップ コンディションの 発 行 は 必 ずマスターによって 行 われます I2C では 1 回 の 転 送 で 複 数 のバイトを 送 受 信 することができます 各 バイトの 長 さは 必 ず 8bit にな ります データは 最 上 位 ビット(MSB)から 順 に 送 信 されます SCL が High の 時 の SDA のレベルによっ て 論 理 が 0(SDA=Low)か 1(SDA=High)かが 決 定 します SCL が High の 間 SDA のレベルは 一 定 で なければなりません SDA のレベルを 変 更 できるのは SCL が Low の 時 だけです 各 バイト(8bit)の 転 送 ごとに アクノリッジ(ACK)が 必 要 になります 受 信 側 は 正 常 に 通 信 がおこな えている 場 合 アクノリッジ 信 号 として SDA を Low にします アクノリッジ 信 号 として SDA を High にすることで 送 信 側 にデータの 終 了 を 知 らせることができます 2.2.2. サンプル 回 路 図 2.13 I2C プロトコル 今 回 使 用 する A/D コンバーター PCF8591 は 以 下 の 特 長 を 持 ちます 1. 単 一 電 源 (2.5V から 6V) 動 作 2. I2C 接 続 3. 3 つのハードウェアピンでアドレス 指 定 可 能 4. オンチップ サンプルアンドホールド 回 路 5. 8bit 分 解 能 逐 次 比 較 型 A/D 入 力 4 6. 8bit 分 解 能 D/A 1 Armadillo-400 シリーズと A/D コンバーターとの 接 続 を 図 2.14. I2C 接 続 A/D コンバーター 回 路 図 に 示 します Armadillo-400 シリーズの CON14 から 出 ている I2C2 に PCF8591 を 接 続 します アドレスを 指 定 する A0 A1 A2 ピンは 全 てプルダウンしておきます AIN0 から AIN3 ピンがアナロ グ 入 力 ピンです アナログ 入 力 にかかる 電 圧 を 20kΩ の 可 変 抵 抗 で 変 えられるようにしています リ ファレンス 電 圧 VREF に 電 源 電 圧 と 同 じ 3.3V を 入 力 しているため 0V から 3.3V の 範 囲 のアナログ 入 力 を 8bit(256 段 階 )のデジタル 値 に 変 換 します 15

2.2.3. PCF8591 通 信 プロトコル 図 2.14 I2C 接 続 A/D コンバーター 回 路 図 PCF8591 は 内 部 にレジスタを 持 っており レジスタの 値 を 変 更 することで デバイスの 機 能 を 変 更 す ることができます レジスタへの 書 き 込 みは 図 2.15. PCF8591 通 信 フォーマット(コントロールバイ ト 書 き 込 み) に 示 すフォーマットにしたがっておこないます 図 2.15 PCF8591 通 信 フォーマット(コントロールバイト 書 き 込 み) まず マスタがスタートコンディションを 発 行 し アドレスバイトを 送 信 します スレーブからの ACK が 返 ってきたら 続 いてコントロールバイトを 送 信 します 再 びスレーブからの ACK が 返 ってきたら ストップコンディションを 発 行 して レジスタへの 書 き 込 みを 完 了 します アドレスバイトのフォーマットを 図 2.16. PCF8591 通 信 フォーマット(アドレスバイト) に 示 しま す 上 位 7bit でスレーブのアドレスを 指 定 します A2 A1 A0 は それぞれ PCF8591 の A2 A1 A0 ピンのレベルに 対 応 した 値 とします 今 回 の 例 では 全 てプルダウンしたので A2 A1 A0 は 全 て 0 を 指 定 します 書 き 込 み 転 送 の 場 合 は R/W*を 0 とします 図 2.16 PCF8591 通 信 フォーマット(アドレスバイト) コントロールバイトのフォーマットを 図 2.17. PCF8591 通 信 フォーマット(コントロールバイト) に 示 します AOE はアナログ 出 力 有 効 の 場 合 1 を 指 定 します AISEL1 と AISEL0 で どのようにア ナログ 入 力 ピンを 使 用 するか 指 定 します シングルエンド( 方 線 接 地 ) 入 力 4 とする 場 合 は 0b00 ディ ファレンシャル( 差 動 ) 入 力 3 とする 場 合 は 0b01 シングルエンド 入 力 2+ディファレンシャル 入 力 1 16

とする 場 合 は 0b10 ディファレンシャル 入 力 2 とする 場 合 は 0b11 となります AINC はオートイン クリメント 有 効 の 時 1 を 指 定 します CH1 と CH0 にはアナログ 入 力 に 使 用 するチャンネルを 指 定 し ます 今 回 の 例 では AOE AISEL1 AISEL0 AINC を 全 て 0 とします 図 2.17 PCF8591 通 信 フォーマット(コントロールバイト) PCF8591 からデータを 読 み 出 すと CH で 指 定 したチャンネルの 値 を 得 ることができます データの 読 み 出 しは 図 2.18. PCF8591 通 信 フォーマット(データバイト 読 み 出 し) に 示 すフォーマットでお こないます 図 2.18 PCF8591 通 信 フォーマット(データバイト 読 み 出 し) まず マスタがスタートコンディションを 発 行 し アドレスバイトを 送 信 します スレーブはアドレ スバイトへの ACK を 返 し 続 いてデータバイトを 送 信 します マスタはデータバイトを 受 信 したあと 続 けてデータが 欲 しい 場 合 は ACK を 返 します データバイトの 受 信 を 終 了 したい 場 合 は NACK を 返 し ストップコンディションを 発 行 します アドレスバイトのフォーマットは R/W*が 1 になる 以 外 コントロールバイト 書 き 込 みの 場 合 と 同 じ です データバイトのフォーマットを 図 2.19. PCF8591 通 信 フォーマット(データバイト) に 示 します PCF8591 では アクノリッジ 信 号 のトレイリングエッジで 指 定 されたチャンネルの 入 力 電 圧 がサンプ ルされ データバイトの 送 信 中 に A/D 変 換 がおこなわれます そのため データバイトで 転 送 される 値 は 一 つ 前 のデータバイト 送 信 中 に 変 換 された 値 となります なお パワーオンリセット 後 の 最 初 のデー タバイトで 転 送 される 値 は 0x80 となります 17

2.2.4. i2cdev ドライバー 図 2.19 PCF8591 通 信 フォーマット(データバイト) 一 般 的 に I2C 接 続 のデバイスを Linux システムで 使 用 する 場 合 I2C スレーブデバイス 用 のデバイ スドライバーを 作 成 して デバイスの 制 御 をおこないます 今 回 は PCF8591 専 用 のデバイスドライ バーを 作 成 するのではなく 汎 用 の i2cdev ドライバーを 使 用 することにします i2cdev ドライバーを 使 用 すると デバイスファイルインターフェースを 経 由 して ユーザーランドで 動 作 するアプリケーショ ンプログラムからデバイスの 制 御 をおこなうことができます Armadillo-400 シリーズでは 標 準 のカー ネルで i2cdev ドライバーが 有 効 になっているため 特 に 何 も 設 定 しなくとも 使 用 可 能 です i2cdev ドライバーでは /dev/i2c-n(n は 0 から 始 まる 数 値 文 字 )デバイスファイルに 対 して open/ close/read/write/ioctl システムコールを 発 行 することで I2C デバイスの 制 御 をおこないます Armadillo-400 シリーズで 使 用 できるデバイスファイルを 表 2.1. I2C バスとデバイスファイルの 対 応 に 示 します 表 2.1 I2C バスとデバイスファイルの 対 応 I2C バス コネクタ デバイスファイル I2C1 なし [a] /dev/i2c-0 I2C2 CON14 /dev/i2c-1 I2C3 CON11 /dev/i2c-2 [a] ボード 内 蔵 バスとして 使 用 アプリケーションプログラムで I2C デバイスの 制 御 をおこなうには まず デバイスファイルをオー プンします int fd; fd = open("/dev/i2c-0", O_RDWR); 図 2.20 I2C デバイスファイルのオープン デバイスをオープンした 後 通 信 を 行 うスレーブデバイスを 特 定 するため スレーブデバイスのアド レスを 設 定 します これには ioctl システムコールを 使 用 します I2C_SLAVE などの i2cdev を 使 用 す る 際 に 必 要 となる 定 義 は <linux/i2c-dev.h>で 定 義 されています #include <linux/i2c-dev.h> int addr = 0x40; /* The I2C address */ ioctl(fd, I2C_SLAVE, addr); 図 2.21 I2C スレーブデバイスのアドレス 指 定 I2C スレーブデバイスとのデータ 転 送 をおこなうには 単 純 に read/write システムコールを 実 行 する だけです スタート/ストップコンディションの 発 行 アドレスバイトの 生 成 と 送 信 アクノリッジの 処 18

理 などは 全 てドライバーがおこなってくれるので アプリケーションプログラム 側 ではそれらを 意 識 する 必 要 はありません i2cdev ドライバーに 関 する 詳 しい 情 報 は linux-3.14-at[version]/documentation/i2c/devinterface を 参 照 してください 2.2.5. サンプルプログラム PCF8591 と 通 信 をおこない A/D 変 換 結 果 を 表 示 するサンプルプログラムを 紹 介 します プログラ ムは 図 2.22. PCF8591 を 使 用 した A/D 変 換 プログラム に 示 すように オプションとしてデバイス ファイル 名 と A/D 変 換 をおこなうチャンネルを 指 定 することにします adc_pcf8591 <-d --device FILENAME> [-c --channel CHANNEL] 図 2.22 PCF8591 を 使 用 した A/D 変 換 プログラム main 関 数 を 図 2.23. adc_pcf8591.c に 示 します pcf8591_で 始 まる 名 前 の 関 数 で 実 際 の 制 御 をおこないます main 関 数 では 以 下 の 処 理 をおこなっています 1. pcf8591_open()で デバイスファイル 名 とアドレスを 指 定 してデバイスをオープンする 2. pcf8591_read()で チャンネルを 指 定 してデジタル 値 を 読 み 出 す 3. デジタル 値 を 電 圧 に 変 換 して 表 示 4. pcf8591_close()で デバイスをクローズする #include <stdio.h> #include <string.h> #include <unistd.h> #include <getopt.h> #include "pcf8591.h" #define MAIN_C #include "exitfail.h" #define BASENAME(p) ((strrchr((p), '/')? : ((p) - 1)) + 1) #define REF_VOLTAGE 3.3 /* 基 準 電 圧 [V] */ #define I2C_ADDR 0x48 /* PCF8591 の I2C アドレス */ #define DEFAULT_CH 0 /* オプションで 指 定 されなかった 場 合 に 使 用 するチャンネル */ static void usage(char *prog) { printf("usage: %s <-d --device FILENAME> [-c --channel CHANNEL]\n", BASENAME(prog)); static void parse_arg(int argc, char *argv[], char **device, int *ch) { int c; char *endptr; *device = NULL; 19

for(;;) { int option_index = 0; static struct option long_options[] = { /* name, has_arg, flag, val*/ {"device", required_argument, NULL, 'd', {"channel", required_argument, NULL, 'c', {0, 0, 0, 0, ; c = getopt_long(argc, argv, "d:c:", long_options, &option_index); if (c == -1) break; switch (c) { case 'd': *device = optarg; break; case 'c': errno = 0; *ch = strtol(optarg, &endptr, 0); if (errno!= 0 optarg == endptr) goto err; if (*ch < PCF8591_CH_MIN PCF8591_CH_MAX < *ch) goto err; break; default: goto err; if (*device == NULL) goto err; return; err: usage(argv[0]); exit(exit_failure); int main(int argc, char *argv[]) { struct pcf8591 *adc; char *device; int channel = DEFAULT_CH; double voltage; uint8_t digital_code; int ret; exitfail_init(); parse_arg(argc, argv, &device, &channel); adc = pcf8591_open(device, I2C_ADDR); if (adc == NULL) exitfail_errno("pcf8591_open"); 20

ret = pcf8591_read(adc, channel, &digital_code); if (ret!= 0) exitfail_errno("pcf8591_read"); voltage = digital_code * REF_VOLTAGE / ((1 << PCF8591_RESOLUTION_BITS) - 1); printf("%1.3fv\n", voltage); ret = pcf8591_close(adc); if (ret!= 0) exitfail_errno("pcf8591_close"); return EXIT_SUCCESS; 図 2.23 adc_pcf8591.c 実 際 の 処 理 は 図 2.25. pcf8591.c に 記 述 してあります 図 2.24. pcf8591.h には 図 2.25. pcf8591.c で 記 述 されている 関 数 のプロトタイプ 宣 言 が 記 述 されています #ifndef PCF8591_H #define PCF8591_H #include <stdint.h> #define PCF8591_RESOLUTION_BITS 8 /* PCF8591 の 分 解 能 (bit) */ #define PCF8591_CH_MIN 0 /* PCF8591 で 指 定 できるアナログ 入 力 チャンネルの 最 小 値 */ #define PCF8591_CH_MAX 3 /* PCF8591 で 指 定 できるアナログ 入 力 チャンネルの 最 大 値 */ struct pcf8591; struct pcf8591 *pcf8591_open(const char *dev_path, int addr); int pcf8591_read(struct pcf8591 *adc, int ch, uint8_t *digit); int pcf8591_close(struct pcf8591 *adc); #endif /* PCF8591_H */ 図 2.24 pcf8591.h #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> #include <ctype.h> #include <sys/ioctl.h> #include <sys/types.h> #include <linux/i2c-dev.h> #include "pcf8591.h" #define PCF8591_ADDR_MIN 0x48 /* PCF8591 のアドレスの 最 小 値 */ #define PCF8591_ADDR_MAX 0x4F /* PCF8591 のアドレスの 最 大 値 */ 21

#define PCF8591_RETRY_MAX 3 /* read()と write()のリトライ 回 数 */ /* PCF8591 の CONTROL BYTE の 設 定 */ #define PCF8591_ANALOG_OUTPUT_ENABLE (1 << 6) #define PCF8591_ANALOG_OUTPUT_DISABLE (0 << 6) #define PCF8591_SINGLE_ENDED (0 << 4) #define PCF8591_THREE_DIFFERENTIAL (1 << 4) #define PCF8591_SINGLE_ENDED_AND_DIFFERENTIAL (2 << 4) #define PCF8591_TWO_DIFFERENTIAL (3 << 4) #define PCF8591_AUTO_INCREMENT_ENABLE (1 << 2) #define PCF8591_AUTO_INCREMENT_DISABLE (0 << 2) #define PCF8591_CH_SHIFT (0) struct pcf8591 { int fd; ; static ssize_t write_uninterruptible(int fd, const void *buf, size_t count, int retry) { ssize_t ret; int i; for (i = 0; i < retry; i++) { ret = write(fd, buf, count); if (ret < 0 && errno!= EINTR) return -1; if ((size_t)ret == count) return ret; errno = ETIMEDOUT; return -1; static ssize_t read_uninterruptible(int fd, void *buf, size_t count, int retry) { size_t read_length = 0; ssize_t ret; int i; for (i = 0; i < retry; i++) { ret = read(fd, buf + read_length, count - read_length); if (ret < 0) { if (errno == EINTR) continue; else return -1; read_length += ret; if (read_length == count) 22

return read_length; errno = ETIMEDOUT; return -1; /** * 指 定 されたデバイスファイルをオープンする * * @param dev_path PCF8591 が 接 続 された i2cdev のデバイスファイルへのパス * @param addr PCF8591 のアドレス * * @return 成 功 すると struct pcf8591 へのポインタを 返 す * 失 敗 すると NULL を 返 す その 際 適 切 な errno を 設 定 する */ struct pcf8591 *pcf8591_open(const char *dev_path, const int addr) { struct pcf8591 *adc; int error; int ret; if (dev_path == NULL addr < PCF8591_ADDR_MIN PCF8591_ADDR_MAX < addr) { errno = EINVAL; return NULL; adc = calloc(1, sizeof(struct pcf8591)); if (adc == NULL) return NULL; adc->fd = open(dev_path, O_RDWR); if (adc->fd < 0) { error = errno; goto err1; ret = ioctl(adc->fd, I2C_SLAVE, addr); if (ret < 0) { error = errno; goto err2; return adc; err2: err1: close(adc->fd); free(adc); errno = error; return NULL; /** * 指 定 されたチャンネルの 値 を A/D コンバータにセットし * PCF8591 から A/D 変 換 結 果 を 読 み 込 む * 読 み 込 んだ A/D 変 換 結 果 を digit に 格 納 する 23

* * @param adc オープン 済 みの PCF8591 デバイスへのポインタ * @param ch サンプリングするチャンネル * @param digit A/D 変 換 された 値 が 格 納 される * * @return 成 功 すると 0 を 返 し digit に A/D 変 換 された 値 を 格 納 する * 失 敗 すると-1 を 返 す その 際 適 切 な errno を 設 定 する */ int pcf8591_read(struct pcf8591 *adc, const int ch, uint8_t *digit) { uint8_t buf[2]; int ret; if (adc == NULL digit == NULL ch < PCF8591_CH_MIN PCF8591_CH_MAX < ch) { errno = EINVAL; return -1; buf[0] = PCF8591_ANALOG_OUTPUT_DISABLE PCF8591_SINGLE_ENDED PCF8591_AUTO_INCREMENT_DISABLE (ch << PCF8591_CH_SHIFT); ret = write_uninterruptible(adc->fd, buf, 1, PCF8591_RETRY_MAX); if (ret < 0) return -1; /* 現 在 のアナログ 入 力 を 変 換 した 値 を 取 得 するために 2 バイト 読 み 込 む */ ret = read_uninterruptible(adc->fd, buf, 2, PCF8591_RETRY_MAX); if (ret < 0) return -1; *digit = buf[1]; return 0; /** * 指 定 された PCF8591 デバイスをクローズする * * @param adc オープン 済 みの PCF8591 デバイスへのポインタ * * @return 成 功 すると 0 を 返 す * 失 敗 すると-1 を 返 す その 際 適 切 な errno を 設 定 する */ int pcf8591_close(struct pcf8591 *adc) { int fd; if (adc == NULL) { errno = EINVAL; return -1; fd = adc->fd; free(adc); 24

return close(fd); 図 2.25 pcf8591.c サンプルプログラムをビルドする makefile を 図 2.26. adc_pcf8591 をビルドする makefile に 示 します CROSS := arm-linux-gnueabi ifneq ($(CROSS),) CROSS_PREFIX := $(CROSS)- endif CC = $(CROSS_PREFIX)gcc CFLAGS = -Wall -Wextra -O2 -I../common TARGET = adc_pcf8591 all: $(TARGET) adc_pcf8591: adc_pcf8591.o pcf8591.o $(CC) $(CFLAGS) -o $@ $^ clean: $(RM) *~ *.o $(TARGET) %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< 図 2.26 adc_pcf8591 をビルドする makefile adc_pcf8591.c pcf8591.h pcf8591.c Makefile を 同 じディレクトリに 置 き 一 つ 上 の common ディ レクトリに 第 2 部 でも 使 用 した exitfail.h を 置 いておきます make コマンドを 実 行 すると adc_pcf8591 がビルドされます [ATDE ~/i2c-adc]$ make arm-linux-gnueabi-gcc -Wall -Wextra -O2 -I../common -c -o adc_pcf8591.o adc_pcf8591.c arm-linux-gnueabi-gcc -Wall -Wextra -O2 -I../common -c -o pcf8591.o pcf8591.c arm-linux-gnueabi-gcc -Wall -Wextra -O2 -I../common -o adc_pcf8591 adc_pcf8591.o pcf8591.o 図 2.27 adc_pcf8591 のビルド 生 成 された adc_pcf8591 を Armadillo にコピーして 実 行 権 限 をつけてください adc_pcf8591 を 実 行 すると 図 2.28. adc_pcf8591 コマンドの 実 行 に 示 すような 結 果 が 得 られます [armadillo ~]# chmod +x adc_pcf8591 [armadillo ~]#./adc_pcf8591 --device /dev/i2c-1 --channel 0 3.235V 図 2.28 adc_pcf8591 コマンドの 実 行 25

2.3. SPI 接 続 A/D コンバーター Armadillo-400 シリーズでは CON9 を SPI バスとして 使 用 することができます ここでは SPI バ スに A/D コンバータを 接 続 する 方 法 を 紹 介 します 使 用 するソフトウェア デバイスは 以 下 のとおりです 1. Linux カーネル: linux-3.14-at4 以 降 2. A/D コンバーター: MCP3204(Microchip 社 製 ) 2.3.1. SPI 概 要 SPI(Serial Peripheral Interface)は IC 間 のデータ 転 送 に 使 われる 4 線 式 の 通 信 方 式 です SPI では シリアルクロック(SCLK) マスタアウトプット/スレーブインプット(MOSI) マスタインプット/スレー ブアウトプット(MISO) スレーブセレクト(SS)の 4 本 の 信 号 線 を 使 用 して 通 信 をおこないます これら の 信 号 線 に 複 数 のデバイスを 接 続 してバスを 構 成 することができます SPI バスに 接 続 されたデバイスは その 役 割 によってマスタとスレーブに 分 かれます SPI では 1 つ のバスに 1 つのマスタと 複 数 のスレーブを 接 続 できます 通 信 は 必 ずマスタが 開 始 し バスに 接 続 され たスレーブとデータのやりとりを 行 います マスタは 通 信 をおこなうスレーブを SS 信 号 によって 特 定 します そのため 通 常 スレーブ 1 つにつき 1 本 の SS 信 号 を 接 続 します Armadillo-400 シリーズ は SPI マスタとなることができます SPI では 1 クロックにつき 1bit のデータ 転 送 をおこないます そのため データ 転 送 速 度 はクロッ クの 速 度 によって 決 まります Armadillo-400 シリーズは 約 16MHz まで 対 応 できます データの 転 送 は マスタが SS 信 号 をアサートすることで 開 始 されます SCLK 信 号 に 同 期 して マス ターからスレーブへのデータを MOSI に 出 力 し スレーブからマスタへのデータを MISO から 入 力 しま す データの 入 出 力 をおこなう 線 が 分 かれているため 全 二 重 の 通 信 をおこなうことができます 一 度 の 転 送 で 送 受 信 できるビット 数 はデバイスごとに 異 なり SPI プロトコルとしての 制 限 はありません SPI では クロックのポラリティとフェーズを 指 定 できます それぞれの 設 定 を CPOL と CPHA で 表 します 1. CPOL=0: クロックを 出 力 していないとき SCLK を Low に 保 ちます a. CPHA=0: クロックの 立 ち 上 がりでデータをラッチします b. CPHA=1: クロックの 立 ち 下 がりでデータをラッチします 2. CPOL=1: クロックを 出 力 していないとき SCLK を High に 保 ちます a. CPHA=0: クロックの 立 ち 下 がりでデータをラッチします b. CPHA=1: クロックの 立 ち 上 がりでデータをラッチします CPOL と CPHA の 組 み 合 わせを SPI モードで 表 現 する 場 合 もあります 表 2.2 SPI モード モード CPOL CPHA 0 0 0 1 0 1 2 1 0 26

モード CPOL CPHA 3 1 1 図 2.29 SPI プロトコル 2.3.2. サンプル 回 路 今 回 使 用 する A/D コンバーター MCP3204 は 以 下 の 特 長 を 持 ちます 1. 単 一 電 源 (2.7V から 5.5V) 動 作 2. SPI 接 続 3. サンプリング 速 度 最 大 100ksps(Vdd=5V 時 ) 50ksps(Vdd=2.7V 時 ) 4. オンチップ サンプルアンドホールド 5. 12bit 分 解 能 逐 次 比 較 型 A/D 入 力 4 Armadillo-400 シリーズと A/D コンバーターとの 接 続 を 図 2.30. SPI 接 続 A/D コンバーター 回 路 図 に 示 します Armadillo-400 シリーズの CON9 から 出 ている CSPI3 に MCP3204 を 接 続 します SS 信 号 には CSPI3 の SS0 を 使 用 します AIN0 から AIN3 ピンがアナログ 入 力 ピンです アナログ 入 力 にかかる 電 圧 を 20kΩ の 可 変 抵 抗 で 変 えられるようにしています リファレンス 電 圧 VREF に 電 源 電 圧 と 同 じ 3.3V を 入 力 しているため 0V から 3.3V の 範 囲 のアナログ 入 力 を 12bit(4096 段 階 )のデ ジタル 値 に 変 換 します 27

2.3.3. MCP3204 通 信 プロトコル 図 2.30 SPI 接 続 A/D コンバーター 回 路 図 MCP3204 は SPI モード 0(CPOL=0 CPHA=0)または SPI モード 3(CPOL=1 CPHA=1)で 通 信 をおこないます MCP3204 の 通 信 フォーマットを 図 2.31. MCP3204 通 信 フォーマット に 示 しま す 図 2.31 MCP3204 通 信 フォーマット MOSI から 1 を 出 力 することで 転 送 の 開 始 を MCP3204 に 指 示 します SGL/DIFF* D2 D1 D0 の 組 み 合 わせにより A/D 変 換 をおこなうチャンネルを 指 定 します D0 以 降 MOSI から 出 力 される データは 意 味 を 持 ちません 表 2.3 MCP3204 チャンネル 指 定 SGL/DIFF* D2 [a] D1 D0 入 力 構 成 チャンネル 1 d.c. 0 0 シングルエンド CH0 1 d.c. 0 1 シングルエンド CH1 1 d.c. 1 0 シングルエンド CH2 1 d.c. 1 1 シングルエンド CH3 0 d.c. 0 0 ディファレンシャル CH0=IN+ CH1=IN- 0 d.c. 0 1 ディファレンシャル CH0=IN- CH1=IN + 28

SGL/DIFF* D2 [a] D1 D0 入 力 構 成 チャンネル 0 d.c. 1 0 ディファレンシャル CH2=IN+ CH3=IN- 0 d.c. 1 1 ディファレンシャル CH2=IN- CH3=IN + [a] MCP3204 では D2 は 意 味 を 持 ちません MCP3204 は 11 番 目 のクロックの 上 昇 部 でアナログ 入 力 のサンプリングを 開 始 し 次 のクロックの 下 降 部 で 完 了 します A/D 変 換 結 果 は B11 から B0 に 出 力 されます 2.3.4. spidev ドライバー 一 般 的 に SPI 接 続 のデバイスを Linux システムで 使 用 する 場 合 SPI スレーブデバイス 用 のデバイス ドライバーを 作 成 して デバイスの 制 御 をおこないます 今 回 は MCP3204 専 用 のデバイスドライバー を 作 成 するのではなく 汎 用 の spidev ドライバーを 使 用 することにします spidev ドライバーを 使 用 すると デバイスファイルインターフェースを 経 由 して ユーザーランドで 動 作 するアプリケーション プログラムからデバイスの 制 御 をおこなうことができます Armadillo-400 シリーズでは 標 準 のカー ネルでは spidev ドライバーが 有 効 になっていないため spidev を 使 用 するにはカーネルの 設 定 を 変 更 する 必 要 があります spidev ドライバーでは /dev/spidevn.m (N M は 0 から 始 まる 数 値 文 字 )デバイスファイルに 対 して open/close/read/write/ioctl システムコールを 発 行 することで SPI デバイスの 制 御 をおこないます Armadillo-400 シリーズで 使 用 できるデバイスファイルを 表 2.4. SPI バスとデバイスファイルの 対 応 に 示 します 表 2.4 SPI バスとデバイスファイルの 対 応 SPI バス コネクタ デバイスファイル CSPI1 CON9 /dev/spidev0.m (M は 0 または 1) CSPI3 CON9 /dev/spidev2.m (M は 0 1 2 3 のいずれか) アプリケーションプログラムで SPI デバイスの 制 御 をおこなうには まず デバイスファイルをオー プンします int fd; fd = open("/dev/spidev0.0", O_RDWR); 図 2.32 SPI デバイスファイルのオープン ioctl システムコールにより SPI の 設 定 を 変 更 することができます 1. SPI_IOC_RD_MODE, SPI_IOC_WR_MODE: 読 み 出 しまたは 書 き 込 み 時 に 使 用 する SPI モードを 設 定 します 2. SPI_IOC_RD_LSB_FIRST, SPI_IOC_WR_LSB_FIRST: 読 み 出 しまたは 書 き 込 み 時 に LSB から 転 送 するか MSB から 転 送 するか 設 定 します 3. SPI_IOC_RD_BITS_PER_WORD, SPI_IOC_WR_BITS_PER_WORD: 1 回 の 読 み 出 しまたは 書 き 込 みで 転 送 するビット 数 を 設 定 します 4. SPI_IOC_RD_MAX_SPEED_HZ, SPI_IOC_WR_MAX_SPEED_HZ: 読 み 出 しまたは 書 き 込 みの 最 大 転 送 速 度 を 設 定 します 29

read/write システムコールを 使 用 すると 半 二 重 通 信 をおこなうことができます 全 二 重 通 信 をおこ なうには ioctl システムコールの SPI_IOC_MESSAGE(N) メッセージを 使 用 します SPI_IOC_MESSAGE(N)の 使 用 方 法 は サンプルプログラムで 解 説 します spidev ドライバーに 関 する 詳 しい 情 報 は linux-3.14-at[version]/documentation/spi/spidev を 参 照 してください 2.3.5. カーネルコンフィギュレーション Armadillo-400 シリーズの 標 準 のカーネルでは SPI ドライバーは 有 効 になっていません そのため SPI マスタドライバーと spidev ドライバーが 有 効 になったカーネルを 作 成 する 必 要 があります まず カーネルのソースコードアーカイブを 取 得 します ここでは Armadillo サイトからダウンロー ドしてくることにします [ATDE ~]$ wget http://armadillo.atmark-techno.com/files/downloads/armadillo-4x0/source/kernel/ linux-3.14-at[version].tar.gz [ATDE ~]$ tar xzvf linux-3.14-at[version].tar.gz 図 2.33 Linux カーネルの 取 得 と 展 開 次 に Armadillo-400 シリーズの 標 準 コンフィギュレーションを 適 用 します [ATDE ~]$ cd linux-3.14-at[version]/ [ATDE ~/linux-3.14-at[version]]$ make ARCH=arm armadillo4x0_defconfig 図 2.34 Linux カーネルに Armadillo-400 シリーズ 標 準 コンフィギュレーションを 適 用 する 続 いて menuconfig を 使 用 して 図 2.36. SPI ドライバーを 有 効 にする 及 び 図 2.37. SPI に 使 用 するピンを 指 定 する に 示 すようにカーネルコンフィギュレーションを 変 更 します [ATDE ~/linux-3.14-at[version]]$ make ARCH=arm menuconfig 図 2.35 menuconfig を 使 用 してカーネルコンフィギュレーションを 変 更 する Linux Kernel Configuration Device Drivers ---> [*] SPI support ---> チェックを 入 れる {* Utilities for Bitbanging SPI masters M から * に 変 更 する <*> Freescale i.mx SPI controllers M から * に 変 更 する <*> User mode SPI device driver support チェックを 入 れる 図 2.36 SPI ドライバーを 有 効 にする Linux Kernel Configuration System Type ---> Freescale i.mx support ---> Armadillo-400 Board options ---> [ ] Enable UART5 at CON9 チェックを 外 す 30

[*] Enable SPI3 at CON9 チェックを 入 れる [*] Enable SPI3_SS0 at CON9_16 標 準 で 選 択 されているのでそのまま [ ] Enable SPI3_SS1 at CON9_18 チェックを 外 す [ ] Enable SPI3_SS2 at CON9_15 チェックを 外 す [ ] Enable SPI3_SS3 at CON9_17 チェックを 外 す 図 2.37 SPI に 使 用 するピンを 指 定 する また カーネルのソースコードにも 一 部 修 正 が 必 要 になります SPI スレーブデバイスドライバーを 使 用 するには spi_board_info を 登 録 する 必 要 があります spi_board_info の 登 録 は linux-3.14- at[version]/arch/arm/mach-imx/armadillo4x0_extif.c で お こ な っ て い ま す armadillo4x0_spi2_board_info を 図 2.38. CSPI3 SS0 を spidev で 使 用 する 修 正 に 示 すように 修 正 してください static struct spi_board_info armadillo4x0_spi2_board_info[] initdata = { {.modalias = "spidev",.max_speed_hz = 1000000,.bus_num = 2,.chip_select = 0,, ; 図 2.38 CSPI3 SS0 を spidev で 使 用 する 修 正 コンフィギュレーションの 変 更 と ソースの 修 正 をおこなったら カーネルをビルドします [ATDE ~/linux-3.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- && gzip -c arch/ arm/boot/image > linux.bin.gz 図 2.39 Linux カーネルをビルドする 正 常 にビルドが 完 了 すると linux-3.14-at[version]/linux.bin.gz にカーネルイメージが 作 成 されま す linux.bin.gz を Armadillo のフラッシュメモリのカーネル 領 域 に 書 き 込 んでください 2.3.6. サンプルプログラム MCP3204 と 通 信 をおこない A/D 変 換 結 果 を 表 示 するサンプルプログラムを 紹 介 します プログラ ムは 図 2.40. MCP3204 を 使 用 した A/D 変 換 プログラム に 示 すように オプションとしてデバイス ファイル 名 と A/D 変 換 をおこなうチャンネルを 指 定 することにします adc_mcp3204 <-d --device FILENAME> [-c --channel CHANNEL] 図 2.40 MCP3204 を 使 用 した A/D 変 換 プログラム main 関 数 を 図 2.41. adc_mcp3204.c に 示 します mcp3204_というプレフィックスがついた 関 数 で 実 際 の 制 御 をおこないます main 関 数 では 以 下 の 処 理 をおこなっています 1. mcp3204_open()で デバイスファイル 名 を 指 定 してデバイスをオープンする 2. mcp3204_read()で チャンネルを 指 定 してデジタル 値 を 読 み 出 す 31

3. デジタル 値 を 電 圧 に 変 換 して 表 示 4. mcp3204_close()で デバイスをクローズする #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <getopt.h> #include "mcp3204.h" #define MAIN_C #include "exitfail.h" #define BASENAME(p) ((strrchr((p), '/')? : ((p) - 1)) + 1) #define REF_VOLTAGE 3.3 /* 基 準 電 圧 [V] */ #define DEFAULT_CH 0 /* オプションで 指 定 されなかった 場 合 に 使 用 するチャンネル */ static void usage(const char *prog) { printf("usage: %s <-d --device FILENAME> [-c --channel CHANNEL]\n", BASENAME(prog)); static void parse_arg(int argc, char *argv[], const char **device, int *ch) { int c; char *endptr; *device = NULL; for(;;) { int option_index = 0; static struct option long_options[] = { /* name, has_arg, flag, val*/ {"device", required_argument, NULL, 'd', {"channel", required_argument, NULL, 'c', {0, 0, 0, 0, ; c = getopt_long(argc, argv, "d:c:", long_options, &option_index); if (c == -1) break; switch (c) { case 'd': *device = optarg; break; case 'c': errno = 0; *ch = strtol(optarg, &endptr, 0); if (errno!= 0 optarg == endptr) goto err; if (*ch < MCP3204_CH_MIN MCP3204_CH_MAX < *ch) goto err; 32

break; default: goto err; if (*device == NULL) goto err; return; err: usage(argv[0]); exit(exit_failure); int main(int argc, char *argv[]) { struct mcp3204 *adc; const char *device; int channel = DEFAULT_CH; double voltage; uint16_t digital_code; int ret; exitfail_init(); parse_arg(argc, argv, &device, &channel); adc = mcp3204_open(device); if (adc == NULL) exitfail_errno("mcp3204_open"); ret = mcp3204_read(adc, channel, &digital_code); if (ret!= 0) exitfail_errno("mcp3204_read"); voltage = digital_code * REF_VOLTAGE / ((1 << MCP3204_RESOLUTION_BITS) - 1); printf("%1.3fv\n", voltage); ret = mcp3204_close(adc); if (ret!= 0) exitfail_errno("mcp3204_close"); return EXIT_SUCCESS; 図 2.41 adc_mcp3204.c 実 際 の 処 理 は 図 2.43. mcp3204.c に 記 述 してあります 図 2.42. mcp3204.h には 図 2.43. mcp3204.c で 記 述 されている 関 数 のプロトタイプ 宣 言 が 記 述 されています #ifndef MCP3204_H #define MCP3204_H 33

#include <stdint.h> #define MCP3204_RESOLUTION_BITS 12 /* MCP3204 の 分 解 能 (bit) */ #define MCP3204_CH_MIN 0 /* MCP3204 で 指 定 できるアナログ 入 力 チャンネルの 最 小 値 */ #define MCP3204_CH_MAX 3 /* MCP3204 で 指 定 できるアナログ 入 力 チャンネルの 最 大 値 */ struct mcp3204; struct mcp3204 *mcp3204_open(const char *dev_path); int mcp3204_read(struct mcp3204 *adc, int ch, uint16_t *digit); int mcp3204_close(struct mcp3204 *adc); #endif /* MCP3204_H */ 図 2.42 mcp3204.h #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> #include <sys/ioctl.h> #include <sys/stat.h> #include <linux/types.h> #include <linux/spi/spidev.h> #include "mcp3204.h" #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define MCP3204_START_BIT (1 << 2) #define MCP3204_SINGLE_ENDED (1 << 1) #define MCP3204_DIFFERENTIAL (0 << 1) #define MCP3204_CH_SHIFT (6) #define MCP3204_SPI_MODE (SPI_CPOL SPI_CPHA) #define MCP3204_SPI_SPEED_HZ 1000000 #define MCP3204_SPI_DELAY_USECS 0 #define MCP3204_SPI_BITS 8 struct mcp3204 { int fd; ; /** * 指 定 されたデバイスファイルをオープンする * * @param dev_path MCP3204 が 接 続 された spidev デバイスファイルへのパス * * @return 成 功 すると struct mcp3204 へのポインタを 返 す * 失 敗 すると NULL を 返 す その 際 適 切 な errno を 設 定 する */ struct mcp3204 *mcp3204_open(const char *dev_path) { struct mcp3204 *adc; 34

uint8_t mode = MCP3204_SPI_MODE; int error; int ret; if (dev_path == NULL) { errno = EINVAL; return NULL; adc = calloc(1, sizeof(struct mcp3204)); if (adc == NULL) return NULL; adc->fd = open(dev_path, O_RDWR); if (adc->fd < 0) { error = errno; goto err1; /* SPI モードを 設 定 する */ ret = ioctl(adc->fd, SPI_IOC_WR_MODE, &mode); if (ret < 0) { error = errno; goto err2; return adc; err2: err1: close(adc->fd); free(adc); errno = errno; return NULL; /** * 指 定 されたチャンネルの A/D 変 換 結 果 を 読 み 込 む * 読 み 込 んだ A/D 変 換 結 果 を digit に 格 納 する * * @param adc オープン 済 みの MCP3204 デバイスへのポインタ * @param ch サンプリングするチャンネル * @param digit A/D 変 換 結 果 のデジタル 値 が 格 納 される * * @return 成 功 すると 0 を 返 し voltage に 電 圧 を 格 納 する * 失 敗 すると-1 を 返 す その 際 適 切 な errno を 設 定 する */ int mcp3204_read(struct mcp3204 *adc, int ch, uint16_t *digit) { uint8_t tx[3] = {0, ; uint8_t rx[3] = {0, ; struct spi_ioc_transfer tr; int ret; if (adc == NULL digit == NULL ch < MCP3204_CH_MIN MCP3204_CH_MAX < ch) { errno = EINVAL; return -1; 35

/* 送 信 バッファにスタートビット SGL/DIFF* D2 D1 D0 をセットする */ tx[0] = MCP3204_START_BIT MCP3204_SINGLE_ENDED; tx[1] = ch << MCP3204_CH_SHIFT; /* 転 送 設 定 をセットする */ tr.tx_buf = (unsigned long)tx; tr.rx_buf = (unsigned long)rx; tr.len = ARRAY_SIZE(tx); tr.delay_usecs = MCP3204_SPI_DELAY_USECS; tr.speed_hz = MCP3204_SPI_SPEED_HZ; tr.bits_per_word = MCP3204_SPI_BITS; tr.cs_change = 0; /* 全 二 重 通 信 をおこなう */ ret = ioctl(adc->fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) return -1; /* 受 信 バッファから A/D 変 換 結 果 を 取 り 出 す */ *digit = (rx[1] & 0x0f) << 8; *digit = rx[2]; return 0; /** * 指 定 された MCP3204 デバイスをクローズする * * @param adc オープン 済 みの MCP3204 デバイスへのポインタ * * @return 成 功 すると 0 を 返 す * 失 敗 すると-1 を 返 す その 際 適 切 な errno を 設 定 する */ int mcp3204_close(struct mcp3204 *adc) { int fd; if (adc == NULL) { errno = EINVAL; return -1; fd = adc->fd; free(adc); return close(fd); 図 2.43 mcp3204.c サンプルプログラムをビルドする makefile を 図 2.44. adc_mcp3204 をビルドする makefile に 示 します CROSS := arm-linux-gnueabi 36

ifneq ($(CROSS),) CROSS_PREFIX := $(CROSS)- endif CC = $(CROSS_PREFIX)gcc CFLAGS = -Wall -Wextra -O2 -I../common LFLAGS = TARGET = adc_mcp3204 all: $(TARGET) adc_mcp3204: adc_mcp3204.o mcp3204.o $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ clean: $(RM) *~ *.o $(TARGET) %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< 図 2.44 adc_mcp3204 をビルドする makefile adc_mcp3204.c mcp3204.h mcp3204.c Makefile を 同 じディレクトリに 置 き 一 つ 上 の common ディ レクトリに 第 2 部 でも 使 用 した exitfail.h を 置 いておきます make コマンドを 実 行 すると adc_mcp3204 がビルドされます [ATDE ~/spi-adc]$ make arm-linux-gnueabi-gcc -Wall -Wextra -O2 -I../common -c -o adc_mcp3204.o adc_mcp3204.c arm-linux-gnueabi-gcc -Wall -Wextra -O2 -I../common -c -o mcp3204.o mcp3204.c arm-linux-gnueabi-gcc -Wall -Wextra -O2 -I../common -o adc_mcp3204 adc_mcp3204.o mcp3204.o 図 2.45 adc_mcp3204 のビルド 生 成 された adc_mcp3204 を Armadillo にコピーして 実 行 権 限 をつけてください adc_mcp3204 を 実 行 すると 図 2.46. adc_mcp3204 コマンドの 実 行 に 示 すような 結 果 が 得 られます [armadillo ~]# chmod +x adc_mcp3204 [armadillo ~]#./adc_mcp3204 --device /dev/spidev2.0 --channel 0 3.235V 2.4. 1-Wire 接 続 温 度 センサ 図 2.46 adc_mcp3204 コマンドの 実 行 Armadillo-400 シリーズでは CON9 2 ピンと CON9 26 ピンを 1-Wire バスとして 使 用 することが できます ここでは 1-Wire バスに 温 度 センサ IC を 接 続 する 方 法 を 紹 介 します 使 用 するソフトウェア デバイスは 以 下 のとおりです 1. Linux カーネル: linux-3.14-at4 以 降 2. 温 度 センサ: DS18B20(MAXIM 社 製 ) 37

2.4.1. 1-Wire 概 要 1-Wire は IC 間 のデータ 転 送 に 使 われる 1 線 式 の 通 信 方 式 です 最 低 限 1 本 の 信 号 線 と 接 地 線 の 2 本 だけでバスを 構 成 することができます このとき 電 力 は 信 号 線 から 得 ます なお 電 源 線 を 別 途 用 意 し 3 線 で 構 成 することもできます 1-Wire バスに 接 続 されたデバイスの 出 力 段 はオープンドレイン とし 信 号 線 はプルアップします 1-Wire バスに 接 続 されたデバイスは その 役 割 によってマスタとスレーブに 分 かれます 1-Wire で は 1 つのバスに 1 つのマスタと 複 数 のスレーブを 接 続 できます 通 信 は 必 ずマスタが 開 始 し バスに 接 続 されたスレーブとデータのやりとりを 行 います スレーブデバイスは チップごとに 固 有 な 64bit の ROM ID を 持 っており マスタは ROM ID を 指 定 することで 通 信 をおこなうスレーブを 特 定 します Armadillo-400 シリーズは 1-Wire マスタとなることができます 1-Wire では クロック 信 号 がないため タイムスロットに 基 づいてデータの 転 送 をおこないます マ スタからスレーブに 値 を 書 き 込 む 場 合 マスタからローパルスを 出 力 します パルスの 立 ち 下 がりエッ ジでスレーブ 内 の 単 安 定 マルチバイブレーターが 開 始 し 立 ち 下 がりエッジから 約 30μsec の 時 点 でサ ンプリングをおこないます そのため マスタは 1 を 書 き 込 む 場 合 は 1 から 15μsec の 短 いローパルス を 出 力 し 0 を 書 き 込 む 場 合 は 60μsec の 長 いローパルスを 出 力 します スレーブからの 値 を 読 み 出 す 場 合 まず マスタがローパルス 1 から 15μsec の 短 いローパルスを 出 力 します スレーブ 側 は 1 を 送 信 したい 場 合 何 もしません 0 を 送 信 したい 場 合 60μsec の 間 信 号 線 をローに 引 っ 張 ります マスタは 立 ち 下 がりエッジから 30μsec の 時 点 でサンプリングをおこな い スレーブからの 出 力 をサンプリングします なお タイムスロットにはスタンダード(1 タイムスロット 60μsec)とオーバードライブ(1 タイムス ロット 8μsec)の 二 つがあります 上 記 の 説 明 はスタンダードの 場 合 のタイミングです 図 2.47 1-Wire プロトコル(ビット 転 送 ) マスターとスレーブ 間 でのデータ 転 送 は 3 つのシーケンスでおこないます 3 つのシーケンスは リ セットシーケンス ROM コマンドシーケンス ファンクションシーケンスの 順 番 に 実 行 されます リセットシーケンスでは まず マスタがリセットパルスを 出 力 します 1-Wire バスにスレーブが 接 続 されている 場 合 スレーブはプレゼンスパルスを 出 力 します ROM コマンドシーケンスでは マスタが 8bit の ROM コマンドを 出 力 した 後 64bit の ROM ID を 出 力 します ROM ID の 先 頭 8bit はデバイス 種 類 を 示 すファミリーコードです 続 く 48bit がシリアル ナンバーになっています 最 後 の 8bit は CRC です ROM コマンドには 次 のものがあります 1. SEARCH ROM(0xF0): バスに 接 続 されているスレーブデバイスの ROM ID を 得 ることができま す 1 回 の SEARCH ROM コマンドで 1 つのデバイスの ROM ID を 特 定 することができます 2. READ ROM(0x33): バスに 接 続 されているスレーブデバイスが 一 つだけの 場 合 SEARCH ROM コマンドの 代 わりに READ ROM コマンドを 使 用 して ROM ID を 得 ることができます 38

3. MATCH ROM(0x55): MATCH ROM コマンドでマスタが 出 力 した ROM ID に 一 致 したスレー ブデバイスが 続 くファンクションコマンドに 応 答 します それ 以 外 のデバイスは 次 のリセッ トシーケンスを 待 ちます 4. SKIP ROM(0xcc): SKIP ROM コマンドに 続 いて 送 信 されたファンクションコマンドは バスに 接 続 されているスレーブデバイス 全 てに 同 時 に 適 用 されます ファンクションシーケンスは スレーブデバイスごとに 異 なります 基 本 的 には マスタが 8bit のフォ ワードコマンド 出 力 した 後 データの 読 み 出 しまたは 書 き 込 みをおこないます 2.4.2. DS18B20 図 2.48 1-Wire プロトコル 今 回 使 用 する 温 度 センサ DS18B20 は 以 下 の 特 長 を 持 ちます 1. 単 一 電 源 (3.0V から 5.5V) 動 作 2. 電 源 は 信 号 線 から 供 給 可 能 3. 外 部 部 品 不 要 4. 温 度 計 測 範 囲 -55 から+125 5. 分 解 能 9bit から 12bit 6. 変 換 時 間 750msec( 最 大 12bit 時 ) DS18B20 のファンクションコマンドには 以 下 のものがあります 1. CONVERT T(0x44): このコマンドにより 温 度 変 換 がおこなわれます 変 換 結 果 は DS18B20 の 内 蔵 2 バイトレジスタに 格 納 されます 2. WRITE SCRATCHPAD(0x48): DS18B20 の 内 蔵 メモリに 書 き 込 みをおこないます 書 き 込 む データは 3 バイト 長 で T H T L Configuration Register の 順 番 に 送 信 します 3. READ SCRATCHPAD(0xbe): DS18B20 の 内 蔵 メモリを 読 み 出 します 読 み 出 すデータのバイ ト 数 は 最 大 9 バイトです 途 中 で マスタからリセットパルスを 送 信 することで データの 読 み 出 しを 中 断 できます DS18B20 内 蔵 レジスタは 次 のようになっています バイト 表 2.5 DS18B20 内 蔵 レジスタ 内 容 0 Temperature Register LSB 39

バイト 内 容 1 Temperature Register MSB 2 T H or User Byte 1 3 T L or User Byte 2 4 Configuration Register 5 Reserved (0xff) 6 Reserved 7 Reserved (0x10) 8 CRC DS18B20 の 温 度 センサ 分 解 能 は Configuration Register の 5bit 目 と 6 ビット 目 で 決 まります それ 以 外 の Configuration Register のビットは 内 部 的 に 使 用 され 上 書 きすることはできません 表 2.6 DS18B20 温 度 センサ 分 解 能 [a] パワーオンリセット 時 の 設 定 BIT 6 BIT 5 分 解 能 0 0 9 bit 0 1 10 bit 1 0 11 bit 1 1 12 bit [a] Temperature Register のフォーマットは 次 のようになっています 温 度 は 摂 氏 で 格 納 されています 12 ビット 分 解 能 の 場 合 は BIT10 から BIT0 全 てのビットが 有 効 です 11 ビット 分 解 能 の 場 合 BIT0 が 不 定 となります 10 ビット 9 ビット 分 解 能 の 場 合 も 同 様 です BIT15 から BIT11 は 温 度 が 正 の 場 合 0 負 の 場 合 1 となります 2.4.3. サンプル 回 路 図 2.49 DS18B20 Temperature Register フォーマット Armadillo-400 シリーズと 温 度 センサとの 接 続 を 図 2.50. 1-Wire 接 続 温 度 センサ 回 路 図 に 示 し ます 信 号 線 は CON9 2 ピンに 接 続 します また 今 回 は VDD に+3.3V を 接 続 し 電 源 は 外 部 から 供 給 します 40

2.4.4. 温 度 センサドライバー 図 2.50 1-Wire 接 続 温 度 センサ 回 路 図 一 般 的 に 1-Wire 接 続 のデバイスを Linux システムで 使 用 する 場 合 1-Wire スレーブデバイス 用 の デバイスドライバーを 作 成 して デバイスの 制 御 をおこないます 今 回 は 1-Wire スレーブデバイスド ライバーの Thermal family implementation を 使 用 します Thermal family implementation を 使 用 すると 1-Wire バスに 接 続 された 温 度 センサデバイスを 自 動 で 検 出 し sysfs 経 由 で 温 度 データの 読 み 出 しを 可 能 にします 41

[armadillo ~]# cd /sys/devices/w1_bus_master1/ [armadillo /sys/devices/w1_bus_master1]# ls 28-0000022e2355/ w1_master_name driver@ w1_master_pointer power/ w1_master_search subsystem@ w1_master_slave_count uevent w1_master_slaves w1_master_attempts w1_master_timeout w1_master_max_slave_count [armadillo /sys/devices/w1_bus_master1]# cat 28-0000022e2355/w1_slave c4 01 4b 46 7f ff 0c 10 3b : crc=3b YES c4 01 4b 46 7f ff 0c 10 3b t=28250 c3 01 4b 46 7f ff 0d 10 2f : crc=2f YES c3 01 4b 46 7f ff 0d 10 2f t=28187 図 2.51 1-Wire 接 続 温 度 センサドライバーの 使 用 例 /sys/devices/w1_bus_master1/が 1-Wire に 関 連 する sysfs ディレクトリです Thermal family implementation が 有 効 になっていて スレーブデバイスが 検 出 されると 28-0000022e2355 のように デバイスの ROM ID に 対 応 したディレクトリが 作 成 されます その 中 の w1_slave を 読 み 出 すと ドライ バーは CONVERT T コマンドを 実 行 したあと READ SCRATCHPAD コマンドを 実 行 し DS18B20 の 内 蔵 レジスタを 表 示 します crc=xx YES で CRC が 一 致 したことを 表 します また t=28250 は 温 度 ( 摂 氏 )を 1000 倍 した 値 を 示 します 1 度 の 読 み 出 しで 2 回 分 の 変 換 結 果 を 表 示 します 2.4.5. カーネルコンフィギュレーション Armadillo-400 シリーズの 標 準 のカーネルでは 1-Wire ドライバーは 有 効 になっていません そのた め 1-Wire マスタドライバーと Thermal familyimplementation ドライバーが 有 効 になったカーネ ルを 作 成 する 必 要 があります まず カーネルのソースコードアーカイブを 取 得 します ここでは Armadillo サイトからダウンロー ドしてくることにします [ATDE ~]$ wget http://armadillo.atmark-techno.com/files/downloads/armadillo-4x0/source/kernel/ linux-3.14-at[version].tar.gz [ATDE ~]$ tar xzvf linux-3.14-at[version].tar.gz 図 2.52 Linux カーネルの 取 得 と 展 開 次 に Armadillo-400 シリーズの 標 準 コンフィギュレーションを 適 用 します [ATDE ~]$ cd linux-3.14-at[version]/ [ATDE ~/linux-3.14-at[version]]$ make ARCH=arm armadillo4x0_defconfig 図 2.53 Linux カーネルに Armadillo-400 シリーズ 標 準 コンフィギュレーションを 適 用 する 続 いて menuconfig を 使 用 して 図 2.55. 1-Wire ドライバーを 有 効 にする に 示 すようにカーネ ルコンフィギュレーションを 変 更 します 42

[ATDE ~/linux-3.14-at[version]]$ make ARCH=arm menuconfig 図 2.54 menuconfig を 使 用 してカーネルコンフィギュレーションを 変 更 する Linux Kernel Configuration System Type ---> Freescale i.mx support ---> Armadillo-400 Board options ---> [*] Enable one wire at CON9_2 チェックを 入 れる Device Drivers ---> <*> Dallas's 1-wire support ---> チェックを 入 れる 1-wire Bus Masters ---> <*> Freescale MXC 1-wire busmaster チェックを 入 れる 1-wire Slaves ---> <*> Thermal family implementation チェックを 入 れる 図 2.55 1-Wire ドライバーを 有 効 にする コンフィギュレーションの 変 更 をおこなったら カーネルをビルドします [ATDE ~/linux-3.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- && gzip -c arch/ arm/boot/image > linux.bin.gz 図 2.56 Linux カーネルをビルドする 正 常 にビルドが 完 了 すると linux-3.14-at[version]/linux.bin.gz にカーネルイメージが 作 成 されま す linux.bin.gz を Armadillo のフラッシュメモリのカーネル 領 域 に 書 き 込 んでください 図 2.50. 1-Wire 接 続 温 度 センサ 回 路 図 に 示 すように Armadillo と DS18B20 を 接 続 してから Armadillo を 起 動 し 図 2.51. 1-Wire 接 続 温 度 センサドライバーの 使 用 例 に 示 す 手 順 で 動 作 確 認 を おこなってください 2.5. CAN Armadillo-400 シリーズでは CON14 を CAN バスとして 使 用 することができます ここでは Armadillo 同 士 を CAN で 接 続 する 方 法 を 紹 介 します 使 用 するソフトウェア デバイスは 以 下 のとおりです 1. Linux カーネル: linux-3.14-at4 以 降 2. ユーザーランド: Atmark Dist v20151026 以 降 3. ネットワークおよびトラッフィック 制 御 ツール: iproute2 (Atmark Dist に 含 まれるもの) 4. CAN 通 信 プログラム: can-utils (Atmark Dist に 含 まれるもの) 5. CAN トランシーバー: AMIS-42673(ON Semiconductor 社 製 ) 43

2.5.1. CAN 概 要 CAN(Controller Area Network)は 機 器 間 のデータ 転 送 に 使 われる 2 線 差 動 電 圧 式 の 通 信 方 式 で す 差 動 電 圧 式 を 採 用 しているため 耐 ノイズ 性 に 優 れる 点 や エラー 検 出 方 法 と 検 出 後 の 動 作 が 明 確 化 されているといった 特 長 から 比 較 的 信 頼 性 の 求 められるネットワークに 用 いられます CAN では CAN+と CAN-の 2 本 の 信 号 線 間 の 電 圧 差 を 変 化 させることで 通 信 をおこないます この 2 本 の 信 号 線 に 複 数 のノード( 機 器 )を 接 続 し バスを 構 成 します CAN の 物 理 的 な 仕 様 に 関 連 する 規 格 には 通 信 速 度 が 125kbps までの 低 速 CAN(ISO1159-2) 通 信 速 度 125kbps から 1Mbps の 高 速 CAN(ISO11898-2)など 様 々なものがあります 一 般 的 に CAN のノードは 物 理 層 の 処 理 をおこなう CAN トランシーバとその 後 のデータ 処 理 をおこなう CAN コントローラから 構 成 されます 今 回 の 例 で は CAN コントローラは i.mx25 内 蔵 の FlexCAN コントローラを 使 用 し CAN トランシーバには ISO 11898-2 に 対 応 した AMIS-42673 を 使 用 します CAN プロトコルでは CAN+と CAN- 間 の 電 圧 差 を RS-232C 通 信 のようにあらかじめ 決 められた 通 信 速 度 (ビットレート)に 従 って 変 化 させることで データの 転 送 をおこないます 転 送 される 各 ビット は ドミナントかリセッシブのいずれかの 状 態 を 取 ります 高 速 CAN では CAN+と CAN-の 電 圧 差 が ある 場 合 ドミナント 無 い 場 合 リセッシブとなります 通 常 ドミナントを 論 理 0 リセッシブを 論 理 1 として 扱 います CAN はマルチマスタ 構 成 のため 複 数 のデバイスが 同 時 に 通 信 をおこない バス 上 で データの 衝 突 がおこる 場 合 があります この 場 合 どれか 一 つのノードがドミナントを 出 力 していた 場 合 バスの 状 態 はドミナントとなります(ドミナントがリセッシブに 対 して 優 先 される) CAN では こ の 特 性 を 利 用 して 調 停 をおこないます データの 転 送 は フレームという 単 位 でおこないます フレームには 表 2.7. CAN プロトコルフ レーム に 示 す 4 つの 種 類 があります 表 2.7 CAN プロトコルフレーム 名 称 データフレーム リモートフレーム オーバーロードフレーム エラーフレーム 機 能 データを 送 信 する データフレームを 要 求 する 前 回 のフレーム 処 理 が 完 了 していないことを 通 知 する エラーが 発 生 したことを 通 知 する データフレームとリモートフレームを 合 わせて メッセージフレームといいます CAN では ノード ごとのアドレスというものはなく その 代 わりにそれぞれのメッセージが 固 有 な ID( 識 別 子 Identifier) を 持 っています 受 信 ノードは ID によって 自 分 が 処 理 すべきメッセージかどうか 判 断 します メッ セージに 含 まれる ID の 長 さによって メッセージフレームには 標 準 フォーマット(11bit 長 )と 拡 張 フォー マット(29bit 長 )の 2 種 類 の 形 式 があります データフレームの 形 式 を 図 2.57. CAN プロトコル(データフレーム) に 示 します 上 の 線 はリセッ シブを 下 の 線 はドミナントを 意 味 します データフレームは データを 送 信 するノードがバスをドミ ナントにすることから 始 まります これをスタート オブ フレーム(SOF)と 呼 びます SOF に 続 き アービトレーションフィールド(ARBI) コントロールフィールド(CONT) データフィールド(DATA) CRC フィールド(CRC)が 順 に 送 信 されます 続 いて 受 信 ノードは ACK フィールド(ACK)を 送 信 しま す 最 後 に 7 ビット 分 バスをリセッシブに 保 ちエンド オブ フレーム(EOF)とします 44