2022-12-4----Android11(H713m)---- WiFi驱动添加写入mac号补丁

news2025/1/22 16:41:56

一、问题

用全志的写号工具,写入wifi_mac,设置下边不生效

二、分析

因为我们的WiFi不是用全志平台的,也不是用全志集成好的,而是用希微这家第三方的WiFi/BT,所以该驱动还没完善。

三、修改前的准备

用写号工具写号后,adb shell 打开 proc/comline,查看wifi_mac字段是否有内容,确保mac已经写入主控。

正确的如下:

三、修改步骤

1、修改framework

diff --git a/H713-v1.3/device/softwinner/ares/common/overlay/overlay/frameworks/opt/net/wifi/service/res/values/config.xml b/H713-v1.3/device/softwinner/ares/common/overlay/overlay/frameworks/opt/net/wifi/service/res/values/config.xml
index b5d94ba681..5fac8cd248 100644
--- a/H713-v1.3/device/softwinner/ares/common/overlay/overlay/frameworks/opt/net/wifi/service/res/values/config.xml
+++ b/H713-v1.3/device/softwinner/ares/common/overlay/overlay/frameworks/opt/net/wifi/service/res/values/config.xml
@@ -22,5 +22,5 @@
 
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Indicates that connected MAC randomization is supported on this device -->
-    <bool translatable="false" name="config_wifi_connected_mac_randomization_supported">true</bool>
+    <bool translatable="false" name="config_wifi_connected_mac_randomization_supported">false</bool>

config_wifi_connected_mac_randomization_supported 该属性要改为false,禁止上层随机生成mac号

2、驱动的修改

--- a/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/Makefile
+++ b/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/Makefile
@@ -25,7 +25,8 @@ skw-$(CONFIG_SKW_VENDOR) += skw_vendor.o
 skw-$(CONFIG_SKW_DFS_MASTER) += skw_dfs.o
 skw-$(CONFIG_SKW_TDLS) += skw_tdls.o
 
-ccflags-$(CONFIG_SKW_CALIB_DPD) += -DSKW_IMPORT_NS
+#ccflags-$(CONFIG_SKW_CALIB_DPD) += -DSKW_IMPORT_NS
+ccflags-y += -DSKW_IMPORT_NS
 
 ccflags-y += -I$(srctree)/include/linux/platform_data/
 
diff --git a/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_core.c b/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_core.c
index b3cfc17d0c..9c9dcbc379 100755
--- a/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_core.c
+++ b/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_core.c
@@ -2323,6 +2323,9 @@ static int skw_drv_probe(struct platform_device *pdev)
 	    skw_sync_chip_info(wiphy, &chip))
 		goto core_deinit;
 
+	if (!is_valid_ether_addr(skw_mac))
+		skw_get_mac_from_boot_cmd_line(skw_mac);/*add fungo 20241122 for wifi mac*/
+
 	skw_setup_mac_address(wiphy, skw_mac, chip.mac);
 
 	if (skw_calib_download(wiphy, skw->fw.calib_file) < 0)
diff --git a/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_util.c b/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_util.c
index 8c9f4ff4a0..941cabb333 100755
--- a/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_util.c
+++ b/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_util.c
@@ -85,9 +85,75 @@ void skw_file_close(struct file *fp)
 	filp_close(fp, NULL);
 }
 
