------在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
将hello.ko传至marsboard开发板
进入hello文件夹的路径后# adb -s 20080411 push hello.ko /data/local
装载hello.ko驱动
#insmod hello.ko
显示调试信息
# dmesg
得到结果: