Android 驱动学习调试

news2024/11/16 11:38:48

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新恶意软件使用 MSIX 软件包来感染 Windows

人们发现&#xff0c;一种新的网络攻击活动正在使用 MSIX&#xff08;一种 Windows 应用程序打包格式&#xff09;来感染 Windows PC&#xff0c;并通过将隐秘的恶意软件加载程序放入受害者的 PC 中来逃避检测。 Elastic Security Labs 的研究人员发现&#xff0c;开发人员通常…

华为机试题:HJ8 合并表记录

目录 第一章、算法题1.1&#xff09;题目描述1.2&#xff09;解题思路与答案1.3&#xff09;牛客链接 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.1&#xff09;题目描述 题目描述&…

谁知道腾讯云轻量服务器“月流量”是什么意思?

腾讯云轻量服务器月流量什么意思&#xff1f;月流量是指轻量服务器限制每月流量的意思&#xff0c;不能肆无忌惮地使用公网&#xff0c;流量超额需要另外支付流量费&#xff0c;上海/广州/北京等地域的轻量服务器月流量不够用超额部分按照0.8元/GB的价格支付流量费。阿腾云aten…

cocos tilemap的setTileGIDAt方法不实时更新

需要取消勾选 Enable Culling。同时代码添加&#xff1a;markForUpdateRenderData函数。 floor.setTileGIDAt(102427,newP.x,newP.y,0); //中心 floor.markForUpdateRenderData(); 具体问题参考官网说明&#xff1a; Cocos Creator 3.2 手册 - 项目设置

软考网工历年简答题汇总(2016下半年~2023年上半年)

目录 2016年下半年 2018年上半年 2018年下半年 2021年上半年 2022年上半年 2022年下半年 2023年上半年 2016年下半年 试题一&#xff1a; 【问题 3】若地址规划如图 1-1 所示&#xff0c;从IP 规划方案看该地址的配置可能有哪些方面的考虑&#xff1f; 答案&#xff…

博客系统的前后端实现

前面的学习中, 我们基于 HTML, CSS, JavaScript 实现了一个简单的博客系统的页面. 接下来我们基于博客系统页面来实现一个带服务器版本的博客程序. 1.准备工作 1.创建项目 2.引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns…

简单聊聊远程协同运维定义以及优势-行云管家

很多新人小伙伴对于远程协同运维不是很了解&#xff0c;今天我们就来简单聊聊远程协同运维定义以及优势。 远程协同运维定义 远程协同运维其实非常容易理解&#xff0c;主要是指计算机系统技术服务工程相关的人员通过局域网或者是其他网络对于它来进行连接&#xff0c;共同远…

【PyQt学习篇 · ⑦】:QWidget - 父子关系扩充和层级控制

文章目录 父子关系扩充常用API案例 层级控制案例 父子关系扩充 常用API childAt(x, y) 函数可以根据传入的坐标参数获取该QWidget中位于该坐标位置的子QWidget&#xff0c;如果该位置没有子QWidget则返回None。 parentWidget() 函数可以获取当前QWidget的父QWidget&#xff0…

k8s之pod

目录 一、Pod基础概念 1.1 在Kubrenetes集群中Pod有如下两种使用方式 1.2 pod的种类 二、容器的分类 &#xff08;1&#xff09;基础容器&#xff08;pause&#xff09; &#xff08;2&#xff09;初始化容器&#xff08;initcontainers&#xff09; &#xff08;3&#…

数字经济之于城市碳排放:“加速器”抑或“减速带”?

数据简介&#xff1a;数字经济是我国经济高质量发展的核心驱动力&#xff0c;在提升碳福利绩效过程中发挥重要作用&#xff0c;其在许多方面都能提供减少碳排放的机会。通过数字化和物联网技术&#xff0c;能源系统、交通运输、城市规划等领域可以实现智能化管理和优化&#xf…

VPN与IP代理用哪个好?有何区别?

当谈到网络安全和IP变更时&#xff0c;人们会想到VPN和IP代理服务器。很多人很困惑&#xff0c;它们之间有什么区别&#xff0c;应该选择哪一个呢&#xff1f;这取决于您的需求来决定哪一个更好。 一、什么是VPN与IP代理&#xff1f; VPN 是虚拟专用网络 (Virtual Private Net…

软件测试进阶篇----接口测试

接口测试 一、接口的概述 接口是什么&#xff1f; 在系统与系统之间、子系统与子系统之间数据交互的功能就是接口。 接口就是一个特定功能的函数&#xff08;方法&#xff09;&#xff0c;有参数&#xff0c;有返回值&#xff0c;调用者需要通过某种方式&#xff08;网络协议&…

CVE-2021-21234 spring-boot-actuator-logview目录遍历漏洞

0x01 影响版本 Spring-Boot-Actuator-logview < 0.2.13 0x02 漏洞分析 源码中对filename进行了校验但并未对路径进行校验 校验函数如下&#xff1a; 0x03 漏洞复现 首先开vulhub的镜像 点击下载&#xff0c;原数据包如下 送入repeater打入payload&#xff0c;复现…

【机器学习】一、机器学习概述与模型的评估、选择

机器学习简介 由来 阿瑟.萨缪尔Arthur Samuel,1952年研制了一个具有自学习能力的西洋跳棋程序&#xff0c;1956年应约翰.麦卡锡John McCarthy&#xff08;人工智能之父&#xff09;之邀&#xff0c;在标志着人工智能学科诞生的达特茅斯会议上介绍这项工作。他发明了“机器学习…

视频增强修复软件Topaz Video AI mac中文版支持功能

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频&#xff0c;包括低分辨率视频、老旧影片、手机录制的视频等等。 使用Topaz Video AI非常简单&#xff…

一文搞懂隐私计算

隐私计算 1. 安全多方计算2. 联邦学习3. 可信执行环境4. 隐私计算三类技术比较 隐私计算&#xff08;Privacy computing&#xff09;是指在保证数据不对外泄露的前提下&#xff0c;由两个或多个参与方联合完成数据分析计算相关技术的统称。 隐私计算作为跨学科技术&#xff0c…

如何优雅地单元测试 Kotlin/Java 中的 private 方法?

翻译自 https://medium.com/mindorks/how-to-unit-test-private-methods-in-java-and-kotlin-d3cae49dccd ❓如何单元测试 Kotlin/Java 中的 private 方法❓ 首先&#xff0c;开发者应该测试代码里的 private 私有方法吗&#xff1f; 直接信任这些私有方法&#xff0c;测试到…

Leetcode—169.多数元素【简单】

2023每日刷题&#xff08;十四&#xff09; Leetcode—169.多数元素 算法思想 由于nums中一定存在多数元素&#xff0c;所以将nums数组元素递增排序&#xff0c;取出位置的元素即可 实现代码 class Solution { public:int majorityElement(vector<int>& nums) {s…

视频转gif表情怎么操作?一键提取gif动画

通过电影、电视剧等视频转换gif动画&#xff0c;效果非常的吸引人。但是很多视频转换gif的工具要么是需要下载要么就是操作起来很复杂。其实&#xff0c;大家只需要使用gif动画图片&#xff08;https://www.gif.cn/&#xff09;制作工具&#xff0c;不用下载任何软件&#xff0…

前端基础---跳转相关的功能

后端给链接地址并且给token进行跳转 如果点击有key4&#xff0c;说明要跳转到相应的页面 auth是通过后端获取的地址&#xff0c; jdk是后端获取的相应的token&#xff0c; 然后进行拼接&#xff0c;进行window.open&#xff08;&#xff09;进行跳转 if (key 4) {var testUrl …