MTK wifi 驱动相关
wmt_chrdev_wifi.c :
#define WIFI_DEV_MAJOR 153 <--->对应init.rc中创建的设备节点 /xxx/mediatek/custom/jrdsh75_cu_jb/factory/init.rc
static int WIFI_major = WIFI_DEV_MAJOR;
WIFI_init()
dev_t dev = MKDEV(WIFI_major, 0);
-->cdev_init (&WIFI_cdev, &WIFI_fops)-->struct file_operations WIFI_fops = {
.open = WIFI_open,
.release = WIFI_close,
.write = WIFI_write,
};
-->WIFI_open()
-->WIFI_close()
-->WIFI_write()
上层开wifi调用驱动
mtk_wifi.c:
-->wifi_set_power(int enable)
-->halDoCommand("load wifi");//调用驱动
。。。。。
HaldController.cpp
-->int HaldController::loadDriver(const char *ifname)
{
ALOGD("Start load wifi driver.");
/*load wifi driver*/
sDriverCtrl->load(NETWORK_IFACE_WIFI);
/*turn on wifi power*/
powerOn();
/*set flag*/
isWifiActive = true;
return 0;
}
-->powerOn()
{
setPower(1);
}
-->void HaldController::setPower(int enable)
{
373 const char buffer = (enable ? '1' : '0');
374
375 fd = open(WIFI_POWER_PATH, O_WRONLY); //打开节点?? #define WIFI_POWER_PATH "/dev/wmtWifi"
376 if (fd < 0) {
377 ALOGE("Open \"%s\" failed", WIFI_POWER_PATH);
378 goto out;
379 }
380 sz = write(fd, &buffer, 1);
381 if (sz < 0) {
382 ALOGE("Set \"%s\" [%c] failed", WIFI_POWER_PATH, buffer);
383 goto out;
384 }
}
//节点创建 init.rc
mknod /dev/wmtWifi c 153 0 <---> 对应wmt_chrdev_wifi.c #define WIFI_DEV_MAJOR 153
因此上层从
fd = open(WIFI_POWER_PATH, O_WRONLY);执行到wmt_chrdev_wifi.c 中open
sz = write(fd, &buffer, 1); 执行到wmt_chrdev_wifi.c 中write
Settings.java(mWifiEnabler)-->WifiEnabler.java(mWifiManager)-->WifiManager.java(mservices)-->IWifiManager.aidl-->WifiService.java( mWifiStateMachine.setWifiEnabled(enable);
)-->WifiStateMachine.java({
public void setWifiEnabled(boolean enable) {
mLastEnableUid.set(Binder.getCallingUid());
if (enable) {
/* Argument is the state that is entered prior to load */
sendMessage(obtainMessage(CMD_LOAD_DRIVER, WIFI_STATE_ENABLING, 0));//加载驱动
sendMessage(CMD_START_SUPPLICANT);//用于数据通信
} else {
sendMessage(CMD_STOP_SUPPLICANT);
/* Argument is the state that is entered upon success */
sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_STATE_DISABLED, 0));
}
}
})-->WifiNative.java(mwifinative.loadDriver())-->android_net_wifi_wifi.cpp(android_net_wifi_loadDriver())-->mtk_wifi.c(wifi_load_driver())??(有木有已经和上面接轨了!!)
芯片上电
wmt_ctrl.c -->wmt_ctrl_hw_pwr_on(P_WMT_CTRL_DATA pWmtCtrlData)<wmt_plat_pwr_ctrl(FUNC_ON)> --wmt_plat_alps.c-->INT32 wmt_plat_pwr_ctrl ( ENUM_FUNC_STATE state )--< case FUNC_ON:
// TODO:[ChangeFeature][George] always output this or by request throuth /proc or sysfs?
wmt_plat_dump_pin_conf();
ret = mtk_wcn_cmb_hw_pwr_on();
>----mtk_wcn_cmb_hw_6628.c-->(mtk_wcn_cmb_hw_pwr_on (VOID)--->找到wifi的管脚中断WIFI_EINT(GPIO15)及外部中断号WIFI_EINT_NUM(18)
)
/XXX/mediatek/custom/jrdsh75_cu_jb/kernel/core/src/board.c -->中断请求
-->通过中断号WIFI_EINT_NUM(18)-->mtk_wcn_cmb_sdio_eint_num=CUST_EINT_WIFI_NUM=18
static void mtk_wcn_cmb_sdio_request_eirq(sdio_irq_handler_t irq_handler, void *data)
{
mtk_wcn_sdio_irq_flag_set (0);
mtk_wcn_cmb_sdio_eirq_data = data;
mtk_wcn_cmb_sdio_eirq_handler = irq_handler;
mt65xx_eint_set_sens(mtk_wcn_cmb_sdio_eint_num, CUST_EINT_WIFI_SENSITIVE); /*CUST_EINT_WIFI_NUM */
mt65xx_eint_set_hw_debounce(mtk_wcn_cmb_sdio_eint_num, CUST_EINT_WIFI_DEBOUNCE_CN); /*CUST_EINT_WIFI_NUM */
mt_set_gpio_pull_enable(mtk_wcn_cmb_sdio_eint_pin, GPIO_PULL_ENABLE);
mt_set_gpio_pull_select(mtk_wcn_cmb_sdio_eint_pin, GPIO_PULL_UP);
mt65xx_eint_registration(mtk_wcn_cmb_sdio_eint_num/*CUST_EINT_WIFI_NUM */,
CUST_EINT_WIFI_DEBOUNCE_EN,
CUST_EINT_WIFI_POLARITY,
mtk_wcn_cmb_sdio_eirq_handler_stub,
0);
mt65xx_eint_mask(mtk_wcn_cmb_sdio_eint_num);/*CUST_EINT_WIFI_NUM */
}
--> .request_sdio_eirq = mtk_wcn_cmb_sdio_request_eirq,
再找request_sdio_eirq相关中断请求----->找到sd.c
if (hw->request_sdio_eirq) /* set to combo_sdio_request_eirq() for WIFI */
hw->request_sdio_eirq(msdc_eirq_sdio, (void*)host); /* msdc_eirq_sdio() will be called when EIRQ */
-->找到msdc_eirq_sdio------------->中断处理函数
/* msdc_eirq_sdio() will be called when EIRQ(for WIFI) */
static void msdc_eirq_sdio(void *data)
{
struct msdc_host *host = (struct msdc_host *)data;
N_MSG(INT, "SDIO EINT");
mmc_signal_sdio_irq(host->mmc);
}
Gl_init.c-->启动gl_kal.c的tx_thread线程,当这个线程启动后就等待中断处理网络数据的发送与接收。<----->网络驱动函数
sdio.c ------->static void mtk_sdio_interrupt(struct sdio_func *func)-->wake_up_interruptible(&prGlueInfo->waitq);就会去调用
gl_kal.c --->int tx_thread(void *data)-->ret = wait_event_interruptible(prGlueInfo->waitq,(prGlueInfo->u4Flag != 0));
wlan_lib.c---->wlanTxPendingPackets (
IN P_ADAPTER_T prAdapter,
IN OUT PBOOLEAN pfgHwAccess
)
MTK wifi 驱动相关相关推荐
- openwrt配置内核驱动_为斐讯K2P编译OpenWRT LEDE,并启用mtk闭源wifi驱动及H3C认证
写在最前:只有A1/A2版的K2P才能照本文编译固件并刷入,B1/B2版切莫作死. 一.简述 写在最前,只有A1/A2版本的K2P能照本文编译固件并刷入,B1版本切莫作死.虽然斐讯迟早翻车 现在已经翻 ...
- 【硬件和驱动相关】wifi设备没有工作 ubuntu18.0.4 无线网卡 intel 6 AX200
关联博客: [硬件和驱动]如何查看linux的驱动有没有装好 --声卡无声音,有驱动为例子,网卡wifi驱动相关 [硬件]搭建自己的深度学习服务器 or 高性能电脑--从0到1装机指南 环境:linu ...
- 移植MT76x8 私有WIFI驱动V4.1.0.0到Openwrt 18.06所遇到的坑
Openwrt系统,路由或者IOT网关方面,市面上能供个人或者小团队甚至小企业 ,可玩性高的也就MT76xx系列路由芯片了,其中很大一部分原因主要在于MTK的WIFI驱动管控不是很严格,相对较容易获取 ...
- 【转】openwrt15.05使用mt7620官方wifi驱动及apcli
网上关于在openwrt上使用mt7620的官方wifi驱动的文章已经,但在亲自实践中总是有些不足,本文记录下调试过程,供有需要的人参考. 1.驱动版本 mtk是有提供官方的openwrt版本的,网上 ...
- MTK 驱动(69)---MTK平台 电池驱动相关
MTK平台 电池驱动相关 MTK平台 电池驱动 一.相关代码路径(mt6755/Android6.0) alps/kernel-3.18/drivers/misc/mediatek/include/m ...
- MTK Wlan驱动功能
目录 驱动文件分析 内核层 WifiStateMachine.java 层 驱动文件分析 最近查一下MTK Wifi的一个Mac Address功能,结果查找代码,竟然在kernel下 找不到代码,真 ...
- wifi linux 驱动分析,Linux 下wifi 驱动开发(二)—— WiFi模块浅析
一.什么是wifi 模块百度百科上这样定义: Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE8 ...
- hi3516配置wifi_HISI 3516A移植mt7601u的wifi驱动
第一步:下载驱动 mt7601u的wifi驱动有两部分:STA和AP. 下载地址如下: 第二步:将驱动或模块编译进内核 1.解压驱动代码并copy到\osdrv\opensource\kernel\l ...
- Linux 下wifi 驱动开发(二)—— WiFi模块浅析
一.什么是wifi 模块 百度百科上这样定义: Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE ...
最新文章
- 如何选择正确的标签?
- 为什么我的电脑上安装不上python-python安装不上
- C语言ftell()函数(返回文件当前位置)(返回给定流 stream 的当前文件位置)
- RabbitMQ 消息确认机制confirm代码编写
- 2.1.决策树和随机森林
- overflow-x理解_前端系列学习笔记
- 25大技术主题向您发出最后一次约【惠】邀请
- 深度学习attention原理_深度学习Anchor Boxes原理与实战技术
- php easysms,二次开发-如何在PHPEMS-发送短信验证码(以easy-sms为例)
- 微信小程序盲盒-可对接微信支付
- 鸿蒙系统下滑线怎么设置,微信下划线昵称教程来了,快来试试!
- python机械臂怎么控制_Python编程语言趣味学,EV3工业机械臂上线
- Java基础-标识符
- 莫兰迪配色RGB对照表
- 论文阅读《FSCE: Few-Shot Object Detection via Contrastive Proposal Encoding》
- Python基础:第25课——使用类和实例
- nRF keil工程错误相关
- mysql程序选项有两种通用形式:长选项和短选项_MySQL程序概述
- 电商项目——商品规格管理
- Lottie- 让Android动画实现更简单
热门文章
- 双极权电阻网络串联电阻阻值推导
- Seata Saga 模式快速入门和最佳实践
- 聚焦安卓热:中国为何如此热衷安卓
- 程序员被空姐骗到香港做传销!(当事人讲述完整详细版)
- 计算机硬件基础-CPU
- CentOS7 linux ifconfig 没有ens33网卡 连不上网
- 一起做激光反光板(一)-EKF定位公式推导
- 负和、零和与正和(博弈论的诡计)
- Matlab软件使用讲解(5),Matlab数学工程计算2023a中文版下载安装教程
- ceph 版本升级_Ceph V10.2.0 Jewel正式版本发布