안녕하세요. 현재 개발중인 제품에서 usb관련 파트를 맡고 있는데,(스마트폰입니다.)
좀 골치아픈 문제가 발생해서 질문 드립니다.
해당 문제는 아래와 같습니다.
sd카드를 꽂고 데이터 전송중,
otg core reset이라는 로그가 계속적으로 발생합니다.
또한 tethering으로 연결중 uplink downlink 수행시에도 발생을 합니다.
위 로그가 발생하면 usb 초기화 루틴을 수행하면서 데이터 전송에 많은 부하가 걸려서
속도가 느려지게 되고 연결이 끊기는 경우도 생깁니다.
위의 otg core reset log가 위치한 파일의 경로는 다음과 같습니다.
================================================================================================
/kernel/driver/usb/gadget/s3c_udc_otg.c
static int s3c_udc_probe(struct platform_device *pdev) 함수에서
{
request_irq 등록
retval = request_irq(IRQ_OTG,
s3c_udc_irq, 0, driver_name, dev);
}
/kernel/driver/usb/gadget/s3c_udc_otg_xfer_dma.c
/*
*
usb client interrupt handler.
*/
static irqreturn_t s3c_udc_irq(int irq, void *_dev)
{
intr_status = readl(S3C_UDC_OTG_GINTSTS);
gintmsk = readl(S3C_UDC_OTG_GINTMSK);
...중간 소스 생략 ......
if (intr_status & INT_RESET) {
usb_status = readl(S3C_UDC_OTG_GOTGCTL);
DEBUG_ISR("tReset interrupt - (GOTGCTL):0x%xn", usb_status);
writel(INT_RESET, S3C_UDC_OTG_GINTSTS);
set_conf_done = 0;
if ((usb_status & 0xc0000) == (0x3 << 18)) {
if (reset_available) {
// 해당 log가 출력됨
DEBUG_ISR("ttOTG core got reset (%d)!! n", reset_available);
stop_activity(dev, dev->driver);
reconfig_usbd();
dev->ep0state = WAIT_FOR_SETUP;
reset_available = 0;
s3c_udc_pre_setup();
} else
reset_available = 1;
} else {
reset_available = 1;
DEBUG_ISR("ttRESET handling skippedn");
}
}
}
===========================================================================================
위의소스는 오드로이드 오픈소스에서 발췌한 것이며 현 개발 제품과 소스가 동일해 copy해서 발췌하였습니다.
암튼 인터럽트를 정상적으로 수행 하기 위해서는인터럽트 소스 를 지정하고, ISR함수 주소를 해당 레지스터에 기록하고
인터럽트가 발생되면스텍 푸시
백터 테이블에 지정된 번지로 이동, 지정된 번지에 저장된 함수 주소로 점프, ISR 수행,스텍 팝
과정을 수행 합니다.
백터 테이블을 사용한 인터럽트 방식이고, 이 테이블로 VIC의 레지스터를 사용 한다고 여기시면 이해가 빠르시리라 생각 합니다. 실 구현은 좀더 복잡 하지만 이정도로 보셔도 무방할것 같습니다.
s5pc100의 경우 는 사실 살펴 본적이 없어서 이렇다 라고 는 할수 없겠지만 6410및 기타 mcu바탕으로 말씀 드리면대충 이런것 같습니다.