안녕하세요...

현재 PXA-255로 보드를 만들어 디버깅하는 중인데요..

저희 보드 스펙이 UART가 콘솔포함해서 7개거든요..

CPU 내부의 3개외에 여분의 4개 UART가 필요해서

4채널짜리 16C554 UART를 달았습니다..

어드레스는 554의 A0, A1, A2 에 각각 CPU의 A2, A3, A4를 붙였구요...

칩셀렉도 디코딩칩을 이용해서 충분히 넓은 어드레스 공간을 할당하였습니다..

drivers/char/serial.c 를 보니까 include/asm/arch/serial.h 파일안에 아래와 같이

PXA UART를 정의해주는 부분(STD_SERIAL_PORT_DEFNS)이 있고, 확장을 하려면

EXTRA_SERIAL_PORT_DEFNS 정의 부분에서 각각의 구조체 멤버에 값을 적용해주면 되는것 같은데요..

제가 궁금한 점은 아래와 같습니다...


1. serial.c 가 인터럽트 구동방식인가, 폴링방식인가??
~~ 소스가 넘 길어서 부분적으로만 분석했는데 아무래도 타이머가 돌아가는 것을 보니까
폴링방식같은데 실력이 딸려서 파악이 잘 안되네요..또 그와 더불어 인터럽트 방식이라면
구조체의 irq에는 무슨 값을 넣어야 하나요? 아래처럼 IRQ_GPIO_2_80 인가요? 아니면 다른 값인가요??
폴링방식이라면 irq의 값은 의미가 없는 값인가요??

2. PORT_DEFN 부분에서 xmit_fifo_size 에는 무슨 값을 넣습니까??
~~ 알기로는 pxa-255는 피포가 TX, RX 각각 64바이트로 알고 있는데 커널 소스에는 32로 되어 있군요..
16C554의 경우는 각각 16바이트인데...16을 써야 되나요? 아니면 CPU 처럼 반으로 나눈 8을 써야 되나요??

3. io_type 부분에는 무슨 값을 넣나요?
~~ SERIAL_IO_MEM32인가요? 아니면 SERIAL_IO_MEM인가요? 그와 더불어 iomem_base에는 무슨 타입을 써야 됩
니까?
저는 아래와 같이 u32로 하고 있는데 맞는지 확신이 안가네요..

4. serial.c 코드에서 뭔가 수정해야 할 부분이 있습니까??


어느정도 동작은 하는것 같은데...좀 불안해서요...
여기에 나와있는 시리얼 테스트 프로그램은 제대로 돌아가는데,
같은 채널의 TX와 RX를 붙여서 에코 테스트를 하니까 돌아가다가 송수신이 제대로 안됩니다..

쓰다보니 주저리주저리 많아진것 같네요...지루하셨다면 죄송합니다..
위의 사항에 대해 아시는 분이 계시면 알려주세요...
사소한 것이라도 괜찮습니다..

그럼..좋은 주말보내세요...

/////////////////////////////////////////////////////////////////////////////////////
#define TL554A_A (*((volatile u32 *) 0xf3000000)) // TL16C554A Ach virtual addr
#define TL554A_B (*((volatile u32 *) 0xf3100000)) // TL16C554A Bch virtual addr
#define TL554A_C (*((volatile u32 *) 0xf3200000)) // TL16C554A Cch virtual addr
#define TL554A_D (*((volatile u32 *) 0xf3300000)) // TL16C554A Dch virtual addr

#define STD_SERIAL_PORT_DEFNS \
{ \
type: PORT_PXA, \
xmit_fifo_size: 32, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&FFUART,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM32,\
irq: IRQ_FFUART, \
flags: STD_COM_FLAGS, \
}, { \
type: PORT_PXA, \
xmit_fifo_size: 32, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&BTUART,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM32,\
irq: IRQ_BTUART, \
flags: STD_COM_FLAGS, \
}, { \
type: PORT_PXA, \
xmit_fifo_size: 32, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&STUART,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM32,\
irq: IRQ_STUART, \
flags: STD_COM_FLAGS, \
},

#define EXTRA_SERIAL_PORT_DEFNS \
{ \
type: PORT_16550A, \
xmit_fifo_size: 16, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&TL554A_A,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM,\
irq: IRQ_GPIO_2_80, \
flags: STD_COM_FLAGS, \
}, { \
type: PORT_16550A, \
xmit_fifo_size: 16, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&TL554A_B,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM,\
irq: IRQ_GPIO_2_80, \
flags: STD_COM_FLAGS, \
}, { \
type: PORT_16550A, \
xmit_fifo_size: 16, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&TL554A_C,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM,\
irq: IRQ_GPIO_2_80, \
flags: STD_COM_FLAGS, \
}, { \
type: PORT_16550A, \
xmit_fifo_size: 16, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&TL554A_D,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM,\
irq: IRQ_GPIO_2_80, \
flags: STD_COM_FLAGS, \
}
/////////////////////////////////////////////////////////////////////////////////////

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,