第一个linux驱动_读写设备文件(2)

时间:2023-01-04 12:13:42

------在android模拟器和开发板上进行测试驱动模块

第一步添加逻辑功能部分代码

1.添加建立文件部分代码,添加后的hello.c的代码如下:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <asm/uaccess.h>

#define DEVICE_NAME "myfirstdriver"//定义设备文件

static struct file_operations dev_fops = 
{.owner=THIS_MODULE};
static struct miscdevice misc =
{.minor=MISC_DYNAMIC_MINOR, .name=DEVICE_NAME, .fops=&dev_fops};


//linnux驱动的装载函数
static int __init hello_drive_init(void) {
    int ret;
    ret = misc_register(&misc);//注册设备文件
    printk("hello drive init\n");
    return 0;
}
//linux驱动的卸载函数
static void __exit hello_drive_exit(void) {
    misc_deregister(&misc);//注销设备文件
    printk("hello drive  exit\n"); make -C /usr/src/linux-headers-3.13.0-86-generic/ M=/usr/MarsBoard-A20-android-4.2.2-SDK-V2.0/lichee/linux-3.3/drivers/hello
}
//注册装载函数
module_init(hello_drive_init);
//注册卸载函数
module_exit(hello_drive_exit);

重新编译root@wayy-OptiPlex-9020:/usr/MarsBoard-A20-android-4.2.2-SDK-V2.0/lichee/linux-3.3/drivers/hello# make -C /usr/src/linux-headers-3.13.0-86-generic/ M=/usr/MarsBoard-A20-android-4.2.2-SDK-V2.0/lichee/linux-3.3/drivers/hello

卸载掉之前加载的和hello驱动

#rmmod hello

重新加载hello驱动

#insmod hello.ko

进入文件目录下察看文件

#ls /dev/myfirstdriver

显示结果如下:

/dev/myfirstdriver  证明在相关目录下已经生成了文件

查看设备号 #ls -al /dev/myfirstdriver

得到结果:crw------- 1 root root 10, 56  5月 20 15:46 /dev/myfirstdriver


2、添加实际的逻辑代码:

添加后的hello.c的代码如下:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <asm/uaccess.h>

#define DEVICE_NAME "myfirstdriver"//定义设备文件

//保存读写数组
static unsigned char mem[1000];
//保存读写字符串的数量
static ssize_t char_count = 0;
//处理设备文件读动作
static ssize_t hello_drive_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) {
    ssize_t read_count = char_count;
    if(copy_to_user(buf, (void*)mem, char_count))
    {
        return -EINVAL;
    }
    printk("read:count:%d\n",(int)count);
    printk("read:char_count:%d\n",(int)char_count);
    char_count = 0;
    return read_count;
}
//处理设备文件写动作
static ssize_t hello_drive_write(struct file *file, const char __user *buf,size_t count, loff_t *ppos) {
    char_count = count;
    
    if(copy_from_user(mem, buf, count))
    {
        return -EINVAL;    
    }
    mem[count] = '\0';
    printk("write:char_count:%d\n",(int)char_count);
    return char_count;
}

static struct file_operations dev_fops = 
{.owner=THIS_MODULE, .read = hello_drive_read, .write = hello_drive_write};
static struct miscdevice misc =
{.minor=MISC_DYNAMIC_MINOR, .name=DEVICE_NAME, .fops=&dev_fops};


//linnux驱动的装载函数
static int __init hello_drive_init(void) {
    int ret;
    ret = misc_register(&misc);//注册设备文件
    printk("hello drive init\n");
    return 0;
}
//linux驱动的卸载函数
static void __exit hello_drive_exit(void) {
    misc_deregister(&misc);//注销设备文件
    printk("hello drive  exit\n"); 
}
//注册装载函数
module_init(hello_drive_init);
//注册卸载函数
module_exit(hello_drive_exit);

重新编译:#make -C /usr/src/linux-headers-3.13.0-86-generic/ M=/usr/MarsBoard-A20-android-4.2.2-SDK-V2.0/lichee/linux-3.3/drivers/hello/

卸载驱动:#rmmod hello

重新加载模块:#insmod hello.ko

写入内容:#echo hellooo > /dev/myfirstdriver


3.查看效果

获得内容:#cat /dev/myfirstdriver 

显示内容:hellooo

查看日志:#dmesg

显示结果:

[167636.665140] read:count:32768

[167636.665143] read:char_count:0


第二步导入android模拟器进行测试

adb -s 20080411 push hello.ko /data/local1.修改内核配置

为linux系统配置goldfish内核(三大内核系统MSM、OMAP、Goldfish),首先下载goldfish源码获得goldfish-android-goldfish-3.4.tar.gz

编译内核

使用goldfish编译hello驱动(goldfish编译已经成功,但是调用emulator 命令 仿真zImage暂未成功)

第三步导入android开发板进行测试

1.在解压下的Marsboard的安卓代码路径下建立hello驱动文件夹

#cd  /usr/MarsBoard-A20-android-4.2.2-SDK-V2.0/lichee/linux-3.3/drivers

#mkdir hello

把hello.c和Makefile拷贝到hello文件夹下,命令省略。

进入/usr/MarsBoard-A20-android-4.2.2-SDK-V2.0/lichee/linux-3.3/drivers路径 #cd /usr/MarsBoard-A20-android-4.2.2-SDK-V2.0/lichee/linux-3.3/drivers

修改Makefile,在末尾添加:obj-m                += hello/     //(-m表示以模块化编译,不编译进内核)

进入到lichee路径下面

 # ./build.sh  -p sun7i_android

编译完成之后会在hello文件夹下生成.o和.ko格式的文件

2.使用adb在开发板下进行测试

把开发板通过USB线连接至ubuntu电脑

新打开一个终端(ctrl+Alt+T)

#adb devices

得到开发板的设备号:20080411

第一个linux驱动_读写设备文件(2)

将hello.ko传至marsboard开发板

进入hello文件夹的路径后# adb -s 20080411 push hello.ko /data/local

第一个linux驱动_读写设备文件(2)

装载hello.ko驱动

#insmod hello.ko

显示调试信息

# dmesg

得到结果:

第一个linux驱动_读写设备文件(2)