Saturn7 에서 Broadcom Dongle 사용하기
2009년 9월 17일을 기준으로 가장 안정적으로 동작하는 4323 드라이버를 Saturn7 에서 동작가능하도록 하는 방법을 기술하고 있다.
이 문서는 작성하는 이유는 여러가지가 있겠지만, 가장 큰 이유는 Saturn7 플랫폼으로 개발하던 도중 Drop 이 되었기 때문이다. 나중에 Satrun7 플랫폼을 다시 사용하게 된다면, 훗날 이 문서가 많은 도움이 될 것이다.
준비운동 하기
내가 사용한 GP2 버전은 리비전 r6131 이다. 이를 SVN 서버로 부터 가져오기 위해서는 다음과 같이 명령한다.
$svn co http://156.147.69.210/gp2/trunk ./ -r6131
참고로 타겟보드는 ATSC 북미향 High 보드를 가지고 진행했다. 4323 드라이버는 5_14_21_14_srcmedia.tar.gz 를 사용했다.
부트로더 수정하기
/gp2/os/saturn7_linux/boot/boot_1st/src 아래의 'boot_t3.inc' 파일을 아래과 같이 수정한다.
MEMCLK = 1300 CPU_CLOCK = 504 ... WRITE_BUFFER_TIMEOUT = 0x0080 ...
이후 컴파일하여, 'u-boot-spi.bin, u-boot-nand.bin' 를 다시 write 한다.
커널 수정하기
/gp2/os/saturn7_linux/kernel/linux-2.6.26-saturn7/arch/mips/mips-boards/titania3 아래의 'chip_setup.c' 파일을 아래와 같이 수정한다.
...
void Chip_Flush_Memory(void)
{
static unsigned char u8_4Lines[128];
unsigned char *pu8;
volatile unsigned char *tmp;
pu8 = ((unsigned char *)(((unsigned int)u8_4Lines) | 0xa0000000));
tmp = pu8;
pu8[0] = pu8[16] = pu8[32] = pu8[48] = 1;
mb();
pu8[64+0] = pu8[64+16] = pu8[64+32] = pu8[64+48] = 1;
mb();
*tmp = pu8[64+48];
}
또한 /gp2/os/saturn7_linux/kernel/linux-2.6.26-saturn7/drivers/serial 아래의 '8250.c' 파일을 아래와 같이 수정한다.
static int serial_link_irq_chain(struct uart_8250_port *up)
{
...
ret = request_irq(up->port.irq, serial8250_interrupt, irq_flags, "serial", i);
*((volatile unsigned int*)0xbf203184) = 0x8; // 추가
*((volatile unsigned int*)0xbf203188) = 0x8; // 추가
if(ret < 0)
...
}
드라이버 수정하기
적당한 위치에 압축을 풀고 다음의 파일들을 수정한다.
shared/dbus_usb_linux.c
... //#if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)) // 수정 L.37 #if 0 // 추가 #define USB_ALLIC_URB() ... #define MAX_USB_TX_REQ 128 // 수정 L.114 ... //#if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)) // 수정 L.1471 #if 0 // 추가 ... //#if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)) // 수정 L.1516 #if 0 // 추가
shared/bcm_rpc_tp_dbus.c
... #define MAX_RPC_BUFS 128 // 수정 ...
wl/sys/wl_linux.c
...
MODULE_LICENSE("GPL");
...
wl/linux/Makefile
... ifeq ($(KERNELGE30),1) ... IFLAGS += -I$(LINUXDIR)/arch/mips/include/asm/mach-mips ... else ... IFLAGS += -I$(LINUXDIR)/include/asm/mach-mips ...
모두 수정했으면, 다음과 같이 컴파일 한다.
$make LINUXDIR=/vol/users/wjkim/work/gp2/os/saturn7_linux/kernel/linux-2.6.26-saturn7 nodebug-mipsel-apdef-stadef-embed STBLINUX=1 NVRAMSTBS=1