Android 驱动学习调试

1 Android 驱动代码编译

参考https://www.sharetechnote.com/html/Linux_DeviceDriver_Programing.html#Device_Driver_HelloWorld编译ko文件调试驱动代码,将ko文件push到手机上验证

相关C文件testdriver.c

#include <linux/init.h>
#include <linux/module.h>
static int __init testdriver_init(void)
{
    printk("Test Driver Initialized\n");
    return 0;
}
static void __exit testdriver_exit(void)
{
    printk("Test Driver Being Removed\n");
}
module_init(testdriver_init);
module_exit(testdriver_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ShareTechnote");
MODULE_DESCRIPTION("Test Driver : The Simplest Driver");
MODULE_VERSION("1.0.0");

相关Make file文件如下

obj-m += testdriver.o 
KDIR  := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd) 
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules

Make编译

编译成功后push到手机上data/data目录,安装后报错

insmod: failed to load testdriver.ko: Exec format error

原因1:内核版本不一致

手机内核版本,使用uname -r

电脑内核版本为:5.4.0-137-generic

原因2:网上搜索后需要使用ARM交叉编译

Make file参考网络建议修改Makefile,相关Make file文件如下

obj-m += testdriver.o

KDIR  := ${OUT}/obj/KERNEL_OBJ/

$(info kdir is $(KDIR))

PWD := $(shell pwd)

$(info pwd is $(PWD))

default:

$(MAKE) CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1  ARCH=arm64 -C $(KDIR) M=$(PWD) modules

编译报错,尝试各种方式无法解决该问题

解决方案:搜索相关MTK基线上相关代码,在vendor\mediatek\kernel_modules上有MTK加的相关KO文件的编译,添加Android.mk,修改Makefile如下

Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

$(info zmao android mk start)

LOCAL_MODULE := testdriver.ko

LOCAL_PROPRIETARY_MODULE := true

LOCAL_MODULE_OWNER := mtk

LOCAL_SRC_FILES := \

testdriver.c \

Makefile

ifeq ($(TARGET_OUT_VENDOR),)

LOCAL_MODULE_PATH := $(ALPS_OUT)/vendor/lib/modules

else

LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/lib/modules

endif

$(info kernel mode is $(MTK_KERNEL_MODULE))

include $(MTK_KERNEL_MODULE)

Makefile文件

$(warning zmao start complie)

