他のLinuxモジュール/ドライバ内でUART/シリアルドライバを使用する

他のLinuxモジュール/ドライバ内でUART/シリアルドライバを使用する

fabricを使用するLinuxでネットワークモジュール/ドライバを実装していますnet_devices。これまでは、insmodコマンドを使用してカーネルスペースからモジュールを追加および削除できました。これにより、ifconfig新しく作成されたインターフェイスのIPを設定し、pingパケットを送信できます。今やるべきことは、関数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");

PS:次の方法を見てみましたが、交換する必要があるため不可能です。

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

最後に、ユーザースペースに行き来する必要なく、私のモジュール/ドライバのカーネルスペースでUARTドライバを使用する必要があるようです。

ベストアンサー1

おすすめ記事