목차

AX88796B 이더넷 드라이버 크로미움 커널에 포팅하기

이 문서는 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 수정

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 수정

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 드라이버를 추가하기 위해서는 이 부분의 소스를 수정해주어야 합니다.

mach-smdkv210.c 소스 수정

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>

Kconfig, Makefile 수정

Kernel config에서 AX88796B 드라이버를 컴파일 할 수 있도록 AX88796B를 추가해주어야 하는데 기존의 크로미움 커널에는 이 옵션이 존재하지 않습니다. 이를 추가하기 위해서 path_to_kernel/drivers/net/ 디렉터리의 Kconfig, Makefile 파일을 수정해주어야 합니다.

Kconfig 수정

기존 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 수정

기존 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>

Kerner config 수정

이제 크로미움 커널의 menuconfig에서 AX88796B를 활성화시켜주시면 됩니다.
Device drivers → Network device support → Ethernet (10 or 100Mbit) → ASIX AX88796B NE2000 clone support 를 Enable시켜줍니다.