+int skw_get_mac_from_boot_cmd_line(u8 *mac_addr)
+{
+	int ret = 0;
+	struct file *file;
+	loff_t pos = 0;
+	ssize_t len;
+	char *page;
+	char *wifi_mac = NULL;
+	char tmp_mac_addr[27] = {0};
+	char *saved_cmdline = NULL;
+	
+	page = (char *)__get_free_page(GFP_KERNEL);
+	if (!page) {
+		skw_err("Failed to allocate memory for cmdline\n");
+		return -ENOMEM;
+	}
+
+	file = filp_open("/proc/cmdline", O_RDONLY, 0);
+	if (IS_ERR(file)) {
+		skw_err("Could not open /proc/cmdline\n");
+		ret = -ENOENT;
+		goto free_page_exit;
+	}
+
+	len = kernel_read(file, page, PAGE_SIZE, &pos);
+	filp_close(file, NULL);
+
+	if (len < 0) {
+		skw_err("Error reading /proc/cmdline\n");
+		ret = -EIO;
+		goto free_page_exit;
+	}
+
+	saved_cmdline = kmalloc(len + 1, GFP_KERNEL);
+	if (!saved_cmdline) {
+		free_page((unsigned long)page);
+		ret = -ENOMEM;
+		goto free_page_exit;
+	}
+
+	strncpy(saved_cmdline, page, len);
+	saved_cmdline[len] = '\0';
+	wifi_mac = strstr(saved_cmdline, "wifi_mac=");
+
+	if (wifi_mac) {
+		memcpy(tmp_mac_addr, wifi_mac, 27);
+		tmp_mac_addr[26] = '\0';
+		skw_err("wifi_mac=%s\n", tmp_mac_addr);
+		ret = sscanf(tmp_mac_addr, "wifi_mac=%02X:%02X:%02X:%02X:%02X:%02X",
+			mac_addr, mac_addr + 1, mac_addr + 2,
+			mac_addr + 3, mac_addr + 4, mac_addr + 5);
+		if (ret != 6) {
+			skw_err("Invalid wifi_mac format\n");
+			ret = -EINVAL;
+		}
+	}
+
+	kfree(saved_cmdline);
+free_page_exit:
+	free_page((unsigned long)page);
+	skw_err("skw_get_mac_from_boot_cmd_line err!\n");
+	return ret;
+}
 MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
+#else
+int skw_get_mac_from_boot_cmd_line(u8 *mac_addr){
+	return 0;
+}
 #endif
-
 void *skw_build_presp_frame(struct wiphy *wiphy, struct skw_iface *iface,
 			u8 *da, u8 *sa, u8 *bssid, u8 *ssid, int ssid_len,
 			u16 chan, struct ieee80211_supported_band *sband,
diff --git a/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_util.h b/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_util.h
index f57c396fd6..2495f01931 100755
--- a/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_util.h
+++ b/H713-v1.3/longan/kernel/linux-5.4/drivers/net/wireless/seekwave/skw_util.h
@@ -311,6 +311,7 @@ int skw_file_sync(struct file *fp);
 void skw_file_close(struct file *fp);
 #endif
 
+int skw_get_mac_from_boot_cmd_line(u8 *mac_addr);
 u64 skw_local_clock(void);
 int skw_key_idx(u16 bitmap);
 char *skw_mgmt_name(u16 fc);

在wifi驱动的写入mac的地方进行逻辑修改,修改为从系统的cmdline读取wifi_mac字段,所以最核心的地方便是 skw_get_mac_from_boot_cmd_line 该函数。

3、se权限的修改

diff --git a/H713-v1.3/device/softwinner/common/config/wireless/initrc/init.wireless.bluetooth.rc b/H713-v1.3/device/softwinner/common/config/wireless/initrc/init.wireless.bluetooth.rc
index 065155d04c..aee1c580ab 100644
--- a/H713-v1.3/device/softwinner/common/config/wireless/initrc/init.wireless.bluetooth.rc
+++ b/H713-v1.3/device/softwinner/common/config/wireless/initrc/init.wireless.bluetooth.rc
@@ -4,6 +4,7 @@ on boot
     chown bluetooth net_bt_admin ${persist.vendor.bluetooth_port}
 
     # bluetooth power up/down interface
+    chmod 0777 /proc/cmdline
     chmod 0660 /sys/class/rfkill/rfkill0/state
     chmod 0660 /sys/class/rfkill/rfkill0/type
     chown bluetooth net_bt_admin /sys/class/rfkill/rfkill0/state
diff --git a/H713-v1.3/device/softwinner/common/sepolicy/vendor/hal_wifi_default.te b/H713-v1.3/device/softwinner/common/sepolicy/vendor/hal_wifi_default.te
index bea874c399..02d2271526 100644
--- a/H713-v1.3/device/softwinner/common/sepolicy/vendor/hal_wifi_default.te
+++ b/H713-v1.3/device/softwinner/common/sepolicy/vendor/hal_wifi_default.te
@@ -7,3 +7,4 @@ allow hal_wifi_default wifi_data_file:file getattr;
 allow hal_wifi_default vendor_data_file:dir { add_name write };
 allow hal_wifi_default vendor_data_file:file { create open write read};
 allow hal_wifi_default debugfs_wifi_tracing:dir search;
+allow hal_wifi_default proc_cmdline:file {read open};

读取cmdline报se权限错误,所以添加上

四、注意

该修改方法适用于 以ko方式加载驱动的形式,WiFi驱动是编译成ko,然后init.rc里进行insmod挂载驱动的。

为什么只能以ko的方式!

因为Android 的启动流程是

uboot------>kernel------->init------->系统层

众所周知,Android 的根目录是在init阶段形成的!

如果编译成.o,那么驱动将会在kernel进行挂载,这个时候读取cmdline绝对会报错!因为根本没有形成根目录!

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

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

相关文章

Linux笔记---进程:进程替换

1. 进程替换的概念 进程替换是指在一个正在运行的进程中&#xff0c;用一个新的程序替换当前进程的代码和数据&#xff0c;使得进程开始执行新的程序&#xff0c;而不是原来的程序。 这种技术通常用于在不创建新进程的情况下&#xff0c;改变进程的行为。 我们之前谈到过for…

Linux 权限管理:用户分类、权限解读与常见问题剖析

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 目录 &#x1f4af;L…

【开源】A060-基于Spring Boot的游戏交易系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)

