기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
USB 드라이버를 공부하고 있습니다.
일반적으로 Device에서 Host로 512Byte만큼 100번 Bulk 모드로 전송했다면,
Host에서 받을 때 512만큼 100번 받는다고 생각할 수 있는데요
512가 아닌 사이즈를 받는 건 무슨 상황인가요?
예를들어 512, 512, 512, 490, 498, 512, 512..... 이렇게 전송이 될 때가 있습니다.
이 상황을 데이터가 손실됐다고 보고 재전송해야 하는 것인지
아니면 이어받기를 해서 다 받아서 써도 되는 것인지 궁금합니다.
직접 해보는 것이 가장 정확하겠지만 여건이 안되서 질문 남깁니다.
감사합니다.
usb 는 host-device 통신을 호스트가 주관합니다. 다시 말해 호스트가 디바이스 쪽으로
데이터 요청(IN Packet)을 던지면 디바이스 쪽에서는 bulk in 인터럽트가 뜨게 됩니다.
디바이스 bulk-in isr 에서 IN Endpoint에 데이터를 실어주면(LoadInEp) 호스트로 전송이 됩니다.
전송되는 패킷 크기는 디바이스의 descriptor 설정에서 정해주게 되며
전송 방식(bulk, interrupt... )과 full/high speed에 따라 달라집니다.
호스트 프로그램에서 bulk_read를 하게 되면 드라이버에서 endpoint 크기로 쪼개서
IN packet을 디바이스 쪽으로 내리게 됩니다.
예를 들어 IN endpoint size가 64 바이트로 설정되었고 호스트에서 bulk_read(128바이트)를 하게 되면
IN Packet <- 64 byte load
IN Packet <- 64 byte load
이렇게 두번의 IN Packet을 통해 128 바이트를 전송받게 됩니다.
제가 예전에 확인한 내용으로는 디바이스에서는 IN packet이 내려왔을 때(bulk-in interrupt)
호스트가 몇바이트의 데이터를 요청했는 지 알 수 없었습니다. endpoint 크기 만큼 IN-Endpoint에
데이터를 로드하면 호스트 디바이스 드라이버에서 처리를 하는 것 같았습니다.
호스트가 bulk_read(245바이트)를 하게 되면
IN Packet <- 64 byte load
IN Packet <- 64 byte load
IN Packet <- 64 byte load
IN Packet <- 64 byte load---> 호스트 디바이스 드라이버에서 53 바이트만 취함
따라서 위에서 말씀하신 상황은
1. 디스크립터의 endpoint 크기
2. 호스트에서 bulk_read 시 크기
3. 디바이스 펌웨어에서 실제로 로드하는 크기
등등을 살펴봐야 할것 같습니다.
저도 오래전에 디바이스을 하면서 본거라 기억이 가물가물 거리고 글로 설명하기가 힘드네요. ㅠㅠ