$(warning ########################### is $(srctree))

ccflags-y += -Wno-unused-variable

ldflags-y += -s

obj-m += testdriver.o

$(warning zmao success !!!!!!!)

成功编译出ko文件,push到手机上测试,成功安装驱动程序

2、调试驱动程序时出现 No such device or address Error

网上搜了很多,最后发现open函数没有执行,需要添加如下代码

    printk("zmao init start \n");

    cdev_init(&_cdev,&testdriver_fops);

    _cdev.owner = THIS_MODULE;

    _cdev.ops = &testdriver_fops;//Create Dev and file_operations Connected

    cdev_add(&_cdev,first,1);

    printk("zmao init end %d \n");

static int __init testdriver_init(void)

{

    printk("zmao Test Driver Initialized\n");

    if (alloc_chrdev_region(&first, 0, 3, "TestDriver") < 0)

{

        return -1;

    }

    printk("zmao <Major, Minor>: <%d, %d>\n", MAJOR(first), MINOR(first));

    if ((cl = class_create(THIS_MODULE, "chardrv")) == NULL)

    {

        printk(KERN_INFO "class_create() failed");

        unregister_chrdev_region(first, 1);

        return -1;

    }

    if (device_create(cl, NULL, first, NULL, "testdriver") == NULL)

    {

        printk("zmao device_create() failed");

        class_destroy(cl);

        unregister_chrdev_region(first, 1);

        return -1;

    }

    printk("zmao init start \n");

    cdev_init(&_cdev,&testdriver_fops);

    _cdev.owner = THIS_MODULE;

    _cdev.ops = &testdriver_fops;//Create Dev and file_operations Connected

    cdev_add(&_cdev,first,1);

    printk("zmao init end %d \n");

    return 0;

}

3、添加C进程访问内核驱动 

Android.mk文件

LOCAL_PATH := $(call my-dir)
$(info start client compile ++++)
include $(CLEAR_VARS)  
LOCAL_MODULE_TAGS := optional  
LOCAL_SRC_FILES := rwtest.c   
LOCAL_MODULE := rwtest
LOCAL_MODULE_CLASS := EXECUTABLES
$(info start client compile ----)
include $(BUILD_EXECUTABLE)

rwtest.c文件 

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
    int fd;
    int ret = 0;
    char buff[100];

    fd = open("/dev/testdriver",O_RDWR);

    if(fd < 0) {
        printf("/dev/testdriver open failed (ret = %d)\n",fd);
        return 1;
    };
    ret = read(fd,buff,10);
    printf("%s\n",buff);
    ret = write(fd,"Hello",6);
    close(fd);
    return 1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/112852.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云安全—kubelet攻击面

0x00 前言 虽然说总结的是kubelet的攻击面&#xff0c;但是在总结攻击面之前还是需要去了解kubelet的基本原理&#xff0c;虽然说我们浅尝即止&#xff0c;但是还是要以能给别人讲出来为基本原则。 其他文章: 云安全—K8s APi Server 6443 攻击面云安全—K8S API Server 未授…

08-Docker-网络管理

Docker 在网络管理这块提供了多种的网络选择方式&#xff0c;他们分别是桥接网络、主机网络、覆盖网络、MACLAN 网络、无桥接网络、自定义网络。 1-无桥接网络&#xff08;None Network&#xff09; 当使用无桥接网络时&#xff0c;容器不会分配 IP 地址&#xff0c;也不会连…

SpringCloud 微服务全栈体系(十)

第十章 RabbitMQ 一、初识 MQ 1. 同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得…

Sci Immunol丨Tim-3 适配器蛋白 Bat3 是耐受性树突状细胞

今天和大家分享一篇发表于2022年3月的文章&#xff0c;题目为“Tim-3 adapter protein Bat3 acts as an endogenous regulator of tolerogenic dendritic cell function”&#xff0c;发表在《Sci Immunol》杂志上。文章主要研究了Tim-3和其适配蛋白Bat3在调节免疫应答中的作用…

以八数码问题为例实现A*算法的求解(未完结)

八数码&#xff1a; 在一个 33 的网格中&#xff0c;1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如&#xff1a; 1 2 3 x 4 6 7 5 8在游戏过程中&#xff0c;可以把 x 与其上、下、左、右四个方向之一的数字交换&#xff08;如果存在&#xff09;。…

ssh远程登录服务

目录 1.1版本协商阶段 1.2密钥和算法协商阶段 1.3认证阶段(两种认证方法): 2.1.安装ssh 2.2.配置文件分析: 3.1配置ssh监听端口号 3.2拒绝以root身份登录服务器 3.3虚拟机之间实现免密登录 3.4xshell免密登录 SSH (Secure Shell Protocol,安全壳程序协议)由IETF的网络…

厦门万宾科技智能井盖监测仪器的作用如何?

越来越多的人们希望改善生活&#xff0c;走出农村走出大山&#xff0c;前往城市之中居住。由此城市的人口和车辆在不断增加&#xff0c;与之而来的是城市的交通压力越来越大&#xff0c;时常会出现道路安全隐患&#xff0c;这给城市未来发展和智慧城市建设都带来一定的难题&…

电脑开机显示器不亮?正确操作分享(4个方法)!

“我的电脑最近不知道为什么&#xff0c;每次开机后显示器都不亮&#xff0c;重启也没反应&#xff0c;有什么方法可以解决该问题吗&#xff1f;快帮帮我&#xff01;” 随着电脑在我们日常生活和工作中的广泛应用&#xff0c;出现问题时需要及时解决。在众多的电脑问题中&…

家政保洁团队服务预约小程序的效果如何

家政保洁可以是大公司也可以是小团队&#xff0c;但无论什么规格&#xff0c;其市场需求都是稳中有增&#xff0c;随着人们生活品质提升&#xff0c;其对居住环境/办公环境等都有一定要求&#xff0c;这意味着家政团队可以拓展同城乃至外地多个领域的生意。 但线下信息单一&am…

【Linux】第九站:make和makefile

文章目录 一、 Linux项目自动化构建工具make/Makefile1.make/makefile工作现象2.依赖关系与依赖方法3.如何清理4.为什么这里我们需要带上clean5.连续的make6.特殊符号 二、Linux下实现一个简单的进度条1.回车换行2.缓冲区3.倒计时的实现 一、 Linux项目自动化构建工具make/Make…

Mybatis—XML配置文件、动态SQL

学习完Mybatis的基本操作之后&#xff0c;继续学习Mybatis—XML配置文件、动态SQL。 目录 Mybatis的XML配置文件XML配置文件规范XML配置文件实现MybatisX的使用 Mybatis动态SQL动态SQL-if条件查询 \<if\>与\<where\>更新员工 \<set\>小结 动态SQL-\<forea…

RHCSA -- VMware虚拟机配置及破解密码

一、配置虚拟机 1、开启VMware&#xff08;自定义&#xff09; 2、设置虚拟机硬件兼容性&#xff08;默认&#xff09; 3、稍后安装虚拟机操作系统 4、选择为Linux的虚拟机 5、虚拟机机名 6、设置虚拟机处理器 7、设置虚拟机所连接的网络类型 8、选择磁盘类型 9、设置所选磁…

Linux--jdk,tomca,mysql安装、后端项目搭建

一、JDK和Tomcat的安装 1.JDK安装 直接上传到Linux服务器的&#xff0c;上传jdk、tomcat安装包 解压JDK安装包 //解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 置环境变量(JAVA_HOME和PATH) vim /etc/profile 在文件末尾添加以下内容&#xff1a; //java environment expo…

【算法|滑动窗口No.4】leetcode 485.最大连续 1 的个数 487.最大连续 1 的个数 II 1004. 最大连续1的个数 III

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

APISpace 天气预报查询API接口案例代码

1.天气预报查询API产品介绍 APISpace 的 天气预报查询&#xff0c;支持全国以及全球多个城市的天气查询&#xff0c;包含国内3400个城市以及国际4万个城市的实况数据&#xff0c;同时也支持全球任意经纬度查询&#xff0c;接口会返回该经纬度最近的站点信息&#xff1b;更新频率…

英语语法,时态总结,16种时态

文章目录 前言总体说明过去时一般过去时过去进行时过去完成时过去完成进行时 现在时一般现在时现在进行时现在完成时现在完成进行时 将来时一般将来时将来进行时将来完成时将来完成进行时 过去将来时一般过去将来时过去将来进行时过去将来完成时过去将来完成进行时 前言 学了这…

ChatGPT火了:还有哪些可以做的变现项目

一、写在前面 柴特鸡皮踢 大家都不陌生了 说实话&#xff0c;Chatgpt火了后&#xff0c;正经的项目没出来多少&#xff0c;出了一大批割九菜的。 为什么说是割韭菜&#xff0c;因为一群完全不懂技术&#xff0c;只会讲讲成功学、写作学、财经的大V也敢开社群、卖课。很多人听…

Linux的开发环境安装配置与后端项目部署

目录 一.安装开发环境 1.准备阶段 1.1 创建新目录 1.2 解压文件 2.JDK的安装与配置环境变量 2.1 解压jdk压缩包 2.2 配置环境变量 2.3 设置环境变量生效 2.4 验证是否安装成功 3.Tomcat的安装与使用 3.1 解压安装 3.2 开启服务 3.3 开放端口 3.4 访问成功 4.MySQ…

【嵌入式】HC32F07X CAN通讯配置和使用配置不同缓冲器以连续发送

一 背景说明 使用小华&#xff08;华大&#xff09;的MCU HC32F07X实现 CAN 通讯配置和使用 二 原理分析 【1】CAN原理说明&#xff08;参考文章《CAN通信详解》&#xff09;&#xff1a; CAN是控制器局域网络(Controller Area Network, CAN)的简称&#xff0c;是一种能够实现…

实在智能携手品牌商家,在活动会面中共谋发展

金秋十月&#xff0c;丰收的季节&#xff0c;也是商家们在双11大展拳脚的时刻。为迎战一年一度的双11大促&#xff0c;品牌商家在10月份卯足劲&#xff0c;制定一系列营销方案&#xff0c;争取为店铺带来更多流量和订单。 其中&#xff0c;舍得、同科医药、梅子熟了、宝洁、维…