드라이버 디버깅 로그를 통해 WiFi 동작 시퀀스를 이해하는 것을 목적으로 한다. 여기서는 Scan 동작 시에 드라이버 및 펌웨어의 동작을 분석한다.
참고로 여기서 설명하는 것은 8887 기준이다.
디버깅 로그 켜기
여기서 살펴볼 디버깅 로그는 아래와 같은 방법으로 얻었다.
#insmod mlan.ko #insmod sd8xxx.ko #iwpriv mlan0 drvdbg -1
모든 디버깅 메세지를 enable 하고, scan 명령을 내린다.
#iwlist mlan0 scan or #wpa_cli scan #dmesg > /tmp/scan_log
시퀀스 분석
- MLAN 드라이버에 ioctl 명령을 보냄(총 3번) : id, sub_id 를 확인하기 위해 mlan/mlan_ioctl.h 파일을 참고할 것
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- 첫번째 보낸 ioctl 명령에 대해 pending 함
- Firmware 를 Wake up 시키고 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- PS(Power Save) 모드로부터 깨어났다는 이벤트를 MLAN driver 가 받음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x14
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x14
- 채널 1번 정보 출력(chan=1, noise=-85, total_network=2, scan_duration=195, busy_duration=135)
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 127, seqno 0x15
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x15
- 채널 2번 정보 출력(chan=2, noise=-85, total_network=0, scan_duration=195, busy_duration=135)
- 채널 3번 정보 출력(chan=3, noise=-84, total_network=2, scan_duration=195, busy_duration=135)
- 채널 4번 정보 출력(chan=4, noise=-72, total_network=0, scan_duration=195, busy_duration=135)
- 채널 5번 정보 출력(chan=5, noise=-82, total_network=0, scan_duration=195, busy_duration=72)
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x16
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x16
- 채널 6번 정보 출력(chan=6, noise=-83, total_network=4, scan_duration=195, busy_duration=138)
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x17
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x17
- 채널 7번 정보 출력(chan=7, noise=-82, total_network=1, scan_duration=195, busy_duration=92)
- 채널 8번 정보 출력(chan=8, noise=-79, total_network=0, scan_duration=195, busy_duration=128)
- 채널 9번 정보 출력(chan=9, noise=-85, total_network=0, scan_duration=195, busy_duration=121)
- 채널 10번 정보 출력(chan=10, noise=-89, total_network=1, scan_duration=195, busy_duration=57)
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x18
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x18
- 채널 11번 정보 출력(chan=11, noise=-89, total_network=2, scan_duration=195, busy_duration=74)
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x19
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x19
- 채널 36번 정보 출력(chan=36, noise=-89, total_network=2, scan_duration=195, busy_duration=3)
- 채널 40번 정보 출력(chan=40, noise=-89, total_network=0, scan_duration=195, busy_duration=2)
- 채널 44번 정보 출력(chan=44, noise=-89, total_network=2, scan_duration=195, busy_duration=6)
- 채널 48번 정보 출력(chan=48, noise=-89, total_network=0, scan_duration=195, busy_duration=0)
- 새로운 스캔 결과를 저장하거나 기존의 스캔 결과를 갱신하기 위해 비콘 버퍼를 재할당
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1a
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x1a
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1b
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x1b
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1c
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x1c
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1d
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x1d
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1e
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x1e
- 채널 149번 정보 출력(chan=149, noise=-92, total_network=2, scan_duration=195, busy_duration=3)
- 채널 153번 정보 출력(chan=153, noise=-92, total_network=0, scan_duration=195, busy_duration=0)
- 채널 157번 정보 출력(chan=157, noise=-92, total_network=1, scan_duration=195, busy_duration=2)
- 채널 161번 정보 출력(chan=161, noise=-92, total_network=1, scan_duration=195, busy_duration=1)
- 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
- MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1f
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- 명령어에 대한 응답 : result 0, seqno 0x1f
- SCAN 완료(Completed)
- IOCTL 명령 처리 완료(eedc1100 id=0x10000 sub_id=0x10001, action=1, status=0, status_code=0x0)
- 이벤트(EVENT_ID_DRV_SCAN_REPORT)를 받음 : event id(0x80000009)
- MLAN 드라이버에 ioctl 명령을 보냄(총 4번) : id, sub_id 를 확인하기 위해 mlan/mlan_ioctl.h 파일을 참고할 것
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
- SDIO Card 의 데이터를 읽음
- F/W 로부터 PS(Power Save) sleep event 받음
- Sleep confirm 명령을 firmware 에 보냄
- F/W 로부터 PS sleep confirm 을 받음
- 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0xc0)
- SDIO Card 의 데이터를 읽음
- Sleep confirm 명령어 응답을 받고 호스트(HS) 는 활성화됨
uImage 업데이트 방법
'디'라고 쓰여진 에스디 카드에 커널이미지를 복사한다. 기존의 커널이미지는 이름을 변경한다. 그리고 nx1.bin 파일을 오리 디렉토리로 백업한다.
그리고 보드에 꼽고 전원을 켠다.