看了老罗的Android之旅介绍的Android硬件抽象层的学习后,这里总结和实现一个字符驱动程序,同时在Android层实现一个c的可执行文件来测试这个驱动程序,记录下来,以便查阅!

首先在kerner/drivers下创建一个目录memdev,然后在该目录下touch memdev.c文件

#include #include #include #include #include "memdev.h"static int memdev_major = 0;static int memdev_data = 0;static ssize_t memRead(struct file*, char*, size_t, loff_t *);static ssize_t memWrite(struct file*, const char *, size_t, loff_t *);struct file_operations memdev_fops ={.owner = THIS_MODULE,.read = memRead,.write = memWrite};static int __init memdev_init(){int ret;ret = register_chrdev(memdev_major, MEMDEV_NAME, &memdev_fops);if(ret < 0){printk(KERN_ALERT "memdev register fial!\n");}else{printk(KERN_ALERT "memdev register success!\n");memdev_major = ret;printk(KERN_ALERT "Major = %d\n", memdev_major);}return 0;}static void __exit memdev_exit(){unregister_chrdev(memdev_major, MEMDEV_NAME);printk(KERN_ALERT "memdev exit now!");}static ssize_t memRead(struct file* filp, char* buf, size_t len, loff_t *off){if(copy_to_user(buf, &memdev_data,sizeof(int))){return -EFAULT;}return sizeof(int);}static ssize_t memWrite(struct file* filp, const char* buf, size_t len, loff_t *off){if(copy_from_user(&memdev_data, buf, sizeof(int))){return -EFAULT;}printk(KERN_ALERT "write = %d\n", memdev_data);return sizeof(int);}MODULE_LICENSE("GEL");module_init(memdev_init);module_exit(memdev_exit);

这里是基本的字符设备的驱动,这里就不介绍了。

然后在该目录下创建Kconfig和Makefile文件

在Kconfig中

config MEMDEVtristate "Javen First Android Driver"default nhelpThis is the first Android Driver of Javen.tang

在Makefile中

obj-$(CONFIG_MEMDEV)+=memdev.o
接着在上一层的drivers目录下的Kconfig和Makefile添加相关代码

在/drivers/Kconfig中的最后添加

source "drivers/memdev/Kconfig"

同时在/drivers/Makefile中添加

obj-$(CONFIG_MEMDEV)            += memdev/

然后编译kernel代码,把memdev选成M,编译成memdev.ko模块。

把memdev.ko拷贝到/system/lib/modules下,然后insmod memdev.ko

Android实现简单字符驱动程序及测试_第1张图片
这里加载驱动成功后,分配的主设备号为248, 然后在/dev目录下穿件节点

cd /dev

mknod  memdev  c  248  0 


这个时候驱动就加载完了,现在我们需要写一个测试程序来测试这个驱动的正确性

在ics/external中创建一个memdevapp目录

在这目录下创建memdevapp.c测试程序

#include #include #include #include #define DEVICE_NAME "/dev/memdev"int main(int argc, char** argv){int fd = -1;int val = 1;fd = open(DEVICE_NAME, O_RDWR);if(fd == -1){printf("Failed to open device %s\n", DEVICE_NAME);return -1;}printf("Read original value:\n");read(fd, &val, sizeof(val));printf("value == %d\n",val);val = 5;printf("Write value %d to %s\n", val, DEVICE_NAME);write(fd, &val, sizeof(val));printf("Read the value again:\n");read(fd, &val, sizeof(val));printf("value == %d\n",val);close(fd);return 0;}
同时创建Android.mk来编译这个可执行测试程序
LOCAL_PATH:=$(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS:=optionalLOCAL_MODULE:=memdevappLOCAL_SRC_FILES:=$(call all-subdir-c-files)include $(BUILD_EXECUTABLE)

这里的include $(BUILD_EXECUTABLE)就代表编译生成一个可执行性文件

Android实现简单字符驱动程序及测试_第2张图片

把这个可执行性文件memdevapp拷贝到板子的/system/bin下,然后./memdevapp

Android实现简单字符驱动程序及测试_第3张图片

更多相关文章

  1. 【引用】Android的CTS测试
  2. android core dump测试
  3. 测试你的Android应用程序
  4. Android CTS 4.03测试总结
  5. android okhttp+Retrofit 发送带有/ ^等特殊字符返回400
  6. EditText实时判断输入字符数
  7. Android Base64字符串转换成图片
  8. android折叠展开列表测试

随机推荐

  1. android listView滚动时隔行出现黑色分割
  2. [置顶] Android仿人人客户端(v5.7.1)——应
  3. Android(安卓)简单实现倒计时功能
  4. android中build.gradle文件简单说明
  5. 一篇文章看明白 Android(安卓)图形系统 S
  6. Android移动终端数据同步技术收集贴
  7. Android Studio制作简易计算器源代码及详
  8. Android 代码实现logcat输出到文件
  9. 使用BleLib的轻松搞定Android低功耗蓝牙B
  10. Android数据共享机制ContentProvider