드라이버 디버깅 로그를 통해 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

시퀀스 분석

  1. MLAN 드라이버에 ioctl 명령을 보냄(총 3번) : id, sub_id 를 확인하기 위해 mlan/mlan_ioctl.h 파일을 참고할 것
  2. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  3. 첫번째 보낸 ioctl 명령에 대해 pending 함
  4. Firmware 를 Wake up 시키고 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  5. SDIO Card 의 데이터를 읽음
  6. PS(Power Save) 모드로부터 깨어났다는 이벤트를 MLAN driver 가 받음
  7. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x14
  8. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  9. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  10. SDIO Card 의 데이터를 읽음
  11. 명령어에 대한 응답 : result 0, seqno 0x14
  12. 채널 1번 정보 출력(chan=1, noise=-85, total_network=2, scan_duration=195, busy_duration=135)
  13. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  14. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 127, seqno 0x15
  15. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  16. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  17. SDIO Card 의 데이터를 읽음
  18. 명령어에 대한 응답 : result 0, seqno 0x15
  19. 채널 2번 정보 출력(chan=2, noise=-85, total_network=0, scan_duration=195, busy_duration=135)
  20. 채널 3번 정보 출력(chan=3, noise=-84, total_network=2, scan_duration=195, busy_duration=135)
  21. 채널 4번 정보 출력(chan=4, noise=-72, total_network=0, scan_duration=195, busy_duration=135)
  22. 채널 5번 정보 출력(chan=5, noise=-82, total_network=0, scan_duration=195, busy_duration=72)
  23. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  24. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x16
  25. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  26. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  27. SDIO Card 의 데이터를 읽음
  28. 명령어에 대한 응답 : result 0, seqno 0x16
  29. 채널 6번 정보 출력(chan=6, noise=-83, total_network=4, scan_duration=195, busy_duration=138)
  30. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  31. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x17
  32. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  33. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  34. SDIO Card 의 데이터를 읽음
  35. 명령어에 대한 응답 : result 0, seqno 0x17
  36. 채널 7번 정보 출력(chan=7, noise=-82, total_network=1, scan_duration=195, busy_duration=92)
  37. 채널 8번 정보 출력(chan=8, noise=-79, total_network=0, scan_duration=195, busy_duration=128)
  38. 채널 9번 정보 출력(chan=9, noise=-85, total_network=0, scan_duration=195, busy_duration=121)
  39. 채널 10번 정보 출력(chan=10, noise=-89, total_network=1, scan_duration=195, busy_duration=57)
  40. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  41. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x18
  42. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  43. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  44. SDIO Card 의 데이터를 읽음
  45. 명령어에 대한 응답 : result 0, seqno 0x18
  46. 채널 11번 정보 출력(chan=11, noise=-89, total_network=2, scan_duration=195, busy_duration=74)
  47. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  48. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x19
  49. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  50. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  51. SDIO Card 의 데이터를 읽음
  52. 명령어에 대한 응답 : result 0, seqno 0x19
  53. 채널 36번 정보 출력(chan=36, noise=-89, total_network=2, scan_duration=195, busy_duration=3)
  54. 채널 40번 정보 출력(chan=40, noise=-89, total_network=0, scan_duration=195, busy_duration=2)
  55. 채널 44번 정보 출력(chan=44, noise=-89, total_network=2, scan_duration=195, busy_duration=6)
  56. 채널 48번 정보 출력(chan=48, noise=-89, total_network=0, scan_duration=195, busy_duration=0)
  57. 새로운 스캔 결과를 저장하거나 기존의 스캔 결과를 갱신하기 위해 비콘 버퍼를 재할당
  58. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  59. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1a
  60. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  61. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  62. SDIO Card 의 데이터를 읽음
  63. 명령어에 대한 응답 : result 0, seqno 0x1a
  64. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  65. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1b
  66. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  67. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  68. SDIO Card 의 데이터를 읽음
  69. 명령어에 대한 응답 : result 0, seqno 0x1b
  70. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  71. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1c
  72. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  73. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  74. SDIO Card 의 데이터를 읽음
  75. 명령어에 대한 응답 : result 0, seqno 0x1c
  76. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  77. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1d
  78. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  79. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  80. SDIO Card 의 데이터를 읽음
  81. 명령어에 대한 응답 : result 0, seqno 0x1d
  82. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  83. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1e
  84. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  85. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  86. SDIO Card 의 데이터를 읽음
  87. 명령어에 대한 응답 : result 0, seqno 0x1e
  88. 채널 149번 정보 출력(chan=149, noise=-92, total_network=2, scan_duration=195, busy_duration=3)
  89. 채널 153번 정보 출력(chan=153, noise=-92, total_network=0, scan_duration=195, busy_duration=0)
  90. 채널 157번 정보 출력(chan=157, noise=-92, total_network=1, scan_duration=195, busy_duration=2)
  91. 채널 161번 정보 출력(chan=161, noise=-92, total_network=1, scan_duration=195, busy_duration=1)
  92. 명령어 큐(QUEUE_CMD)에 스캔 명령어(0x6)를 넣음
  93. MLAN driver 가 firmware 에 명령어를 다운로드함(Data 를 SDIO Card 로 보냄) : 0x6(cmd code), act 0x3, len 106, seqno 0x1f
  94. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x80)
  95. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  96. SDIO Card 의 데이터를 읽음
  97. 명령어에 대한 응답 : result 0, seqno 0x1f
  98. SCAN 완료(Completed)
  99. IOCTL 명령 처리 완료(eedc1100 id=0x10000 sub_id=0x10001, action=1, status=0, status_code=0x0)
  100. 이벤트(EVENT_ID_DRV_SCAN_REPORT)를 받음 : event id(0x80000009)
  101. MLAN 드라이버에 ioctl 명령을 보냄(총 4번) : id, sub_id 를 확인하기 위해 mlan/mlan_ioctl.h 파일을 참고할 것
  102. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0x40)
  103. SDIO Card 의 데이터를 읽음
  104. F/W 로부터 PS(Power Save) sleep event 받음
  105. Sleep confirm 명령을 firmware 에 보냄
  106. F/W 로부터 PS sleep confirm 을 받음
  107. 이에 대한 응답으로 인해 MLAN driver ISR 이 호출됨(wlan_interrupt : sdio_ireg = 0xc0)
  108. SDIO Card 의 데이터를 읽음
  109. Sleep confirm 명령어 응답을 받고 호스트(HS) 는 활성화됨

uImage 업데이트 방법

'디'라고 쓰여진 에스디 카드에 커널이미지를 복사한다. 기존의 커널이미지는 이름을 변경한다. 그리고 nx1.bin 파일을 오리 디렉토리로 백업한다.
그리고 보드에 꼽고 전원을 켠다.

  • computer/marvell/동작_분석_-_scan.txt
  • Last modified: 3 years ago
  • by likewind