linuxドライバの作成とテストの簡単な指導
3078 ワード
一、まず3つのファイルを作成し、それぞれ
1、以下は簡単なドライバの例で、ファイル名はledです.c
2、駆動コンパイルファイルMakefile
最初の行は、カーネルソースディレクトリであり、バージョンによって異なります.
例はunbantuのバージョンです.どのバージョンがlinuxでuname-aで表示できるか
3、ドライバテスタ、test_と命名led.c
二、コンパイル及びテスト方法1.このディレクトリはlinuxサーバ2に転送されます.makeコンパイルを実行します.コンパイルが完了するとledが生成されます.koファイル3.実行ko. ドライバ4をインストールする.cat/proc/devices|grep led_drvは、システムが割り当てたデバイス番号snを表示します.(注:「led_drv」はled.cに登録されているデバイス名です)
三、デバイスファイル1を作成し、以下のコマンドを実行し、デバイスファイルを作成する.(注snは、前のステップで調べたデバイス番号であり、整形数字である)mknod leddev c sn 0 2、前のステップで生成したleddevを/devディレクトリにコピーする
四、テスト1.次のコマンドを実行して、テストプログラムgcc-o test_をコンパイルします.led test_led.c 2. 次のコマンドを実行してテストプログラムを実行します./test_led
五、カーネルメッセージの表示とドライバのアンインストール
1.カーネルメッセージdmesgを確認するには、次のコマンドを実行します.
中括弧内はタイムスタンプ、後はledというメッセージが表示されるはずです.cのメッセージ[122,9543.190380]led driver initialized![1229550.950369] led open [1229550.950374] led write
2.rmmod ledを実行し(ここではkoを付けないことに注意)、ledをアンインストールする.ko駆動アンインストールに成功すると、dmesgがカーネルメッセージを表示すると、以下の内容が表示されます[128,368.334598]led driver exit!
1、以下は簡単なドライバの例で、ファイル名はledです.c
#include
#include
#include
#include
#include
static int led_device_open(struct inode *inode, struct file *file);
static ssize_t led_device_write(struct file *file, const char __user *buf, size_t count, loff_t *f_pos);
static ssize_t led_device_read(struct file *file, char __user *buf,size_t count, loff_t *f_pos);
struct file_operations driver_options = {
.open = led_device_open,
.read = led_device_read,
.write = led_device_write
};
static int device_number = 0;
static int led_device_open(struct inode *inode, struct file *file)
{
printk("led open
");
return 0;
}
static ssize_t led_device_write(struct file *file, const char __user *buf, size_t count, loff_t *f_pos)
{
printk("led write
");
return 0;
}
static ssize_t led_device_read(struct file *file, char __user *buf,size_t count, loff_t *f_pos)
{
printk("led read
");
return 0;
}
MODULE_LICENSE("GPL");
static int __init led_init(void)
{
device_number = register_chrdev(0, "led_drv", &driver_options);
if (device_number < 0)
{
printk("sorry, register char device failed!");
return -1;
}
printk("led driver initialized!
");
return 0;
}
static void __exit led_exit(void)
{
unregister_chrdev(device_number, "led_drv");
printk("led driver exit!
");
}
module_init(led_init);
module_exit(led_exit);
2、駆動コンパイルファイルMakefile
KERN_DIR=/lib/modules/4.15.0-43-generic/build
all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m += led.o
最初の行は、カーネルソースディレクトリであり、バージョンによって異なります.
例はunbantuのバージョンです.どのバージョンがlinuxでuname-aで表示できるか
3、ドライバテスタ、test_と命名led.c
#include
#include
#include
#include
int main(void)
{
int val=1;
printf("this is led drive test
");
int fd = open("/dev/leddev",O_RDWR);
if(fd<0)
{
printf("can't open led device
");
}
write(fd, &val, 4);
return 0;
}
二、コンパイル及びテスト方法1.このディレクトリはlinuxサーバ2に転送されます.makeコンパイルを実行します.コンパイルが完了するとledが生成されます.koファイル3.実行ko. ドライバ4をインストールする.cat/proc/devices|grep led_drvは、システムが割り当てたデバイス番号snを表示します.(注:「led_drv」はled.cに登録されているデバイス名です)
三、デバイスファイル1を作成し、以下のコマンドを実行し、デバイスファイルを作成する.(注snは、前のステップで調べたデバイス番号であり、整形数字である)mknod leddev c sn 0 2、前のステップで生成したleddevを/devディレクトリにコピーする
四、テスト1.次のコマンドを実行して、テストプログラムgcc-o test_をコンパイルします.led test_led.c 2. 次のコマンドを実行してテストプログラムを実行します./test_led
五、カーネルメッセージの表示とドライバのアンインストール
1.カーネルメッセージdmesgを確認するには、次のコマンドを実行します.
中括弧内はタイムスタンプ、後はledというメッセージが表示されるはずです.cのメッセージ[122,9543.190380]led driver initialized![1229550.950369] led open [1229550.950374] led write
2.rmmod ledを実行し(ここではkoを付けないことに注意)、ledをアンインストールする.ko駆動アンインストールに成功すると、dmesgがカーネルメッセージを表示すると、以下の内容が表示されます[128,368.334598]led driver exit!