오늘은 RFID를 활용한 디바이스 드라이버 구현에 대해 정리하는 시간을 가져보도록 하겠습니다 . 개인적으로는 stm을 활용한 모듈 , 라이브러리 제작 보다 리눅스 디바이스 드라이버를 만드는 과정이 더 어렵게 느껴졌습니다 .
순서
1. python 센서 동작 확인
2. user space 동작 확인
3. kernel space 디바이스 드라이버 구현
4. 데몬 프로세스 전환 및 통신 확인 .
으로 개발을 진행했습니다.
src/rc522_full_demo.c와 src/rc522_full.c가 MFRC522 데이터시트의 어떤 동작/규칙을 근거로 구현되었는지 정리한다.
참고:
SZH-EK0404.pdf 파일은 현재 확인되지 않았다.src/rc522_full.c (핵심 프로토콜/레지스터 구현)src/rc522_full_demo.c (CLI 데모/사용자 인터페이스)src/rc522_full.h (공개 API)데이터시트 근거:
addr는 (addr << 1) & 0x7E 형태코드 매핑:
rc522c_write_reg()에서 (addr << 1) & 0x7Erc522c_read_reg()에서 ((addr << 1) & 0x7E) | 0x80검토 결과:
데이터시트 근거:
CommandReg에 PCD_RESETPHASE(0x0F)로 소프트리셋코드 매핑:
rc522c_reset():CommandReg <- PCD_RESETPHASErc522c_init_chip():TModeReg=0x8DTPrescalerReg=0x3ETReloadRegL/H=30/0TxAutoReg=0x40ModeReg=0x3DTxControlReg bit0/1 set로 안테나 ON검토 결과:
mfrc522 계열 구현과도 정렬됨.ToCard)데이터시트 근거:
BitFramingReg StartSend bit 제어CommIrqReg/ErrorReg로 완료/에러 판정FIFOLevelReg와 ControlReg(lastBits)로 수신 비트 길이 계산코드 매핑:
rc522c_to_card():CommIEnReg, CommIrqReg, FIFOLevelReg, CommandReg 사용PCD_TRANSCEIVE 시 BitFramingReg bit7 set/clearErrorReg & 0x1B 검사back_bits = (fifo-1)*8 + lastBits 계산검토 결과:
데이터시트 근거:
PICC_REQIDL(0x26) 전송BitFramingReg=0x07)코드 매핑:
rc522c_request():BitFramingReg=0x07req_mode 1바이트 전송back_bits == 0x10 조건 확인검토 결과:
데이터시트 근거:
[0x93, 0x20] 전송코드 매핑:
rc522c_anticoll():PICC_ANTICOLL, 0x20 전송back_bits == 40 확인uid[0..3] XOR == uid[4] BCC 검증검토 결과:
데이터시트 근거:
0x93 0x70 + UID(5) + CRC_A(2)코드 매핑:
rc522c_select_tag():rc522c_calculate_crc()로 CRC 생성0x18 확인 후 SAK 반환검토 결과:
데이터시트 근거:
PICC_AUTHENT1A(0x60) 또는 1B(0x61)Status2Reg.MFCrypto1On 확인코드 매핑:
rc522c_authenticate():PCD_AUTHENT 실행Status2Reg & 0x08 체크검토 결과:
데이터시트 근거:
[PICC_READ(0x30), block] + CRC_A코드 매핑:
rc522c_read_block():back_bits >= 128 최소 조건 확인검토 결과:
데이터시트 근거:
[PICC_WRITE(0xA0), block] + CRC_A0x0A16-byte data + CRC_A0x0A) 확인코드 매핑:
rc522c_write_block():back_bits == 4 및 (ack & 0x0F) == 0x0A 검사검토 결과:
데이터시트 근거:
MFCrypto1On clear 필요코드 매핑:
rc522c_stop_crypto1()에서 Status2Reg bit3 clear검토 결과:
rc522_full_demo.c 리뷰구현 개요:
--id: UID만 출력 (rc522c_read_id_blocking)rc522c_read_text_sector_blocking)--write: 섹터 텍스트 쓰기 (rc522c_write_text_sector_blocking)--ch, --speed, --rst로 환경 파라미터 조정 가능장점:
주의:
--trailer 값 유효성은 라이브러리에서 추가 검증한다.1) Select 결과 미검증
rc522c_read_text_sector_blocking(), rc522c_write_text_sector_blocking()rc522c_select_tag(uid5) 반환값(SAK)을 검사하지 않음<=0이면 즉시 실패 처리2) 무한 블로킹 정책
rc522c_read_id_blocking(), read/write blocking 루프*_timeout_ms)3) 기본 키(A=FF..FF) 고정
4) 문자열 변환 단순 복사
rc522c_read_text_sector_blocking()5) 응답 CRC 검증 생략
SZH-EK0404.pdf 동기화 후 아래 표에 페이지/섹션 번호를 넣으면 문서 완성도가 높아진다.
| 코드 항목 | 데이터시트 키워드 | PDF 페이지/섹션 |
|---|---|---|
| SPI read/write 프레임 | SPI interface, address byte format | TODO |
CommandReg reset/init | PCD_RESETPHASE, initialization | TODO |
rc522c_request | REQA/WUPA, 7-bit frame | TODO |
rc522c_anticoll | Anti-collision CL1, BCC | TODO |
rc522c_select_tag | Select command, SAK | TODO |
rc522c_authenticate | MIFARE auth A/B, Crypto1 | TODO |
rc522c_read_block | MIFARE Read command | TODO |
rc522c_write_block | MIFARE Write + 4-bit ACK | TODO |
rc522c_stop_crypto1 | MFCrypto1On bit clear | TODO |
rc522_full.c 구현은 MFRC522/MIFARE Classic 핵심 프로토콜(REQA, anticoll, select, auth, read/write, ACK 규칙)에 대체로 잘 맞는다.