1.插件版本 插件地址&#xff1a;Community Plugins | RabbitMQ rabbitmq插件需要对应的版本&#xff0c;根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是&#xff1a; 所以我选择插件版本是&#xff1a; 下载 .ez文…

elementui table滚动分页加载

文章目录 概要 简化的实现示例&#xff1a; 小结 概要 在使用 Element UI 的 Table 组件时&#xff0c;如果需要实现滚动分页加载的功能&#xff0c;可以通过监听 Table 的滚动事件来动态加载更多数据。 简化的实现示例&#xff1a; <template><el-table ref"…

书生浦语第四期--基础岛-第五关

文章目录 学习使用Xtuner微调大模型开始微调检查hf文件夹检查meraged文件夹启用WebUI 对话查看效果 学习使用Xtuner微调大模型 开始微调 检查hf文件夹 检查meraged文件夹 启用WebUI 对话 查看效果

基于Transformer的编码器-解码器图像描述模型在AMD GPU上的应用

Transformer based Encoder-Decoder models for image-captioning on AMD GPUs — ROCm Blogs 图像描述&#xff0c;即基于生成式人工智能&#xff08;GenAI&#xff09;自动生成简洁的图像文本描述&#xff0c;在现实世界中有着非常重要的应用。例如&#xff0c;图像描述可以为…

解决Jupyter Notebook无法转化为Pdf的问题(基于Typora非常实用)

笔者在完成各项作业和做笔记时&#xff0c;经常用到jupyter notebook&#xff1b;其因为可以同时运行python并提供格式化的数字公式的输入方式&#xff0c;得到了广大用户的喜爱。 当我们想要将.ipynb文件导出为pdf时&#xff0c;有两种常用方法。 1.Ctrlp 2.通过File ->…

ROS-plotjuggler的使用

简介 一个基于Qt的应用程序&#xff0c;允许用户加载、搜索和打印数据。通常对rosbag画图的辅助工具使用。 使用方法 启动 rosrun plotjuggler plotjuggler打开界面左上角&#xff0c;加载并选择相应数据 如果要用两个数据绘图&#xff0c;则ctrl选中后右键拖入

【笔记】离散数学 1-3 章

