Linux/Kernel Driver

Embedded System에서 네트워크 인터페이스 구현

임베디드 친구 2025. 3. 30. 09:38
728x90
반응형

Embedded System에서 네트워크 인터페이스 구현

Embedded Linux 환경에서 네트워크 인터페이스를 구현하고 네트워크 드라이버를 포팅 및 설정하는 과정은 많은 Embedded 시스템 개발자들에게 필수적인 기술입니다. 이번 포스팅에서는 Rockchip RK3399를 기반으로 네트워크 드라이버를 포팅하고 설정하는 방법에 대해 설명합니다.

1. 네트워크 드라이버의 기본 개념

네트워크 드라이버는 네트워크 인터페이스 카드(Network Interface Card, NIC)와 상호작용하여 데이터를 송수신하는 소프트웨어입니다. Linux 커널에서 네트워크 드라이버는 주로 net_device 구조체를 통해 네트워크 인터페이스와 통신하며, 주요 작업은 다음과 같습니다:

  • 하드웨어 초기화
  • 데이터 송수신 처리
  • 하드웨어 설정 관리
  • 네트워크 프로토콜 스택과의 통합

2. RK3399 네트워크 드라이버 포팅

2.1 필요한 환경 설정

RK3399 플랫폼에서 네트워크 드라이버를 포팅하기 위해 다음 환경을 준비합니다:

  • RK3399 개발 보드
  • Linux 커널 소스 코드
  • Toolchain (gcc-arm)
  • 네트워크 인터페이스 칩셋에 맞는 드라이버 코드

2.2 네트워크 드라이버 소스 확인

RK3399 보드에서 사용하는 네트워크 칩셋에 따라 해당 드라이버 소스를 확인해야 합니다. 예를 들어, RK3399의 기본 이더넷 컨트롤러는 Realtek RTL8211E 칩셋을 사용할 수 있습니다. 이 칩셋의 드라이버는 일반적으로 커널 소스 코드의 다음 위치에 있습니다:

./drivers/net/ethernet/realtek/r8169.c

2.3 드라이버 구성

드라이버를 사용하려면 커널 설정에서 해당 드라이버를 활성화해야 합니다. 다음 명령어로 메뉴를 열고 설정합니다:

make menuconfig
  1. Device Drivers > Network device support > Ethernet driver support
  2. Realtek RTL8211E 드라이버를 선택합니다 (r8169).

2.4 드라이버 빌드 및 설치

커널을 빌드하여 드라이버를 포함시킵니다:

make -j$(nproc)
make modules_install
make install

이후, 보드에 커널 이미지를 업로드하고 부팅합니다.

3. 네트워크 인터페이스 설정

3.1 인터페이스 확인

부팅 후, 네트워크 인터페이스가 올바르게 로드되었는지 확인합니다:

ifconfig -a

결과에서 eth0과 같은 인터페이스를 확인할 수 있다면 드라이버가 제대로 로드된 것입니다.

3.2 IP 주소 설정

IP 주소를 수동으로 설정하려면 다음 명령을 사용합니다:

ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up

DHCP를 통해 자동 설정하려면:

dhclient eth0

3.3 네트워크 연결 확인

Ping 명령어로 네트워크 연결 상태를 확인합니다:

ping 8.8.8.8

정상적으로 응답이 오면 네트워크 설정이 완료된 것입니다.

4. 예제 코드

다음은 네트워크 드라이버를 초기화하는 간단한 코드 예제입니다:

#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>

static struct net_device *rk_netdev;

static int rk_open(struct net_device *dev) {
    printk("rk_open called\n");
    netif_start_queue(dev);
    return 0;
}

static int rk_stop(struct net_device *dev) {
    printk("rk_stop called\n");
    netif_stop_queue(dev);
    return 0;
}

static netdev_tx_t rk_start_xmit(struct sk_buff *skb, struct net_device *dev) {
    printk("rk_start_xmit called\n");
    dev_kfree_skb(skb);
    return NETDEV_TX_OK;
}

static const struct net_device_ops rk_netdev_ops = {
    .ndo_open = rk_open,
    .ndo_stop = rk_stop,
    .ndo_start_xmit = rk_start_xmit,
};

static int __init rk_init(void) {
    rk_netdev = alloc_etherdev(0);
    if (!rk_netdev) return -ENOMEM;

    rk_netdev->netdev_ops = &rk_netdev_ops;
    strcpy(rk_netdev->name, "rk0");
    register_netdev(rk_netdev);

    printk("RK3399 network driver loaded\n");
    return 0;
}

static void __exit rk_exit(void) {
    unregister_netdev(rk_netdev);
    free_netdev(rk_netdev);
    printk("RK3399 network driver unloaded\n");
}

module_init(rk_init);
module_exit(rk_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("RK3399 Network Driver Example");

5. 결론

이번 포스팅에서는 RK3399 플랫폼에서 네트워크 드라이버를 포팅하고 설정하는 방법에 대해 알아보았습니다. 네트워크 드라이버는 Embedded Linux 시스템의 핵심 구성 요소로, 이를 잘 이해하고 구현하는 것은 시스템 개발의 중요한 단계입니다.

반응형