이 문서는 FALiNUX 커널 2.6.35(이하 FALiNUX 커널)의 AX88796B 이더넷 드라이버를 크로미움 OS 커널 3.0.13(이하 크로미움 커널)에 포팅하기 위한 문서입니다.
FALiNUX 커널에서는 기존의 SMDKV210이 아닌 EZS5PV210이라는 새로운 MMU Type을 만들어서 커널을 작업합니다.
그래서 Kerenl config에서 SMDKV210이 아닌 EZS5PV210이라는 MMU Type을 선택하게 되는데, 이 때 Kerner config에 ARCH_FALINUX라는 값이 추가로 들어가게 됩니다.
이 값은 FALiNUX 커널의 있는 많은 소스들에 있어서 #ifdef ARCH_FALINUX 혹은 #ifdef CONFIG_ARCH_FALINUX와 같은 매크로를 통해 큰 영향을 주게 됩니다.
FALiNUX 커널의 path_to_kernel/drivers/net/에 있는 AX88796B 드라이버인 ax88796b.c, ax88796b.h 파일 또한 ARCH_FALINUX에 영향을 받는 소스들 중 하나입니다.
따라서 AX88796B 드라이버를 포팅하기 위해선 이 소스파일을 수정해주어야 합니다.
기존 FALiNUX 커널의 ax88796b.c, ax88796b.h 파일을 크로미움 커널의 drivers/net/으로 복사합니다.
복사한 파일을 열어서 #ifdef ARCH_FALINUX로 둘러쌓인 부분이 무조건 컴파일되도록 수정합니다.
ax88796b.h 파일의 CONFIG_AX88796B_8BIT_WIDE 매크로는 1로 적용해야 합니다.
ax88796b.c 파일의 아래 부분을 찾아 다음과 같이 변경합니다.
변경 전
<sxh c;first-line:38;highlight:[39,40,41]>
#ifdef CONFIG_ARCH_FALINUX
#define CONFIG_AX88796B_USE_MEMCPY 0
#define CONFIG_AX88796B_8BIT_WIDE 0
#define CONFIG_AX88796B_EEPROM_READ_WRITE 0
#else
#define CONFIG_AX88796B_USE_MEMCPY 1
#define CONFIG_AX88796B_8BIT_WIDE 0
#define CONFIG_AX88796B_EEPROM_READ_WRITE 0
#endif
</sxh>
변경 후
<sxh c;first-line:38;highlight:[38,39,40]>
#define CONFIG_AX88796B_USE_MEMCPY 0
#define CONFIG_AX88796B_8BIT_WIDE 1
#define CONFIG_AX88796B_EEPROM_READ_WRITE 0
</sxh>
ax88796b.h 파일의 아래 부분을 찾아 다음과 같이 변경합니다.
변경 전
<sxh c;first-line:36;highlight:[37]>
#ifdef CONFIG_ARCH_FALINUX
#define AX88796B_IO_EXTENT 0xFF
#else
#define AX88796B_IO_EXTENT 0xFFF
#endif
</sxh>
변경 후
<sxh c;first-line:36;highlight:[36]>
#define AX88796B_IO_EXTENT 0xFF
</sxh>
커널 소스에서 S5PV210 프로세서와 관련된 핵심적인 소스들은 path_to_kernel/arch/arm/mach-s5pv210/ 디렉터리에 있습니다.
AX88796B 드라이버를 추가하기 위해서는 이 부분의 소스를 수정해주어야 합니다.
AX88796B 이더넷 구동에 필요한 헤더파일을 추가해줍니다.
변경 전
<sxh c;first-line:30>
#include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-fb.h>
</sxh>
변경 후
<sxh c;first-line:30;highlight:[33,34];>
#include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-fb.h>
#include <mach/regs-gpio.h>
#include <mach/irqs.h>
</sxh>
헤더 선언부 밑에 AX88796B에 필요한 매크로 및 구조체들을 선언해줍니다.
<sxh c;first-line:51;>
/* Following are code for AX88796B*/
#include <net/ax88796.h>
#define S5PV210_PA_CS1 0x88000000
#define BASE_ADDR_AX88796B_0 (S5PV210_PA_CS1 + 0x000) #define BASE_ADDR_AX88796B_1 (S5PV210_PA_CS1 + 0x100) #define IRQ_AX88796B_0 IRQ_EINT(10) #define IRQ_AX88796B_1 IRQ_EINT(11) #define GPIO_FOR_IRQ_AX88796B_0 (EINT_GPIO_0(10)) EINT10 #define GPIO_FOR_IRQ_AX88796B_1 (EINT_GPIO_0(11)) EINT11
#if defined(CONFIG_AX88796B)
static struct ax_plat_data ax88796_platdata = {
.flags = AXFLG_MAC_FROMDEV,
.wordlength = 2,
.dcr_val = 0x48,
.rcr_val = 0x40,
};
static struct resource ax88796_resources[] = {
[0] = {
.start = BASE_ADDR_AX88796B_0,
.end = BASE_ADDR_AX88796B_0 + 0xff,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_AX88796B_0,
.end = IRQ_AX88796B_0,
.flags = IORESOURCE_IRQ,
},
};
struct platform_device device_ax88796 = {
.name = "ax88796b",
.id = -1,
.num_resources = ARRAY_SIZE(ax88796_resources),
.resource = ax88796_resources,
.dev = {
.platform_data = &ax88796_platdata
}
}; #endif
static void init ezs5pv210_eint_set( void )
{
u32 gpio, irq;
#ifdef CONFIG_AX88796B
gpio = GPIO_FOR_IRQ_AX88796B_0;
irq = IRQ_AX88796B_0;
s3c_gpio_cfgpin ( gpio, S3C_GPIO_SFN(0xf) );
s3c_gpio_setpull ( gpio, S3C_GPIO_PULL_UP );
irq_set_irq_type ( irq , IRQF_TRIGGER_FALLING );
gpio = GPIO_FOR_IRQ_AX88796B_1;
irq = IRQ_AX88796B_1;
s3c_gpio_cfgpin ( gpio, S3C_GPIO_SFN(0xf) );
s3c_gpio_setpull ( gpio, S3C_GPIO_PULL_UP );
irq_set_irq_type ( irq , IRQF_TRIGGER_FALLING );
#endif
}
</sxh>
AX88796B 디바이스 드라이버를 로드하도록 하기 위해 smdkv210_devices 포인터 배열에 device_ax88796을 추가해줍니다.
변경 전
<sxh c>
static struct platform_device *smdkv210_devices[] initdata = {
&s3c_device_adc,
&s3c_device_cfcon,
&s3c_device_fb,
</sxh>
변경 후
<sxh c;highlight:[3,4,5]>
static struct platform_device *smdkv210_devices[] initdata = {
#ifdef CONFIG_AX88796B
&device_ax88796,
#endif
&s3c_device_adc,
&s3c_device_cfcon,
&s3c_device_fb,
</sxh>
마지막으로 AX88796B 인터럽트 세팅 함수가 실행될 수 있도록 smdkv210_machine_init 함수를 수정해줍니다.
변경 전
<sxh c>
static void init smdkv210_machine_init(void)
{
s3c_pm_init();
smdkv210_dm9000_init();
</sxh>
변경 후
<sxh c;highlight:[5]>
static void __init smdkv210_machine_init(void)
{
s3c_pm_init();
ezs5pv210_eint_set();
smdkv210_dm9000_init();
</sxh>
Kernel config에서 AX88796B 드라이버를 컴파일 할 수 있도록 AX88796B를 추가해주어야 하는데 기존의 크로미움 커널에는 이 옵션이 존재하지 않습니다. 이를 추가하기 위해서 path_to_kernel/drivers/net/ 디렉터리의 Kconfig, Makefile 파일을 수정해주어야 합니다.
기존 Kconfig에 선언되어있는 AX88796(AX88796B와 다릅니다) 드라이버의 위치를 찾아서 그 위에 AX88796B를 추가해줍니다.
변경 전
<sxh bash>
source “drivers/net/arm/Kconfig”
config AX88796
tristate "ASIX AX88796 NE2000 clone support"
depends on ARM || MIPS || SUPERH
select PHYLIB
select MDIO_BITBANG
help
AX88796 driver, using platform bus to provide
chip detection and resources
</sxh>
변경 후
<sxh bash;highlight:[3,4,5,6,7,8,9,10]>
source “drivers/net/arm/Kconfig”
config AX88796B
tristate "ASIX AX88796B NE2000 clone support"
depends on ARM || MIPS || SUPERH
select PHYLIB
select MDIO_BITBANG
help
AX88796B driver, using platform bus to provide
chip detection and resources
config AX88796
tristate "ASIX AX88796 NE2000 clone support"
depends on ARM || MIPS || SUPERH
select PHYLIB
select MDIO_BITBANG
help
AX88796 driver, using platform bus to provide
chip detection and resources
</sxh>
기존 Makefile에 선언되어있는 AX88796(AX88796B와 다릅니다) 드라이버의 위치를 찾아서 그 위에 AX88796B를 추가해줍니다.
변경 전
<sxh bash>
obj-$(CONFIG_AX88796) += ax88796.o
obj-$(CONFIG_BCM63XX_ENET) += bcm63xx_enet.o
</sxh>
변경 후
<sxh bash;highlight:[1]>
obj-$(CONFIG_AX88796B) += ax88796b.o
obj-$(CONFIG_AX88796) += ax88796.o
obj-$(CONFIG_BCM63XX_ENET) += bcm63xx_enet.o
</sxh>