1. 数理逻辑 1.1 命题逻辑的基本概念 1.1.1 命题的概念 命题&#xff08;Proposition&#xff09;&#xff1a;是一个陈述句&#xff0c;它要么是真的&#xff08;true&#xff09;&#xff0c;要么是假的&#xff08;false&#xff09;&#xff0c;但不能同时为真和假。例如…

在服务器上实现本地python文件的依赖

1、在python中&#xff0c;一个python文件就可以视为一个模块进行导入 2、使用import 导入时&#xff0c;若使用pip 下载过可以直接导入 3、假如是自己写的同项目中的文件会去sys.path 中查找 比如说 我现在 test 下有一个 python文件 运行 下面的代码 打印的数据如上图所示p…

解决python 使用pip 安装模块时遇到的错误SSL: CERTIFICATE_VERIFY_FAILED

最近有一个使用python 2.7.* 使用requests模块的需求,在安装的过程中遇到了一个问题&#xff0c;在这里分享给大家&#xff01; 安装requests命令如下 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests 遗憾的是&#xff0c;报错了 Collecting requests …

蓝桥杯准备训练(lesson2 ,c++)

3.1 字符型 char //character的缩写在键盘上可以敲出各种字符&#xff0c;如&#xff1a; a &#xff0c; q &#xff0c; &#xff0c; # 等&#xff0c;这些符号都被称为字符&#xff0c;字符是⽤单引号括 起来的&#xff0c;如&#xff1a; ‘a’ &#xff0c; ‘b’ &…

opencvocr识别手机摄像头拍摄的指定区域文字,文字符合规则就语音报警

安装python&#xff0c;pycharm&#xff0c;自行安装。 Python下安装OpenCv 2.1 打开cmd,先安装opencv-python pip install opencv-python --user -i https://pypi.tuna.tsinghua.edu.cn/simple2.2 再安装opencv-contrib-python pip install opencv-contrib-python --user …

LabVIEW中“this VI‘s owning library is missing”错误及解决

问题描述 当加载或打开一个VI时&#xff0c;如果其所属的项目库未加载到内存&#xff0c;LabVIEW将提示错误&#xff1a;“this VIs owning library is missing”&#xff08;该VI的所属库不存在&#xff09;。 该问题通常发生在以下情况下&#xff1a; 项目库文件丢失或路径…

【效果】回到顶部功能实现

实现效果&#xff1a; 相关代码&#xff1a; <template><div class"cats" :style"{ top: catsTop }" ref"cats" click"catTop"></div> </template> 样式&#xff1a; /* 回到顶部 - 小猫咪 */ .cats {posi…

算法第一弹-----双指针

目录 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.查找总价值为目标值的两个商品 7.三数之和 8.四数之和 双指针通常是指在解决问题时&#xff0c;同时使用两个指针&#xff08;变量&#xff0c;常用来指向数组、链表等数据结构中的元素位置&am…

计算机网络期末复习-part1-概述

1、互联网的组成 互联网由两大块组成。 1、边沿部分&#xff1a;由所有连接在互联网上的主机组成&#xff0c;是用户直接使用的部分。 2、核心部分&#xff0c;由大量网络和路由器组成&#xff0c;为边缘部分提供服务。 2、数据传送阶段的三种交换方式的主要特点 1、电路交…

【Linux系统编程】——理解冯诺依曼体系结构

文章目录 冯诺依曼体系结构硬件当代计算机是性价比的产物冯诺依曼的存储冯诺依曼的数据流动步骤冯诺依曼结构总结 冯诺依曼体系结构硬件 下面是整个冯诺依曼体系结构 冯诺依曼结构&#xff08;Von Neumann Architecture&#xff09;是现代计算机的基本结构之一&#xff0c;由数…

微信创建小程序码 - 数量不受限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;且不受数量限制。 目录 文档 接口地址 请求方式 功能描述 注意事项 获取 scene 值 请求参数 返回参数 对接 请求方法 获取小程序码 调用获取小程序码 总结 文档 接口地址 https://api.weixin.qq.com/wxa/get…