1・ このライブラリは libpasori (http://libpasori.sourceforge.jp/) を再構
2 成し、若干の機能追加などを行なったものです。
3
4・ NFC Reader/Writer Linux Driver ( http://core.dumped.cc/devel/nfc/index.ja.html )
5 および
6 libnfc ( http://www.libnfc.org/ )
7 のソースコードも参考にしています。
8
9・ Sony の PaSoRi RC-S320 および RC-S330 に対応しています。
10
11・ 動作確認などは不十分な状態なので、各自の責任でご利用ください。
12
13
14●コンパイルとインストール
15
16$ ./configure
17$ make
18# make install
19
20
21●Debian パッケージの作成
22$ dpkg-buildpackage -rfakeroot
23
24
25●udev の設定
26
27Debian GNU/Linux wheezy での設定例です。ディストリビューションやバージョ
28ンにより設定が異なる可能性がありますので適宜読み替えて設定を行なってく
29ださい。
30
311. 下記の内容を /lib/udev/rules.d/60-libpafe.rules として保存する。
32
33ACTION!="add", GOTO="pasori_rules_end"
34SUBSYSTEM=="usb_device", GOTO="pasori_rules_start"
35SUBSYSTEM!="usb", GOTO="pasori_rules_end"
36LABEL="pasori_rules_start"
37
38ATTRS{idVendor}=="054c", ATTRS{idProduct}=="006c", MODE="0664", GROUP="plugdev"
39ATTRS{idVendor}=="054c", ATTRS{idProduct}=="01bb", MODE="0664", GROUP="plugdev"
40ATTRS{idVendor}=="054c", ATTRS{idProduct}=="02e1", MODE="0664", GROUP="plugdev"
41
42LABEL="pasori_rules_end"
43
44
45ファイル名は適宜変更してください。
46
472. udevadm control --reload-rules を実行。
48
49
50以上で plugdev グループに属しているユーザは pasori を利用できるようにな
51るはずです。
52
53
54
55●関数リファレンス
56
57pasori *pasori_open(void);
58
59概要
60 デバイスファイルをオープンする。
61
62返り値
63 成功した場合 psori 型のポインタを返す。失敗すると NULL が返される。
64
65
66
67int pasori_init(pasori *p)
68
69概要
70 PaSoRi の初期化を行なう。
71
72引数
73 p pasori_open で取得した psori 型のポインタ。
74
75返り値
76 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
77
78
79
80void pasori_close(pasori *p);
81
82概要
83 pasori_reset() を実行した後、デバイスファイルをクローズする。
84
85引数
86 p pasori_open で取得した psori 型のポインタ。
87
88
89
90int pasori_send(pasori *p, uint8 *data, int *size);
91
92概要
93 PaSoRi にデータを送出する。
94
95引数
96 p pasori_open で取得した psori 型のポインタ。
97 data 送出するデータへのポインタ。
98 size 送出するデータのサイズ。
99
100返り値
101 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
102
103
104int pasori_recv(pasori *p, uint8 *data, int *size);
105
106概要
107 PaSoRi からデータを受け取る。
108
109引数
110 p pasori_open で取得した psori 型のポインタ。
111 data データを格納するバッファへのポインタ。
112 size バッファのサイズへのポインタ。
113
114返り値
115 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
116 size が参照している場所に格納したデータの長さが保存される。
117
118
119
120int pasori_packet_write(pasori *p, uint8 *data, int *size)
121
122概要
123 PaSoRi にコマンドを送出する。内部で pasori_send を呼び出している。
124
125引数
126 p pasori_open で取得した psori 型のポインタ。
127 data 送出するデータへのポインタ。
128 size 送出するデータのサイズへのポインタ。
129
130返り値
131 成功した場合 0 を返す。size が参照している場所に送出したデータの長さ
132 が保存される。失敗すると 0 以外の数値が返される。
133
134
135
136int pasori_packet_read(pasori * p, uint8 * data, int *size);
137
138概要
139 PaSoRi に送出したコマンドへの応答を取得する。内部で pasori_recv を呼
140 び出している。
141
142引数
143 p pasori_open で取得した psori 型のポインタ。
144 data データを格納するバッファへのポインタ。
145 size バッファのサイズへのポインタ。
146
147返り値
148 成功した場合 0 を返す。size が参照している場所に取得したデータの長さ
149 が保存される。失敗すると 0 以外の数値が返される。
150
151
152int pasori_write(pasori *p, uint8 *data, int *size);
153
154概要
155 FeliCa にデータを送信する。内部で pasori_packet_write を呼び出してい
156 る。
157 RC-S320 では PaSoRi2 コマンド 0x5C に対応する。
158
159引数
160 p pasori_open で取得した psori 型のポインタ。
161 data データを格納するバッファへのポインタ。
162 size バッファのサイズへのポインタ。
163
164返り値
165 成功した場合 0 を返す。size が参照している場所に送信したデータの長さ
166 が保存される。失敗すると 0 以外の数値が返される。
167
168
169int pasori_read(pasori *p, uint8 *data, int *size);
170
171概要
172 FeliCa からの応答を受信する。内部で pasori_packet_read を呼び出してい
173 る。
174
175引数
176 p pasori_open で取得した psori 型のポインタ。
177 data データを格納するバッファへのポインタ。
178 size バッファのサイズへのポインタ。
179
180返り値
181 成功した場合 0 を返す。size が参照している場所に格納したデータの長さ
182 が保存される。失敗すると 0 以外の数値が返される。
183
184
185int pasori_reset(pasori * p);
186
187概要
188 RC-S320 では Pasori にリセットコマンドを送出する。(PaSoRi2 コマンド 0x54)
189 RC-S330 では RF Off などの処理を行う。
190
191引数
192 p pasori_open で取得した psori 型のポインタ。
193
194返り値
195 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
196
197
198
199int pasori_version(pasori *p, int *v1, int *v2);
200
201概要
202 Pasori のファームウェアバージョンを取得する。
203
204引数
205 p pasori_open で取得した psori 型のポインタ。
206 v1 バージョンの上位番号を格納するためのポインタ。
207 v2 バージョンの下位番号を格納するためのポインタ。
208
209返り値
210 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
211
212バグ
213 RC-S330 で正しい値が得られているかどうかは未確認。
214
215
216
217int pasori_type(pasori *p);
218
219概要
220 Pasori のタイプを取得する。
221
222引数
223 p pasori_open で取得した psori 型のポインタ。
224
225返り値
226 PASORI_TYPE_S310
227 PASORI_TYPE_S320
228 PASORI_TYPE_S330
229
230 失敗すると -1 が返される。
231
232
233
234int pasori_test(pasori *p, int code, uint8 *data, int *size, uint8 *rdata, int *rsize);
235
236概要
237 RC-S320 のみ有効。
238 Pasori の自己診断を行なう。(PaSoRi2 コマンド 0x52)
239
240引数
241 p pasori_open で取得した psori 型のポインタ。
242 code テストコード
243 data テストデータを格納するバッファへのポインタ。
244 size テストデータバッファのサイズへのポインタ。
245 rdata 応答データを格納するバッファへのポインタ。
246 rsize 応答データバッファのサイズへのポインタ。
247
248
249返り値
250 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
251
252
253
254int pasori_test_echo(pasori *p, uint8 *data, int *size);
255
256概要
257 RC-S320 のみ有効。
258 Pasori のエコーバックテストを行なう。(テストコード 0x00)
259
260引数
261 p pasori_open で取得した psori 型のポインタ。
262 data テストデータを格納するバッファへのポインタ。
263 size テストデータバッファのサイズへのポインタ。
264
265返り値
266 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
267
268
269
270int pasori_test_eprom(pasori *p);
271
272概要
273 RC-S320 のみ有効。
274 Pasori の EPROM テストを行なう。(テストコード 0x01)
275
276引数
277 p pasori_open で取得した psori 型のポインタ。
278
279返り値
280 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
281
282
283
284int pasori_test_ram(pasori *p);
285
286概要
287 RC-S320 のみ有効。
288 Pasori の RAM テストを行なう。(テストコード 0x02)
289
290引数
291 p pasori_open で取得した psori 型のポインタ。
292
293返り値
294 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
295
296
297
298int pasori_test_cpu(pasori *p);
299
300概要
301 RC-S320 のみ有効。
302 Pasori の CPU テストを行なう。(テストコード 0x03)
303
304引数
305 p pasori_open で取得した psori 型のポインタ。
306
307返り値
308 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
309
310
311
312int pasori_test_polling(pasori *p);
313
314概要
315 RC-S320 のみ有効。
316 Pasori のポーリングテストを行なう。(テストコード 0x10)
317
318引数
319 p pasori_open で取得した psori 型のポインタ。
320
321返り値
322 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
323
324
325
326void pasori_set_timeout(pasori *p, int timeout);
327
328概要
329 タイムアウトを設定する。
330
331引数
332 p pasori_open で取得した psori 型のポインタ。
333 timeout timeout の値 (usb_control_msg() で使用される)。
334
335
336
337felica *felica_polling(pasori *p, uint16 systemcode, uint8 RFU, uint8 timeslot);
338
339概要
340 REQC (リクエストコマンド C 型) を送信し、以降の通信で必要なデータを取
341 得する。
342
343引数
344 p pasori_open で取得した psori 型のポインタ。
345 systemcode システムコード
346 FELICA_POLLING_ANY 全てのシステムが反応する
347 FELICA_POLLING_SUICA Suica
348 FELICA_POLLING_EDY Edy
349 RFU 予備 (通常は 0 を指定)
350 timeslot タイムスロットの最大値を指定する。詳細は JIS X 6319-4 を参照のこと。
351
352返り値
353 成功した場合 felica 型のポインタを返す。返された felica 型のポインタ
354 は不要になったときに free(3) で開放する必要がある。 失敗すると NULL
355 が返される。
356
357
358
359int felica_get_idm(felica *f, uint8 *idm);
360
361概要
362 IDm (製造識別子) を取得する。
363
364引数
365 f felica_polling で取得した felica 型のポインタ。
366 idm IDm を格納するためのポインタ。
367
368返り値
369 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
370
371
372
373int felica_get_pmm(felica *f, uint8 *pmm);
374
375概要
376 PMm (製造パラメタ) を取得する。
377
378引数
379 f felica_polling で取得した felica 型のポインタ。
380 pmm PMm を格納するためのポインタ。
381
382返り値
383 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
384
385
386
387int felica_read(felica * f, int *n, felica_block_info *info, uint8 *data);
388
389概要
390 Read コマンドを送信する。
391
392引数
393 f felica_polling で取得した felica 型のポインタ。
394 n ブロック数へのポインタ。
395 info サービスコードリスト。
396 data 応答データを格納するバッファへのポインタ。
397
398返り値
399 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
400
401バグ
402 RC-S330 では動作未確認。
403
404
405int felica_read_single(felica * f, int servicecode, int mode, uint8 block, uint8 *data);
406
407概要
408 Read コマンドを送信する。ブロック数は 1 に固定。
409
410引数
411 f felica_polling で取得した felica 型のポインタ。
412 mode アクセスモード
413 0 直接アクセス
414 循環順編成アクセス
415 減算アクセス
416 1 戻入れアクセス
417 block ブロック番号
418 data 応答データを格納するバッファへのポインタ。
419
420返り値
421 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
422
423
424
425int felica_write(felica *f, int servicecode, int mode, uint8 addr, uint8 *data);
426
427未実装
428
429
430
431int felica_request_service(felica *f, int *n, uint16 *list, uint16 *data);
432
433概要
434 Request Service コマンドを送信する。
435
436引数
437 f felica_polling で取得した felica 型のポインタ。
438 n ブロック数へのポインタ。
439 list サービスコードリストまたはエリアコードリスト。
440 data 応答データを格納するバッファへのポインタ。
441
442返り値
443 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
444
445バグ
446 RC-S330 では動作未確認。
447
448
449int felica_request_response(felica *f, uint8 *mode);
450
451概要
452 Request Response コマンドを送信する。現在のモードを調べる。
453
454引数
455 f felica_polling で取得した felica 型のポインタ。
456 mode モードを格納するためのポインタ。
457
458返り値
459 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
460
461バグ
462 RC-S330 では動作未確認。
463
464
465int felica_search_service(felica *f);
466
467概要
468 0xffffがサービスコードとして返却されるまで Search Service Code コマン
469 ドを送信する。
470 取得されたサービスコードまたはエリアコードの数は
471
472 f->area_num, f->service_num
473
474 に設定されます。 それぞれのサービスコードまたはエリアコードは
475
476 f->area[n].code, f->area[n].attr, f->area[n].bin
477 f->service[n].code, f->service[n].attr, f->service[n].bin
478
479 で参照できます。code はサービス番号またはサービスファイルの最小ファイ
480 ル識別子、attr はアクセス制御処理区分、 bin はファイル識別子全体を表
481 します。
482
483引数
484 f felica_polling で取得した felica 型のポインタ。
485
486返り値
487 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
488
489
490
491int felica_request_system(felica *f, int *n, uint16 *data);
492
493概要
494 Request System Code コマンドを送信する。FeliCa のもつシステムコードの
495 リストを得る。
496
497引数
498 f felica_polling で取得した felica 型のポインタ。
499 data 応答データを格納するバッファへのポインタ。
500
501返り値
502 成功した場合 0 を返す。失敗すると 0 以外の数値が返される。
503
504
505
506定数
507
508FELICA_IDM_LENGTH IDm のサイズ
509FELICA_PMM_LENGTH PMm のサイズ
510FELICA_BLOCK_LENGTH ブロックのサイズ
511
512
513
514戻り値
515
516PASORI_ERR_PARM 引数に誤りがある。
517PASORI_ERR_MEM メモリの確保に失敗した。
518PASORI_ERR_COM 通信エラー。
519PASORI_ERR_DATA データに異常がある。
520PASORI_ERR_CHKSUM チェックサムに失敗した。
521PASORI_ERR_FORMAT コマンドの形式が異常。
522PASORI_ERR_TYPE 未対応のハードウェア。
523
524
525●連絡先
526
527ZXB01226@nifty.com (オリジナルソースコード)
528rfujita@redhat.com (RPM化及びバージョン0.0.7をベースにしたgit化)