다른 Linux 모듈/드라이버 내에서 UART/직렬 드라이버 사용

다른 Linux 모듈/드라이버 내에서 UART/직렬 드라이버 사용

fabric 을 사용하는 Linux에서 네트워크 모듈/드라이버를 구현하고 있습니다 net_devices. 지금까지 나는 insmod명령을 사용하여 커널 공간에서 모듈을 추가하고 제거 할 수 있었습니다 . 이를 통해 ifconfig새로 생성된 인터페이스에 대한 IP를 설정하고 핑 패킷을 보낼 수 있었습니다. 지금 해야 할 일은 함수 sk_buff내부의 패킷을 캡처 ndo_start_xmit하고 UART 물리적 커넥터를 통해 보내고 받는 것입니다. 즉, 사용자 공간 응용 프로그램에서와 마찬가지로 /dev/tty*파일 설명자( )를 통해 tty 장치를 열고 전송하기 위해 쓰고(그리고 수신하기 위해 읽음) 이제 어떻게든 커널 공간에서 감지하거나 내 장치(내 네트워크 모듈 내부)를 찾아서 보내야 합니다. 또는 Rx 및 Tx 라인을 통해 데이터를 수신합니다. 내 드라이버는 다음과 같습니다.

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

struct net_device *mynet;

int mynet_open(struct net_device *dev) {
   printk(KERN_ALERT "open called\n");
   return 0;
}

int mynet_release(struct net_device *dev) {
   printk(KERN_ALERT "release called\n");
   netif_stop_queue(dev);
   return 0;
}

int mynet_xmit(struct sk_buff *skb, struct net_device *dev) {
   printk(KERN_ALERT "dummy xmit function called...\n");

   ///////// UART SEND HERE /////////

   dev_kfree_skb(skb);
   return 0;
}

int mynet_init(struct net_device *dev) {
   printk(KERN_ALERT "gohmnet0 device initialized\n");
   return 0;
}

const struct net_device_ops my_netdev_ops = {
    .ndo_init = mynet_init,
    .ndo_open = mynet_open,
    .ndo_stop = mynet_release,
    .ndo_start_xmit = mynet_xmit,
};

static void virtual_setup(struct net_device *dev){
   dev->netdev_ops = &my_netdev_ops;
}


int mynet_init_module(void) {
   int result;
   mynet = alloc_netdev(0, "mynet",NET_NAME_UNKNOWN, virtual_setup);
   if((result = register_netdev(mynet)))
   {
       printk(KERN_ALERT "mynet: Error %d initalizing card ...", result);
       return result;
   }
   return 0;
}

void mynet_cleanup (void)
{
   printk (KERN_ALERT "<0> Cleaning Up the Module\n");
   unregister_netdev (mynet);
}

module_init(mynet_init_module);
module_exit(mynet_cleanup);
MODULE_LICENSE("GPL");

추신: 다음 방법을 살펴보았는데 교체해야 하므로 불가능합니다.

oldfs = get_fs();
set_fs(get_ds());
filp = filp_open(path, flags, rights);
set_fs(oldfs);

마지막으로, 사용자 공간으로 왔다 갔다 할 필요 없이 내 모듈/드라이버의 커널 공간에서 UART 드라이버를 사용해야 하는 것 같습니다.

관련 정보