====== 동작 분석 - scan ====== 드라이버 디버깅 로그를 통해 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 파일을 오리 디렉토리로 백업한다. 그리고 보드에 꼽고 전원을 켠다. ---- {{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}} ----