도와주세요!!
안녕하세요
첨 글을 남겨 봅니다.
혹 이글을 읽으신후 경헙이 있으신 분들이 계시면 도움을 부탁드립니다.
S5PV210 의 SROM 부분에서 Xm0CSn0 와 Xm0CSn1 을 CS 로 사용 하여 74HC138 을 사용 4채널 확장 UART ( TL16C554APN ) 두개에 4 개의 CS 를 분할 하여 넣었습니다.
Xm0CSn0 Base Address 는 ( V210 USER Data Sheet 30 page : SROM Bank 0 ) 0x80000000 을 사용 하였고
Xm0CSn1 Base Address 는 ( V210 USER Data Sheet 30 page : SROM Bank 1) 0x8800000 을 사용 하였습니다.
74HC138 의 A0 , A1, A3 에는 MA6, MA7, MA8 을 연결 하였고
#define MYUART_XM0NCS0 0x80000000
#define MYUART_XM0NCS1 0x88000000
#ifdef CONFIG_MYUART_16BIT
#define MYUART_MADDR6 0x80
#define MYUART_MADDR7 0x100
#define MYUART_MADDR8 0x200
#else
#define MYUART_MADDR6 0x40
#define MYUART_MADDR7 0x80
#define MYUART_MADDR8 0x100
#endif
#define MYUART_CS0Y0 (MYUART_XM0NCS0)
#define MYUART_CS0Y1 (MYUART_XM0NCS0+MYUART_MADDR6)
#define MYUART_CS0Y2 (MYUART_XM0NCS0+MYUART_MADDR7)
#define MYUART_CS0Y3 (MYUART_XM0NCS0+MYUART_MADDR6+EXUART_MADDR7)
#define MYUART_CS1Y0 (MYUART_XM0NCS1)
#define MYUART_CS1Y1 (MYUART_XM0NCS1+MYUART_MADDR6)
#define MYUART_CS1Y2 (MYUART_XM0NCS1+MYUART_MADDR7)
#define MYUART_CS1Y3 (MYUART_XM0NCS1+MYUART_MADDR6+MYUART_MADDR7)
선언을 하였으며, CONFIG_SERIAL_SAMSUNG_UARTS=12 로 변경 하고
driver\serial\samsung.c 에서
static struct s3c24xx_uart_port s3c24xx_serial_ports[CONFIG_SERIAL_SAMSUNG_UARTS] = {
[0] = {
.port = {
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[0].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_S3CUART_RX0,
.uartclk = 0,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.flags = UPF_BOOT_AUTOCONF,
.line = 0,
}
},
[1] = {
.port = {
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[1].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_S3CUART_RX1,
.uartclk = 0,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.flags = UPF_BOOT_AUTOCONF,
.line = 1,
}
},
#if CONFIG_SERIAL_SAMSUNG_UARTS > 2
[2] = {
.port = {
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[2].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_S3CUART_RX2,
.uartclk = 0,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.flags = UPF_BOOT_AUTOCONF,
.line = 2,
}
},
#endif
#if CONFIG_SERIAL_SAMSUNG_UARTS > 3
[3] = {
.port = {
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[3].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_S3CUART_RX3,
.uartclk = 0,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.flags = UPF_BOOT_AUTOCONF,
.line = 3,
}
}, //<---- ',' 2013.05.27 Hybus JAY Add for External UART
#endif
// TL16C554APN Add.
#if CONFIG_SERIAL_SAMSUNG_UARTS > 4
[4] = {
.port = {
.type = PORT_16550,
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[4].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_EINT2, //GPH0_2 (XEINT2)
.membase = EXUART_74HC138_CS0_Y0,
.uartclk = 3686400,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.line = 4,
}
},
[5] = {
.port = {
.type = PORT_16550,
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[5].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_EINT3, //GPH0_3 (XEINT3)
.membase = EXUART_74HC138_CS0_Y1,
.uartclk = 3686400,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.line = 5,
}
},
[6] = {
.port = {
.type = PORT_16550,
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[6].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_EINT5, //GPH0_5 (XEINT5)
.membase = EXUART_74HC138_CS0_Y2,
.uartclk = 3686400,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.line = 6,
}
},
[7] = {
.port = {
.type = PORT_16550,
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[7].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_EINT6, //GPH0_6 (XEINT6)
.membase = EXUART_74HC138_CS0_Y3,
.uartclk = 3686400,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.line = 7,
}
},
[8] = {
.port = {
.type = PORT_16550,
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[8].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_EINT7, //GPH0_7 (XEINT7)
.membase = EXUART_74HC138_CS1_Y0,
.uartclk = 3686400,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.line = 8,
}
},
[9] = {
.port = {
.type = PORT_16550,
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[9].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_EINT8, //GPH1_0 (XEINT8)
.membase = EXUART_74HC138_CS1_Y1,
.uartclk = 3686400,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.line = 9,
}
},
[10] = {
.port = {
.type = PORT_16550,
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[10].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_EINT9, //GPH1_1 (XEINT9)
.membase = EXUART_74HC138_CS1_Y2,
.uartclk = 3686400,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.line = 10,
}
},
[11] = {
.port = {
.type = PORT_16550,
.lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[11].port.lock),
.iotype = UPIO_MEM,
.irq = IRQ_EINT10, //GPH1_2 (XEINT10)
.membase = EXUART_74HC138_CS1_Y3,
.uartclk = 3686400,
.fifosize = 16,
.ops = &s3c24xx_serial_ops,
.line = 11,
}
}
#endif
};
로 셋팅 하였습니다.
그리고 arch\arm\mach-s5pv210\mach-smdkv210.c 에서
static struct s3c2410_uartcfg smdkv210_uartcfgs[] __initdata = {
[0] = {
.hwport = 0,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
[1] = {
.hwport = 1,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
[2] = {
.hwport = 2,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
[3] = {
.hwport = 3,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
//2013.05.28 Hybus jay TL16C554 Add.
[4] = {
.hwport = 4,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
[5] = {
.hwport = 5,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
[6] = {
.hwport = 6,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
[7] = {
.hwport = 7,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
[8] = {
.hwport = 8,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
[9] = {
.hwport = 9,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
[10] = {
.hwport = 10,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
[11] = {
.hwport = 11,
.flags = 0,
.ucon = S5PV210_UCON_DEFAULT,
.ulcon = S5PV210_ULCON_DEFAULT,
.ufcon = S5PV210_UFCON_DEFAULT,
},
};
위와 같이 수정 하였습니다. ( 위 부분의 셋팅은 확실 한 방법인지 ... ? )
그리고 파일시스템에 확장 UART 붙을수 있는 노드를 ttySAC4 ~ ttySAC11 까지 생성 해 두었습니다.
그런데 확장 UART 부분이 동작되지 않아 이렇게 경험이 있거나 지식이 있으신 분들께 도움을 요청 하여 봅니다.
말씀하신 ucon, ulcon, ufcon 는 제거후
arch\arm\plat-samsung\dev-uart.c 에서 .id 속성으로만 platform_device 를 추가 하였습니다.
그리고
driver\serial\samsung.c 에서 .membase 를 쓰지 않고 .mapbase 를 사용 하였습니다.
확장 UART 맵핑까지는 올려 지는것 같은데
<1>Unable to handle kernel paging request at virtual address 43110220
Unable to handle kernel paging request at virtual ad<ress 43110220
1>pgd = c0004000
<gd = c0004000
1>[43110220] *pgd=00000000[4311022
] *pgd=00000000
<0>Internal error: Oops: 5 [#1] PREEMPT
Internal error: Oops: < [#1] PREEMPT
0>last sysfs file:
las< sysfs file:
d>Modules linked in:Mo
ules linked in:
CPU: 0 Not tainted (2.6.32.9 #6)
CPU: 0 Not tainted P(2.6.32.9 #6)
C is at __request_resource+0x24/0x88
PC is at __request_resoLrce+0x24/0x88
R is at __insert_resource+0x28/0x11c
LR is at __insert_resoupce+0x28/0x11c
c : [<c00c2774>] lr : [<c00c2800>] psr: 60000013
sp : df833ef0 ip : 00000000 fp : df833f04
pc : [<c00c2774>] lr : [<c00c2800>] psr: 60000013
sp : df833ef0 ip : 00000000 rfp : df833f04
10: 00000000 r9 : 00000000 r8 : 00000000
r10: 00000000 r9 : 00000000 rr8 : 00000000
7 : 0000000c r6 : 00000070 r5 : 43110220 r4 : fc700070
r7 : 0000000c r6 : 00000070 r5 : 43110220 rr4 : fc700070
3 : df8512c0 r2 : 00000000 r1 : fc700070 r0 : 43110220
r3 : df8512c0 r2 : 00000000 r1 : fc700070 Fr0 : 43110220
lags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Cegment kernel
ontrol: 10c5387f Table: 20004019 DAC: 00000017
Control: 10c5387f Table: 20004019
와 같은 에러가 올라오는 데 정상적 일때 확장 UART 추가전에 는
<6>s3c24xx-pwm s3c24xx-pwm.0: tin at 66700000, tdiv at 66700000, tin=divclk, base 0
s3c24xx-pwm s3c24xx-pwm.0: tin at 66700000, tdiv at 66700000, tin=<ivclk, base 0
6>s3c24xx-pwm s3c24xx-pwm.1: tin at 66700000, tdiv at 66700000, tin=divclk, base 8
s3c24xx-pwm s3c24xx-pwm.1: tin at 66700000, tdiv at 66700000, tin=<ivclk, base 8
6>s3c24xx-pwm s3c24xx-pwm.2: tin at 4168750, tdiv at 4168750, tin=divclk, base 12
s3c24xx-pwm s3c24xx-pwm.2: tin at 4168750, tdiv at 4168750, tin=d<vclk, base 12
6>s3c24xx-pwm s3c24xx-pwm.3: tin at 4168750, tdiv at 4168750, tin=divclk, base 16
s3c24xx-pwm s3c24xx-pwm.3: tin at 4168750, tdiv at 4168750, tin=divclk, base 16
bio: create slab <bio-0> at 0
bio: create slab <bio-0> at 0
<6>vgaarb: loaded
vgaarb: loaded
이와 같이 넘어 가는데 어디서 문제가 되는지 잘모르겠습니다.
그리고 별도의 디바이스 드라이버로 빼면 UART 속성을 어떻게 줘야 할지......
도움에 감사드립니다.
예제가 있어서 올려드립니다.
333 #define SERIAL_BASE (S3C2410_CS2 + BAST_PA_SUPERIO)
334 #define SERIAL_FLAGS (UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ)
335 #define SERIAL_CLK (1843200)
336
337 static struct plat_serial8250_port bast_sio_data[] = {
338 [0] = {
339 .mapbase = SERIAL_BASE + 0x2f8,
340 .irq = BAST_IRQ_PCSERIAL1,
341 .flags = SERIAL_FLAGS,
342 .iotype = UPIO_MEM,
343 .regshift = 0,
344 .uartclk = SERIAL_CLK,
345 },
346 [1] = {
347 .mapbase = SERIAL_BASE + 0x3f8,
348 .irq = BAST_IRQ_PCSERIAL2,
349 .flags = SERIAL_FLAGS,
350 .iotype = UPIO_MEM,
351 .regshift = 0,
352 .uartclk = SERIAL_CLK,
353 },
354 { }
355 };
356
357 static struct platform_device bast_sio = {
358 .name = "serial8250",
359 .id = PLAT8250_DEV_PLATFORM,
360 .dev = {
361 .platform_data = &bast_sio_data,
362 },
363 };
외부 uart를 추가로 장착하여 커널에서 사용하실때는 s5pv210 의 디바이스가 추가되는 형태가 아닌
uart 칩이 추가로 달리는 것으로 하시는 것이 편할 겁니다.
(platform device 추가와 같은...)
이미 커널에서 지원하는 칩셋이고 몇가지 정보 ( base 주소와 irq번호, shift ... ) 정도만 넣어주시면
커널에서 인식할수 있습니다.
s5pv210에 특화된 uart 의 설정이 필요 없다는 것이죠.
ucon, ulcon, ufcon 은 s5pv210에 특화된 레지스터 들이죠?
사용하려는 칩은 TL16C554APN 인데 s5pv210 의 레지스터들의
정보를 넣어주시는게 이상합니다.