mtkwifidriver驱动的分析
MTK_驱动总结文档
MTK_驱动总结文档G616 驱动文档总结在/mediatek/custom下会有好多重名的文件,在不同的文件夹里,最终会编译哪个文件是根据目录的优先级来判断brighter89_evdo_jb2 > mt6589 > xxmon也就是说如果brighter89_evdo_jb2 ,mt6589 , xxmon 同时存在一文件,最终编译的会是brighter89_evdo_jb2目录下的文件也可以通过/mediatek/custom/out/开判断,此文件时最终编译的文件运行/mediatek/dct/。
选择文件/mediatek/custom/brighter89_evdo_jb2/kernel/dct/dct /Edit,打开后可以修改GPIO的模式,上拉,下拉,输入,输出修改后点击“Save”和“Gen Code”重新编译:./makeMtk brighter89_evdo_jb2 codegen ./makeMtk brighter89_evdo_jb2 new pl lk kernel ./makeMtk brighter89_evdo_jb2 bootimage提交时替换bw/custom/project/g616/mediate/custom/brighter89_evdo_jb2/kernel/dct/dct修改CUSTOM_LK_LCM=hx8389b_qhd_dsi_vdoBOOT_LOGO=qhd //根据屏的分辨率CUSTOM_KERNEL_LCM=hx8389b_qhd_dsi_vdo LCM_HEIGHT=960 LCM_WIDTH=540/mediatek/custom/xxmon/kernel/lcm目录名与下hx8389b_qhd_dsi_vdo名字相同,目录下为驱动文件在/mediatek/custom/xxmon/kernel/lcm/mt65xx_lcm_下添加要添加的屏#if defined(HX8389B_QHD_DSI_VDO) &hx8389b_qhd_dsi_vdo_lcm_drv, #endif下修改CUSTOM_HAL_IMGSENSOR=ov5648_mipi_raw hi257_yuv //前后camera CUSTOM_HAL_MAIN_IMGSENSOR=ov5648_mipi_rawCUSTOM_HAL_SUB_IMGSENSOR=hi257_yuvCUSTOM_KERNEL_IMGSENSOR=ov5648_mipi_raw hi257_yuv //前后camera CUSTOM_KERNEL_MAIN_IMGSENSOR=ov5648_mipi_raw CUSTOM_KERNEL_SUB_IMGSENSOR=hi257_yuv驱动要添加的文件:/mediatek/custom/xxmon/kernel/imgsensor/ov5648_mipi _raw /mediatek/custom/xxmon/hal/imgsensor/ ov5648_mipi_raw//hi257前camera同理/mediatek/custom/xxmon/hal/imgsensor/src/ #if defined(OV5648_MIPI_RAW)RAW_INFO(OV5648MIPI_SENSOR_ID, SENSOR_DRVNAME_OV5648_MIPI_RAW, NULL), #endif /mediatek/custom/xxmon/kernel/imgsensor/src/ kd_ #if defined(OV5648_MIPI_RAW) {OV5648MIPI_SENSOR_ID,SENSOR_DRVNAME_OV5648_MIPI_RAW,OV5648MIPISensorInit}, #endifCamera电所在文件:/mediatek/custom/brighter89_evdo_jb2/kernel/camera/ camera/kd_camera_ 核心驱动文件:/mediatek/custom/xxmon/kernel/imgsensor/src /kd_ 如果修改HAL层参数编译命令如下:./makeMtk -t brighter89_evdo_jb2 mm mediatek/platform/mt6589/hardware/camera/下修改: CUSTOM_HAL_LENS=dw9714afCUSTOM_HAL_MAIN_LENS=dw9714af CUSTOM_KERNEL_LENS=dw9714afCUSTOM_KERNEL_MAIN_LENS=dw9714af添加对应的文件夹和驱动文件/G616/mediatek/custom/xxmon/kernel/lens/dw9714af/ M config/mt6589/M custom/brighter89_evdo_jb2/hal/lens/src/ M custom/xxmon/hal/inc/camera_custom_A custom/xxmon/hal/lens/dw9714af/lens_para_ M custom/xxmon/hal/lens/src/ A custom/xxmon/kernel/lens/dw9714af/ A custom/xxmon/kernel/lens/inc/M platform/mt6589/hardware/camera/core/featureio/drv/ lens/mcu_下修改:CUSTOM_KERNEL_FLASHLIGHT=constant_flashlight CUSTOM_HAL_FLASHLIGHT=constant_flashlight驱动核心:/mediatek/custom/xxmon/kernel/flashlight/src/kd_/mediatek/custom/xxmon/kernel/flashlight/constant_f lashlight/leds_G616用的bd7710gwl driver IC,leds_会有相应的更改,文件修改都放到bw目录下 HAL tunning 文件:mediatek/custom/brighter89_evdo_jb2/hal/camera/came ra/flash_tuning_下修改:CUSTOM_KERNEL_TOUCHPANEL=ft5336驱动文件:mediatek/custom/xxmon/kernel/touchpanel/ft5336/ft53 36_/home/chenjian/CJ_WORK/code/G616/mediatek/custom/br ighter89_evdo_jb2/kernel/touchpanel/ft5336/tpd_cust om_下修改:CUSTOM_KERNEL_ACCELEROMETER=lis3dh CUSTOM_KERNEL_ALSPS=tmd2772驱动文件:/mediatek/custom/xxmon/kernel/accelerometer/lis3dh/ //gsensor 配置I2c和Gsensor 的position/mediatek/custom/brighter89_evdo_jb2/kernel/acceler ometer/lis3dh/cust_ static struct acc_hw cust_acc_hw = { .i2c_num = 3,.direction = 6, //chenjian 20XX-12-26 modify gsensor position.power_id = MT65XX_POWER_NONE, /*!< LDO is not used */ .power_vol= VOL_DEFAULT, /*!< LDO is not used */.firlen = 0, //old value 16 /*!< don't enable low pass fileter */ };/mediatek/custom/xxmon/kernel/alsps/tmd2772/ //psensor light sensor 配置I2c和 light sensor上报数据/mediatek/custom/brighter89_evdo_jb2/kernel/alsps/t md2772/cust_.als_level = { 4, 40, 80, 120, 160, 240, 400, 800, 1200, 1600, 20XX, 3000, 5000, 8000, 65535}, .als_value = {0,20, 60, 100, 150, 240, 400, 600, 1000, 1500, 20XX,3000, 5000, 8000, 10000, 10000},配置xls/mediatek/build/tools/emigen/MT6589/MemoryDeviceLis t_都是MTK release的,需要添加的memory要在MemoryDeviceList_表里,且名字与/mediatek/custom/brighter89_evdo_jb2/preloader/inc/ custom_名字需一样如H9TP32A8JDBCPR_KGM 需和MemoryDeviceList_表的名字一样 #define BOARD_ID MT6589_EVB#define CS_PART_NUMBER[0] SD7DP28C_4G#define CS_PART_NUMBER[1] H9TP32A8JDBCPR_KGM Memory兼容:向下添加即可#define CS_PART_NUMBER[2] #define CS_PART_NUMBER[3] ….….9.音频参数硬件同事,通过工具修改,导出文件,替换如下目录/mediatek/custom/brighter89_evdo_jb2/cgen/inc/。
MTK软件培训课程(三)MTK驱动架构分析精品PPT课件
GDI和pixtel_UI的关系
GDI的实现
使用GDI_HANDLE,gdi_handle来操作 GDI对象,GDI的对象可以是layer,gif, jpeg等。 GDI函数返回一个GDI_RESULT GDI函数使用互斥来保护,进入GDI函数 时调用GDI_ENTER_CRITICAL_SECTION()退 出函数时调用GDI_EXIT_CRITICAL_SECTION()
Media Task线程从med_create开始创建,其实 med_create函数只是将入口地址传递给库里的 函数,由里面的函数来创建线程。
Med_create中传入了以下的函数:
med_task_main,
/* 线程入口,消息泵 */
med_init,/*源自初始化 ,指定空间分配*/NULL,
设置当前活动模块,通过stack_set_active_module_id 分发消息,通过消息号,找到对应的消息处理函数,
使用med_main函数。程序里面有很大的一个消息索 引 释放返回消息数据内存区域,free_ilm
Media Task消息
从med_maincam_main相应的消息处 理函数,这时从MDI发过来的一个消息 才被识别,并进入相应的消息处理函数。 这时,我们回过头来再来看我们前面在 MDI章节所分析的Preview实现的例子, 会更清晰一些。 原来的例子:Preview实现
Media Task
Media Task模块分成4个部分:
Camera Audio Image Video
Media Task
Media Task模块有以下的作用:
MTK驱动基本介绍
MTK驱动基本介绍MTK(Mediatek Inc.)是台湾联发科技股份有限公司的一个子公司,是一家全球领先的半导体芯片设计公司。
MTK驱动(Mediatek Driver)是联发科技开发的一款设备驱动程序,用于支持和管理MTK系列芯片的硬件设备。
MTK驱动的目的是为了提供对MTK芯片的各种硬件设备的支持,使其能够在计算机系统中正常工作。
MTK芯片广泛用于智能手机、平板电脑、智能家居、物联网等领域的设备,而MTK驱动则起到了连接和协调计算机系统和硬件设备之间的桥梁作用。
1.提供设备识别和连接:MTK驱动可以识别MTK芯片的硬件设备,并与计算机系统进行连接,完成设备的初始化和配置工作。
2.实现设备通信和数据传输:MTK驱动通过与设备之间的通信接口,实现了设备和计算机之间的数据传输和交互,包括文件的读写、音视频的传输和图像的显示等。
3.支持设备管理和控制:MTK驱动可以对MTK芯片的硬件设备进行管理和控制,包括设备的开关、功能设置、驱动安装和升级等。
4.提供系统稳定性和兼容性:MTK驱动经过严格的测试和验证,能够保证在不同的计算机系统环境下的稳定性和兼容性,确保硬件设备能够正常工作。
5.支持开发者和用户的需求:MTK驱动提供了丰富的开发工具和接口,为开发者和用户提供定制化和个性化的驱动支持,方便二次开发和扩展。
2.连接设备和计算机:使用USB数据线或其他连接方式将MTK芯片的硬件设备连接到计算机上。
3.设置设备连接模式:根据设备的不同,选择合适的连接模式,如USB存储模式、USB调试模式等。
4.等待系统安装驱动:当设备连接到计算机后,操作系统会自动检测并安装相应的MTK驱动程序,期间需要等待一段时间。
5.使用设备:一旦驱动安装完成,设备就可以在计算机上正常工作,可以进行文件传输、数据交互、驱动管理等操作。
总之,MTK驱动是一款重要的软件工具,为MTK芯片的硬件设备提供了必要的支持和管理功能,使其能够在计算机系统中正常工作。
MTK系统和驱动
驱动部分详细讲解 1 开机启动流程:
RESET Boot from BOOTROM
Receiving start- up pattern via UART1 within 150ms?
YES META Mode
NO
Switch PC to External Device Bank #0 Assign Supervisor Mode SP
Touch Panel
LCD LCD Display Display
Media IC
Camera
MTK软件分层初步解析
1、OS层:RTOS嵌入式实时操作系统。
在nucleus.h中看到操作系统的各类操作函数,其 主要作用是实时和效的去调度当前的多项任务, 合理的去管理内存,合理的管理当前资源如TIMER 等。 主模块:任务管理、定时器管理、存储器管理、 资源管理、事件管理、消息管理、队列管理、旗 语管理等。 提问:我们平常调用的kal_sleep_task函数是 如何通过OS实现的?
• 必须学会欣然面对的一种结果----被接纳
真思考如何为以后的发展开好头。
• 以具体的形式感谢招聘单位的接纳,如邮件、短信 • 考虑怎样使自己的知识能力更适应工作需要 • 把走进工作岗位当作职业生涯的重要的第一步,认
Thank you
Reserved_vector B Reserved_vector 未定义中断
IrqHandler B IrqHandler
IRQ
FiqHandler
FIQ 快速中断
…………………………. BL
C_Main 转C入口
谢谢!
求职应注意的礼仪
• 求职时最礼貌的修饰是淡妆 • 面试时最关键的神情是郑重
MTK驱动基本介绍
MTK驱动基本介绍
MTK驱动,也称为MediaTek驱动,是一种特定于联发科技(MediaTek)芯片的驱动程序。
联发科技是全球领先的半导体解决方案提
供商之一,其产品广泛应用于移动通信、家庭娱乐、无线通信和物联网等
领域。
MTK驱动的作用是连接计算机与MTK芯片设备之间的通信,使得计算
机可以与MTK芯片设备进行数据交互和控制。
这些设备包括智能手机、平
板电脑、物联网设备以及其他使用MTK芯片的电子产品。
MTK驱动是连接
计算机和这些设备之间桥梁的关键。
MTK驱动负责与芯片设备之间的通信协议,包括数据传输、设备识别、设备控制等功能。
它通过USB接口与计算机连接,并与操作系统进行交互,将设备的功能暴露给计算机使用者。
MTK驱动的正常工作对于设备的功能
和性能至关重要。
MTK驱动的开发是一个复杂而严谨的过程。
开发人员需要深入研究MTK芯片的架构和规范,并编写适配特定芯片的驱动程序。
他们还需要进
行严格的测试和验证,以确保驱动程序在各种情况下都能正常工作。
同时,开发人员还需要与MTK芯片的生产商保持密切合作,获取相关技术支持和
更新。
总之,MTK驱动是一种桥梁,将计算机与MTK芯片设备连接起来。
它
通过通信协议实现数据传输和设备控制,使得用户可以便捷地使用MTK芯
片设备。
MTK驱动的适应性和兼容性优势使得其成为移动通信和物联网领
域的重要组成部分。
同时,MTK驱动的安装和更新也是用户使用设备时需
要考虑的重要问题。
MTK_Ralink wifi开发及相关应用指南
目录1.VMware9虚拟机环境安装 (2)2.Ubuntu系统在VMware上安装 (7)3.RT5350开发环境搭建及错误处理 (40)4.编译RT5350 SDK(Uboot&&Kernel) (44)5.4M/16M和4M/32M的配置方法 (54)6.测试编译固件在开发板正常工作 (55)7.添加自己应用到SDK中 (59)8.添加驱动程序到SDK中,实现控制所有GPIO的电平 (62)9.GPIO复用功能配置说明 (67)10.项目实战---通过手机控制开发板上的LED (67)11.移植Openwrt系统到开发板上,保证无线,有线正常工作 (71)12.Apclient模式(AP+STA同时共存)实现中继功能WDS (75)13.SDK4.1 稳定性以图为证 (77)14.恢复模块出厂设置 (78)15.STA模式设置 (79)16.修改出厂默认参数 (82)17.设置终端串口为普通串口,做wifi转串口项目 (83)18.WEB升级root_uImage (83)19.量厂固件生成方法 (84)20、通过web界面,修改串口应用程序参数 (84)20.1、修改webui配置界面 (84)20.2、修改js与c语言交互 (85)20.3、添加应用程序保存在flash分区字段名 (85)20.4、添加应用程序接受更改的参数 (85)21、支持jffs2文件系统,掉电后保存用户数据 (86)21.1 配置内核 (86)21.2 添加支持jffs2的命令 (88)21.3 修改SDK默认分区,添加用户分区 (89)21.4 测试jffs2文件系统,掉电保存用户数据 (89)1.VMware9虚拟机环境安装1.1下载RT5350开发板资料后,里面有一个如下目录:这里是安装虚拟机全部软件如下图所示:进入<VMware9原版官方软件英文版>目录单击“VMware-workstation-full-9.0.0-812388”这个安装文件,会出现如下界面:选择“下一步”选择“Typical”选择“下一步”选择“下一步“后面的几个界面一直选择“下一步”就行了,然后会出现如下界面,选择“Continue”这时软件正在安装中,耐心的等待一段时间。
MTK手机设备驱动编写介绍
•
LCD_delay_HX8306A();\
•
}
•
#define LCD_DataWrite_HX8306A(_data) \
•
{\
•
*(volatile kal_uint32 *) LCD_HX8306A_DATA_ADDR=
((_data & 0xFF00)<<2)|((_data & 0xFF)<<1);\
TD_CTRL);
construct_local_para(sizeof(aux_id_struct),
aux_id_data->aux_id = AUX_ID_FLICK_OFF;
DRV_BuildPrimitive(flick_ilm, MOD_EINT_HISR, MOD_UEM, MSG_ID_AUX_ID, aux_id_data);
3. GPIO使用中需注意的问题
MTK手机设备驱动编写介绍
二.中断的配置与使用
<1>. 中断个数
8个 EINT0, EINT1为专用中断, EINT2-7 与GPIO等功能复用
<2>. 设置中断模式
通过DRV_TOOL或Gpio_init(void)来初始化,也可在程序中通过 GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada)随时修改
MTK手机设备驱动编写介绍
audcoeff_default.h
#define DEFAULT_SPEECH_LOUDSPK_MODE_PARA \ {\ 128, 224, 5128, 0, 374, 0, 400, 0 \ }
starty,kal_uint16 endx,kal_uint16 endy) • void LCD_EnterSleep_ST7549T(void) • void LCD_ExitSleep_ST7549T(void) • void LCD_SetContrast_ST7549T(kal_uint8 level)
MTK驱动调试相关总结
MTK驱动调试相关总结 2010-12-14 Ver:1.11 SIM卡2 T卡3 FLASH4 按键KEY5 IO配置6 ADC配置7 EINT配置8 FM驱动9 BT驱动10 TOUCHSCEEN驱动11 LCM驱动12 Sensor驱动13 背光灯、按键灯、振动器、PWM14 跑马灯15 移动传感器、四方传感器16 MP4、3GP播放17 音量参数、EQ参数、音频功放开关18 SMS、电话本等容量设置19 耳机插入、拔出检查、耳机按键处理20 充电器或USB插入、拔出检查、识别21 RF 配置22参考文档附录默认系统平台为MT6253,code版本:09B.W10.12.MP。
版本变更记录:Andy 2010.12.10 Ver:1.0Andy 2010-12-14 Ver:1.11 SIM卡F910(MT6253)SIM卡插槽与系统SIM卡号映射关系drv\src\switchControl_al.c// andy 2010.05.31 SIM卡插槽映射 __DRV_DUAL_SIM_INVERSE__//kal_bool sim_physicalSlotChanged;#ifdef __DRV_DUAL_SIM_INVERSE__kal_bool sim_physicalSlotChanged = KAL_TRUE ;#elsekal_bool sim_physicalSlotChanged = KAL_FALSE;#endif定制支持的SIM电压:Customer_sim_voltage_support.c/* For customer define ME support voltage of SIM *//* For 1.8V Tech. ME use ME_18V_30V *//* For 3.0V ONLY ME use ME_30V_ONLY *//* For 1.8V ONLY ME use ME_18V_ONLY */#define SIM_VOLTAGE_SUPPORT ME_18V_30Vsim_env SIM_GetCurrentEnv(void){(SIM_VOLTAGE_SUPPORT);return}MT6253的“4.3 SIM Interface”,介绍了SIM卡接口的情况。
MTK软件培训课程(三)MTK驱动架构分析精品PPT课件
MTK软件培训课程(三) 2005.11
Camera程序架构
MMI Task
Camera MMI
MDI Camera
GDI
MEDIA Task
Camera Driver
LCD Interface
HW- (LCM, ISP, MT6218, MT6219...)
Camera程序架构
MMI task
Camera APP:控制应用程序逻辑 MDI:应用程序接口层,直接操作Camera feature GDI: 处理Multi-layer,实现OSD
Media task
调用Camera驱动程序的接口层 Camera Driver
控制Camera Backend IC,Sensor以及LCD硬件
除了Camera模块外,Idle screen和Media Player 等也使用GDI。
GDI和pixtel_UI的关系
GDI的实现
使用GDI_HANDLE,gdi_handle来操作 GDI对象,GDI的对象可以是layer,gif, jpeg等。 GDI函数返回一个GDI_RESULT GDI函数使用互斥来保护,进入GDI函数 时调用GDI_ENTER_CRITICAL_SECTION()退 出函数时调用GDI_EXIT_CRITICAL_SECTION()
Graphics Device Interface
MTK的画图功能有两套体系,一套是 pixtel的体系,另一套是GDI。Pixtel的体 系比较老,它只能画单层的图像,如果 你想进行图像叠加,只能自己写程序来 实现。而GDI体系由于有硬件的支持,它 可以处理最多4个层数据的叠加,有很强 的表现能力。
Prview的状态机
MTK驱动
1.配置GPIO 并初始化gpio_drv.c内的void GPIO_init(void) 进行初始化1.DRV_WriteReg(GPIO_MODE1,0x0000) 设置模式2.DRV_Reg(GPIO_DIR1) |= 0x00FF 设置方向0 GPIOs are configured as input1 GPIOs are configured as output2.audio_pa配置音频对应Driver部分主要需要留意以下三支档案:afe.c AMP gpo settingaudcoeff.c 首先需要注意是的output channel的配置,配置错误将出现没有声音的现象。
(见audio_驱动.pdf) 此文件需要注意output channel 、FIR setting和echo参数的设置audcoeff_default.h 定义语音增强参数nvram_default_audio.c 此文件主要配置各音阶的音量AUD_VOLUME_CTN :call waiting tone, error tone, warning toneAUD_VOLUME_KEY :keypad tone]AUD_VOLUME_MIC :microphone inputAUD_VOLUME_FMR :FM radio soundAUD_VOLUME_SPH :speech sound (during phone call)AUD_VOLUME_SID :side tone (sound loop-back)AUD_VOLUME_MEDIA :music1.设置模式,方向,上拉gpio_drv.c 里配置2.afe.c 文件里void AFE_SwitchExtAmplifier( char sw_on )设置3.afe2.c 文件里void AFE_TurnOnExtAmplifier( void )void AFE_TurnOffExtAmplifier( void )进行调用.3.触摸屏先初始化,后期是自动配置1.在eint_var.c里看中断2.touch_panel_spi.h 配GPIO 口3.touch_panel_spi.c Implement serial interface4.touch_panel_custom.c Set ADC and coordinate calibration4.FM1.RDA5800_SerialComm.c 配GPIO 口2.RDA5800_drv.c 函数的实现5.跑马灯\背光灯1.custom_equipment.c 或者uem_gpio.c 中找2.SN3726_LIGHT_LED3.lcd_backlight_set6.MT6318 driver1.pmic_custom.c2.Engineer mode3.*#3646633# =>Device=>PMIC7.工程模式参数1.CustResDef.h8.软件调speecher大小1.Audcoeff.c2.DG_DL_SPEECH = 0X1000 指gain = 13.DG_MICPHONE = 0X1400 最大0x2000 gain = 29.项目(6225平台),原先做的900/1800双频,校准综测都是正常的。
无线网卡驱动分析与WLAN性能测试
*ifr, int cmd);
//ioctl 函数
(2)PCI 设备驱动结构
struct pci_driver
static struct pci_driver\
rt61_driver =
{ name: "rtt61_pci_tbl,//PCI 设备表象
头和链路层协议头。
(2)数据缓冲区指针 head、data、tail 和 end
其中 head 指针指向内存中已分配的用于承载网络数据
的缓冲区的起始地址;data 指针指向对应当前协议层有效数
据的起始地址;tail 指向对应当前协议层有效数据负载的结
尾地址,与 data 指针对应;end 指针指向内存中分配的数据
105
万方数据
首先要判断信道是否空闲。若空闲,随机退避一段时间后发 送;否则,暂不发送。
图 2 无线网卡结构
3 无线网卡驱动实现
在 LINUX 中,为了简化对设备的管理,所有外围的硬件 设备被归结为 3 类:字符设备、块设备和网络设备,如以太 网卡、无线网卡。
Linux 网络驱动程序的体系结构可以分为层,从上到下 分别为协议接口层、网络设备接口层提供实际功能的设备驱 动功能层,以及网络设备和网络媒介层。在设计网卡驱动程 序时,最主要的工作就是完成设备驱动功能层,使其满足自 己所需的功能。
//指向驱动程序的初始化函数 unsigned long base_addr;
//网络设备的 I/O 基地址 unsigned int irq; //设备使用的中断号 unsigned char dev_addr[MAX_ADDR_LEN];
//设备硬件地址 int (*open)(struct net_device *dev);
MTK平台驱动基本介绍
MTK平台驱动基本介绍----------MTK6239一:LCD文件位于custom\drv\LCD以菲利浦的一款240 X 400的屏为例介绍如何添加LCD驱动SIMCOM38_08B_GPRS.makLCD_MODULE = SUNRISE_2827TI_LCMMAIN_LCD_SIZE = 240 X 400Option.makCOM_DEFS_FOR_SUNRISE_2827TI_LCM = ILI9326 COLOR_LCD SUNRISE_2827TI_LCMTFT_MAINLCD WQVGA_MAINLCD在custom\drv\LCD添加SUNRISE_2827TI_LCM文件夹,下面有5个文件。
文件名同MTK 系统自带的(lcd.c、lcd_hw.h、lcd_sw.h、lcd_sw_inc.h、lcd_sw_rnd.h)。
SUNRISE -------------- 屏的厂家ILI9326 ----------------- 屏的驱动芯片LCM ---------------------- 屏240 X 400 ----------------- 屏的分辨率COLOR_LCD ---------- 彩色TFT_MAINLCD ------- 屏的类型,对应的还有CSTN,OLED。
目前主要是TFTWQVGA_MAINLCD ---- 屏的分辨率做了上述修改以后,编译时,lcd驱动就对应SUNRISE_2827TI_LCM文件夹里的驱动。
文件夹里的5个文件,通常lcd_hw.h和lcd_sw_rnd不需要修改,lcd_sw_inc.h只是定义屏的分辨率。
如下:#ifdef __MMI_MAINLCD_128X128__#define LCD_WIDTH 128#define LCD_HEIGHT 128#elif (defined(__MMI_MAINLCD_128X160__))#define LCD_WIDTH 128#define LCD_HEIGHT 160#elif (defined(__MMI_MAINLCD_176X220__))#define LCD_WIDTH 176#define LCD_HEIGHT 220#elif (defined(__MMI_MAINLCD_240X400__))#define LCD_WIDTH 240#define LCD_HEIGHT 400#endif#define UI_DEVICE_WIDTH LCD_WIDTH#define UI_DEVICE_HEIGHT LCD_HEIGHT修改比较多的是lcd.c和lcd_sw.h:lcd_sw.h#define LCD_CMD_DMA_MODE --------- 是否使用DMA方式?(DMA简单,速度快,通过MTK的寄存器进行操作,但灵活性差;非DMA方式,直接对地址操作,灵活性好,但速度会有影响。
mtkwifidriver驱动的分析
管理篇接收到扫描完毕nicRxSDIOAggReceiveRFBssdio有两个通道,两个通道获取数据的流程是一样的,1)通过prEnhDataStr->rRxInfo.u.u2NumValidRx0Len可以获取到该通道目前存储有多少数据包,通道数据包的存储量只有16个,如果超过16个则是固件问题,跳过看下一个通道的2)然后获取当前freeswrfb空闲空间是否够用,不够用则看下一个通道的。
3)可接收的聚合报文(管理帧)长度(u4RxAvailAggLen)为23524)循环遍历某个通道的报文,读到报文长度+4 然后按照4个字节对齐从u4RxAvailAggLen 扣减掉。
如果空间不够则跳出。
5)遍历完之后用2352减去u4RxAvailAggLen 可以得到总的数据长度通过dma获取数据到prRxCtrl->pucRxCoalescingBufPtr中1)6)遍历通道中报文数,把每个报文拷贝到prSwRfb->pucRecvBuff中,并且填充prSwRfb->ucPacketType和prSwRfb->ucStaRecIdx2)nicRxSetupRFB3)如果prSwRfb->pvPacket为空,则先将prSwRfb置成0,然后按照2352分配sk_buff,prSwRfb->pucRecvBuff指向skb->data,prSwRfb->pvPacket指向skb1)同时,prSwRfb->prHifRxHdr指向skb->data首部。
2)nicRxFillRFB3)从prHifRxHdr->ucHerderLenOffset获取出header的offset和MACHeaderLen4)设置prSwRfb->pvHeader指向skb->data越过prHifRxHdr + HIF_RX_HDR_SIZE + u4HeaderOffset,指向的将是beacon帧结构5)重置prSwRfb->u2HeaderLen=u4MacHeaderLen 和prSwRfb->u2PacketLen为原来skb->data长度减去(HIF_RX_HDR_SIZE + u4HeaderOffset)MacHeader 如下图:nicAddScanResult该函数分为replace和add部分,先讲解add部分Add1)如果prAdapter->rWlanInfo.u4ScanResultNum小于63则继续往下走2)先将prAdapter->rWlanInfo.arScanResult[i]到aucIE之前的部分设置为03)设置prAdapter->rWlanInfo.arScanResult[i].u4Length为aucIE之前的部分的长度+IE的长度4)拷贝mac地址到prAdapter->rWlanInfo.arScanResult[i].arMacAddress5)拷贝ssid到prAdapter->rWlanInfo.arScanResult[i].rSsid.aucSsid6)设置u4Privacy、rRssi、eNetworkTypeInUse、eOpMode等7)拷贝prConfiguration到prAdapter->rWlanInfo.arScanResult[i].rConfiguration中8)拷贝rSupportedRates到prAdapter->rWlanInfo.arScanResult[i].rSupportedRates中9)拷贝u2IELength到prAdapter->rWlanInfo.arScanResult[i].u4IELength10)如果u2IELength大于0 则检查aucScanIEBuf是否够放下当前bssdesc的IE部分,如果可以的话,则拷贝到aucScanIEBuf[prAdapter->rWlanInfo.u4ScanIEBufferUsage],然后设置指针到apucScanResultIEs[i]中,接下来重置u4ScanIEBufferUsage的值。
MTK平台驱动调试笔记
分类:LINUX一、【一】调试串口的设置驱动的调式过程经常需要通过trace工具看log的,trace前需要修改手机串口,有以下三种方法设置串口1 通过手机进入工程模式设置2 修改代码,修改Nvram_user_config.c中的NVRAM_EF_PORT_SETTING_DEFAULT[]3.通过META工具修改在连上meta:左上角选中NVRAM Editor,在跳出的对话框里选择other LID,再选择NVRAM_EF_PORT_SETTING_LID,接下来read from nvram,对话框右边就会出现串口的设置情况,对调tst_port_ps(输入0)和ps_port(输入99)的值,二【【二】关于gpio口Gpio的初始化在文件gpio_drv.c里,可以用MTK提供的工具配置也可以用代码在程序里直接操作,二者的选择要看有没有定义宏__CUST_NEW__工具初始化时要注意配置codegen.dws,该文件里配置的只是对gpio口的初始化,并不是所有的gpio口都要设置成工作时的模式,尤其是当作时钟和蓝牙部分的gpiio口,初始化时就设置成工作模式的话会造成电机电流过大的。
代码初始化时DRV_WriteReg()、DRV_Reg对gpio口寄存器操作,分别定义gpio口的模式,和方向(0:输入;1:输出),对单个gpio口操作用到以下函数(以gpio25为例):GPIO_ModeSetup(25, 0);设置GPIO25为模式0GPIO_InitIO(1,25);初始化GPIO25方向为输出GPIO_WriteIO(0, 25 );设值GPIO25输入低电平0三、【三】键盘设置1)键盘定义Keypad_def.c如果定义CUST_NEW,工具中的键盘定义对应在改文件里的KEYPAD_MAPPING(keypad_drv.h);2)硬件键盘定义与软件mmi键盘的对应nKeyPadMap[](Keybrd.c)3)工程模式键盘测试函数EntryFMKeypadTest()修改键盘测试时界面显示的键的名称1. 做好上面的第一第二两步2. FactoryModeSrc.c开始部分定义添加的键所要显示的名称,值,分别应用到keypad_layout[](确定要显示的位置),keypad_value[]3.在EntryFMKeypadTest()函数中的数组IdleScreenDigits[]里添加要显示的键4)如果要设置一个键不管在什么界面下都起作用的话(如手电筒开关或则其他需求)就需要在键盘的事件响应函数static voidKeyEventHandler(KEYBRD_MESSAGE *eventKey)里设置,根据键值条用相应的响应函数,不过该函数及时在锁屏状态下也会执行的,需要根据需要添加条件语句四、关于LCDlcm背光驱动分为两种控制方式:1. pwm这个是通过调占空比来调节亮度的持续信号;2. PFM这个是通过脉冲的个数来控制LCM背光亮度。
WiFi驱动分析
Generated by Foxit PDF Creator Foxit Software For evaluation only.TechWIFI驱动分析Generated by Foxit PDF Creator Foxit Software For evaluation only.Crack Our System to N810 System Analysis and Design Documents <Document identifier>Issue: <0.5> Issue Date: <01/10/2009>Revision HistoryDate <25/02/2009> Issue <0.5> First draft Description Author wylhistory目录1. 2. 3. 4. 5. 6. 7. 8. ABSTRACT .................................................................................................................................................. 3 INTRODUCTION ........................................................................................................................................ 3 用户使用流程 ............................................................................................................................................... 3 WIFI驱动的初始化 ...................................................................................................................................... 5 数据的发送 ................................................................................................................................................... 7 IOCTL的调用逻辑 ..................................................................................................................................... 11 电源管理相关的调用逻辑.......................................................................................................................... 14 剩下的问题 ................................................................................................................................................. 15Tech, 2008Page 2 of 15Generated by Foxit PDF Creator Foxit Software For evaluation only.Crack Our System to N810 System Analysis and Design Documents <Document identifier>Issue: <0.5> Issue Date: <01/10/2009>1. 2.Abstract.这里主要讲的是我对WIFI驱动的理解.Introduction因为将要负责WIFI驱动,所以就开始了WIFI驱动的学习,主要分析了WIFI驱动的初始 化,数据的发送流程以及和电源管理相关的部分.3.用户使用流程通常用户的做法就是打开一个socket, 调用一个ioctl, 等待消息返回, 收到消息后继续做下面的事情, 然后又等待内核消息的返回,如此循环. 比如我们的系统的流程就是这样的:Tech, 2008Page 3 of 15Generated by Foxit PDF Creator Foxit Software For evaluation only.Crack Our System to N810 System Analysis and Design Documents <Document identifier>Issue: <0.5> Issue Date: <01/10/2009>Tech, 2008Page 4 of 15Generated by Foxit PDF Creator Foxit Software For evaluation only.Crack Our System to N810 System Analysis and Design Documents <Document identifier>Issue: <0.5> Issue Date: <01/10/2009>4.WIFI驱动的初始化wifiwlan_init_moduleif (sbi_register(wlan_add_card, wlan_remove_card, wlan_pm, NULL) == NULL) { ret = WLAN_STATUS_FAILURE; goto done; }设置 wlan_add_callback = add; wlan_remove_callback = remove; wlan_pm_callback = pm; add wlan_add_card pm wlan_pmregister_mss_driver( &wlan_driver);sbi_probe_cardsdio mss_init_cardwifipwlanpriv = wlan_add_callback( card);wlan_add_card图4.1 wifi模块初始化这里主要的工作就是注册mmc driver,注册回调函数,包括电源管理的,包括设备添加的, 当然还有一些硬件初始化; 这里最重要的是wlan_add_card这个函数做了很多事情,我把我没有分析的代码都略过了:Tech, 2008Page 5 of 15Generated by Foxit PDF Creator Foxit Software For evaluation only.Crack Our System to N810 System Analysis and Design Documents <Document identifier>dev->wireless_handlers = (struct iw_handler_def *) &wlan_handler_def; 这里面有很多对于wifi 的操作函数比如 wlan_set_scanIssue: <0.5> Issue Date: <01/10/2009>wlan_add_carddev>hard_start_xmit = wlan_hard_start_xm it;wlan_create_thread(wlan_ service_main_thread, &priv>MainThread, "wlan_main_service");wlan_create_thread(wlan _reassociation_thread, &priv>ReassocThread, "wlan_reassoc_service");Wifi wlan_init_fw Firmware sbi_register_dev(pri v) register_netdevregister_netdevice wlan_reassociation _thread wlan_service_main_ thread priv>wlan_dev.ioport wlan_cmd_specific_ scan_ssid wlan_find_ssid_in_l ist wlan_associate disable_host_int_ma sk ifconfig eth0wlan_process_cmdresp wlan_process_event firmware wmm_process_tx图4.2wlan_add_card的逻辑这里创建了两个线程,一个用来处理基本的输入输出,那就是wlan_service_main_thread, 一个用来负责重新连接AP(当自动断开的时候),那就是wlan_reassociation_thread 还做了一些firmware的初始化;然后就是注册mmc设备,取得端口号;接着就是注册一个网 络设备,用来供上层访问,这时候就可以通过ifconfig来看到输出了,比如是eth0;最后是 一些用来使蓝牙和wifi能够共存的代码;Tech, 2008Page 6 of 15Generated by Foxit PDF Creator Foxit Software For evaluation only.Crack Our System to N810 System Analysis and Design Documents <Document identifier>Issue: <0.5> Issue Date: <01/10/2009>5.数据的发送Tech, 2008Page 7 of 15Generated by Foxit PDF Creator Foxit Software For evaluation only.Crack Our System to N810 System Analysis and Design Documents <Document identifier>Issue: <0.5> Issue Date: <01/10/2009>Tech, 2008Page 8 of 15Generated by Foxit PDF Creator Foxit Software For evaluation only.Crack Our System to N810 System Analysis and Design Documents <Document identifier> 图5.1发送数据的触发Issue: <0.5> Issue Date: <01/10/2009>数据的发送请求从tcp/ip层传到了这里, 于是通过唤醒WIFI的主线程的处理函数来发送具体 的数据请求; 下面看主线程里面的数据发送:Tech, 2008Page 9 of 15Generated by Foxit PDF Creator Foxit Software For evaluation only.Crack Our System to N810 System Analysis and Design Documents <Document identifier>Issue: <0.5> Issue Date: <01/10/2009>wlan_service_main_ threadwlan_process_cmdr espwlan_process_eventwmm_process_txwmm_pop_highest_ prio_skbwlan_process_tx(pri v);Adapter>CurrentTxSkb = Adapter>wmm.txSkbQ[ac]. next;wlan_send_single_p acketcopy Sbi_host_to_card wifiwmm_process_fw_i face_tx_xfer_startos_start_queue sbi_host_to_cardnetif_wake_queue, 如果停止就唤醒 wifi sdio mmc controller __netif_schedule(de v);sbi_host_to_card, wifi firmwaredev->next_sched = sd>output_queue; sd->output_queue = dev; raise_softirq_irq off(NET_TX_SOFTIRQ); net_tx_actionTech, 2008Page 10 of 15System Analysis and Design Documents Issue Date: <01/10/2009><Document identifier>可见最后数据是通过mmc总线发送到了wifi模组了,而且开始调度下一次的数据发送,至此,数据的发送过程已经分析完了,下面是ioctl的调用逻辑6. ioctl的调用逻辑之所以要分析这个,是因为上层和WIFI驱动打交道的方式,多半是通过ioctl的方式进行的,所以…看看它的调用逻辑:©Tech, 2008 Page 11 of 15System Analysis and Design Documents Issue Date: <01/10/2009> <Document identifier>user netlink socketioctl dev->do_ioctl(dev,ifr, cmd)wifiwlan_do_ioctlSwitch defaultSystem Analysis and Design Documents Issue Date: <01/10/2009><Document identifier>可以看到WIFI模块对ioctl的处理非常复杂,主要是要处理许多标准的调用,也要处理一些私有的调用;后面还要通过rtnl_notify给上层用户发送消息,这里也是一套机制,我也就不细说了。
MTK的驱动和MMI经验总结
MTK的驱动和MMI经验总结1.Windows必须安装在C盘,否则会出现modis编译问题。
2.语言和输入法移植2.1资源修改–这是我们需要修改的,2.2开始MTK已经帮你做好了。
2.1.1在mcu\plutommi\Customer\CustResource\PLUTO_MMI\ref_list.txt中添加新语言的字符串资源。
2.1.2用MCT工具生成新的字库,需要注意的是Language ID必须和ref_list.txt中一致。
2.1.3输入法资源包括Zi、T9和CStar。
2.1.3.1Zia.新建mcu\vendor\inputmethod\ZI\project\PROJECTNAME\v?_official\目录。
b.将第三方提供的Zi文件拷贝到该目录。
c.将所有ZI8DatXX.c文件扩展名改成.h文件,并将其包含到IMEResZi.h中。
d.将输入资源添加到mtk_gIMELDBArray 数组中。
e.上面步骤,第三方可能已经提供IMEResZi.h文件。
如果提供了就不用这些步骤了。
2.1.3.2T9将代码放到下面目录:mcu\vendor\inputmethod\T9\project\PROJECTNAME\v?_official\移植比较麻烦,具体参考:SOP_T9_Input_Method_Resource_Generation_07A.pdfSOP_T9_Input_Method_Resource_Generation_08B.pdfSOP_T9_Input_Method_Resource_Generation_09BV2.pdf2.1.3.3CStar不说了2.2SSC有几个文件需要修改。
a.mcu\ \plutommi\mmi\SSC\SSCInc\SSCStringHandle.h:增加新的SSC码,需要和ref_list.txt、FontRes.c中的一致。
#define SSC_AUTO "*#0000#"#define SSC_SCHINESE "*#0086#"#define SSC_TCHINESE "*#0886#"#define SSC_ENGLISH "*#0044#"#define SSC_DEFAULT "*#0044#"#define SSC_SPANISH "*#0034#"//添加你的SSC码//#define SSC_XXXXX "*#00XX#"2.3mcu\ \plutommi\mmi\SSC\SSCInc\SSCStringHandle.c:将新的SSC码加入到ssc_table2表中。
MTK平台驱动调试介绍
(二)EVT贴片软件的整合
1.配置 makefile
xxx_GPRS.mak(mcu\make) Option.mak(mcu\make) 不同的项目需求不同,需要修改和添加一些宏开关控制。 基本格式和步骤:
MXX_GPRS.mak: XXX_XXX = XXX XXX_XXX = NONE XXX_XXX = TRUE XXX_XXX = FALSE Option.mak: ifdef XXX_XXX ifneq ($(strip $( XXX_XXX)),FALSE) COM_DEFS += XXX_XXX endif endif 代码中就使用XXX_XXX来控制相关代码; #if defined(XXX_XXX) //add co3: case 4: case 5: default:
} for(i=0;i<temp;i++){ GPIO_WriteIO(0,7); for (j =0;j <100;j++) {} GPIO_WriteIO(1,7); for(j=0;j<20;j++) {} } …… } else{
模块调试:Backlight
\mcu\custom\drv\misc_drv\SIMC25_06B_BB\custom_equipment.c kal_bool custom_cfg_gpio_set_level(kal_uint8 gpio_dev_type, kal_uint8 gpio_dev_level ) { …… switch(gpio_dev_type) { case GPIO_DEV_LED_MAINLCD:
GPIO_WriteIO(0,7);
…… }
PWM模式:需要根据实际情况在Mcu\custom\drv\misc_drv\custom_hw_default.c文件中 修改PWM_Level_Info;即频率和占空比。
MTK驱动调试经验
MTK6735M项目F100驱动调试报告一配置EMMC按照硬件的选择配置新的flash,因为第一版都是按照MTK认证列表使用,所有一般如果不行有两个可能:1配置不正确,需要确定alps\bootable\bootloader\preloader\tools\emigen\MT6735下的flash 配置文件的时序是否正确,修改配置文件alps\bootable\bootloader\preloader\custom\f100\inc的文件custom_MemoryDevice.h2需要硬件配合查看是否EMMC元器件未能贴好,造成不能烧录二调试LCD调试步骤:1确定LCD的连接方式;1确定dws配置正确;2确定电源是否正确;3确定配置参数的读写方式类型,包括:LCM_setting_table模式读写:struct LCM_setting_table{unsigned cmd;unsigned char count;unsigned char para_list[64];};LCM_setting_table_V3模式读写:typedef struct{unsigned char id;unsigned char cmd;unsigned char count;unsigned char para_list[128];}LCM_setting_table_V3;4确定开关机的时序和读取初始化参数的方法;5确定DSI的配置是否正确,此配置函数为static void lcm_get_params(LCM_PARAMS*params)6如果做屏兼容,需要配置.compare_id=lcm_compare_id,此项为读取LCD ID进行判断;调试碰到问题:1参数的读写方式不正确,造成屏花屏,换一种读写方式正确;2suspend时未能写正确,在待机时出现kernel crash,需要特别注意;3未能配置lcm_compare_id,造成做屏兼容时未能自动识别;4TE的配置需要特别注意,此引脚MTK的补丁默认TE中断不开;三调试TPTP连接的接口为I2C模式调试步骤:1确定dws配置正确;2确定中断,电源正确;3确定I2C读写正确;4确定报点没有断点,TP没有坏点;5配置虚拟按键时注意键值范围;调试碰到问题:调试的TP为GT9157,出现很奇怪的问题,就是I2C的初始化读写没有报错,但是读写数据就是不成功,最后查找到问题为:I2C加了下拉的防静电电阻,造成实际上的下拉,但是根据规格书配置要求,必须要做上拉处理,否则容易出现读写不正常,所有此处造成I2C没有正常工作;三调试sensor system调试步骤:一accelerometer1确定dws配置正确;2确定中断,电源正确;3确定I2C读写正确;4确定好旋转的方向;调试碰到的问题:调试accelerometer出现没有报点,然后换了驱动就可以了,判断为原驱动内的读取x.y.z的方式不对;二alsps1确定dws配置正确;2确定中断,电源正确;3确定I2C读写正确;4确定好旋转的方向;调试碰到的问题:调试光感出现距离不对的问题,调试距离判断参数,成功;四调试camera调试步骤:1确定主副摄像头的型号,在配置文件配置好,添加好驱动代码;(注意:需要配置alps\device\huaying\f100里的ProjectConfig.mk,此文件为主要配置文件,配置alps\kernel-3.10\arch\arm64\configs里的f100_debug_defconfig)2确定dws配置正确;3确定摄像头的开关机的时序,按照摄像头的规格书来配置;4根据硬件配置好MCLK;5确定好是否支持AF,闪光灯功能;五调试Audio调试步骤:1按照驱动开发资料进行驱动配置,确定好是内置功放还是外置功放;2配置好音频功放的输入时序,按照喇叭的功率进行配置,外置功放配置路径为alps\kernel-3.10\sound\soc\mediatek\mt_soc_audio_v3\mt_soc_codec_63xx.c3按照硬件配置mic为单/双;六调试HEADSET调试步骤:按照驱动开发资料配置即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
管理篇接收到扫描完毕nicRxSDIOAggReceiveRFBssdio有两个通道,两个通道获取数据的流程是一样的,1)通过prEnhDataStr->rRxInfo.u.u2NumValidRx0Len可以获取到该通道目前存储有多少数据包,通道数据包的存储量只有16个,如果超过16个则是固件问题,跳过看下一个通道的2)然后获取当前freeswrfb空闲空间是否够用,不够用则看下一个通道的。
3)可接收的聚合报文(管理帧)长度(u4RxAvailAggLen)为23524)循环遍历某个通道的报文,读到报文长度+4 然后按照4个字节对齐从u4RxAvailAggLen 扣减掉。
如果空间不够则跳出。
5)遍历完之后用2352减去u4RxAvailAggLen 可以得到总的数据长度通过dma获取数据到prRxCtrl->pucRxCoalescingBufPtr中1)6)遍历通道中报文数,把每个报文拷贝到prSwRfb->pucRecvBuff中,并且填充prSwRfb->ucPacketType和prSwRfb->ucStaRecIdx2)nicRxSetupRFB3)如果prSwRfb->pvPacket为空,则先将prSwRfb置成0,然后按照2352分配sk_buff,prSwRfb->pucRecvBuff指向skb->data,prSwRfb->pvPacket指向skb1)同时,prSwRfb->prHifRxHdr指向skb->data首部。
2)nicRxFillRFB3)从prHifRxHdr->ucHerderLenOffset获取出header的offset和MACHeaderLen4)设置prSwRfb->pvHeader指向skb->data越过prHifRxHdr + HIF_RX_HDR_SIZE + u4HeaderOffset,指向的将是beacon帧结构5)重置prSwRfb->u2HeaderLen=u4MacHeaderLen 和prSwRfb->u2PacketLen为原来skb->data长度减去(HIF_RX_HDR_SIZE + u4HeaderOffset)MacHeader 如下图:nicAddScanResult该函数分为replace和add部分,先讲解add部分Add1)如果prAdapter->rWlanInfo.u4ScanResultNum小于63则继续往下走2)先将prAdapter->rWlanInfo.arScanResult[i]到aucIE之前的部分设置为03)设置prAdapter->rWlanInfo.arScanResult[i].u4Length为aucIE之前的部分的长度+IE的长度4)拷贝mac地址到prAdapter->rWlanInfo.arScanResult[i].arMacAddress5)拷贝ssid到prAdapter->rWlanInfo.arScanResult[i].rSsid.aucSsid6)设置u4Privacy、rRssi、eNetworkTypeInUse、eOpMode等7)拷贝prConfiguration到prAdapter->rWlanInfo.arScanResult[i].rConfiguration中8)拷贝rSupportedRates到prAdapter->rWlanInfo.arScanResult[i].rSupportedRates中9)拷贝u2IELength到prAdapter->rWlanInfo.arScanResult[i].u4IELength10)如果u2IELength大于0 则检查aucScanIEBuf是否够放下当前bssdesc的IE部分,如果可以的话,则拷贝到aucScanIEBuf[prAdapter->rWlanInfo.u4ScanIEBufferUsage],然后设置指针到apucScanResultIEs[i]中,接下来重置u4ScanIEBufferUsage的值。
如果空间不够的话,则将arScanResult[i].u4Length、u4IELength、apucScanResultIEs[i]设置为0.如果u2IELength不大于0,则设置apucScanResultIEs[i] = NULL;11)prAdapter->rWlanInfo.u4ScanResultNum++;如果当前已经没有空间存储了,则考虑替换rssi最弱的那个ap authCheckRxAuthFrameTransSeq1)该函数先判断该报文是否是正确的,评判标准就是:如果报文总长度扣掉报文头所剩下的空驾大于6(auth algorithm+auth seq num+status code)这三个字段是必备的意思。
获取auth seq num 来判断该数据包是属于auth request(1和3)还是auth response(2和4)saaFsmRunEventRxAuth(处理auth response的包函数)aaaFsmRunEventRxAuth (处理auth request的包函数aaa指authentication,authorization,and accountingservices即认证授权计费系统)kalEnqueueCommand的cmd最后会由这边来执行wlanProcessCommandQueue mboxRcvAllMsg上层下发scan指令流程分析mtk_cfg80211_scan1)首先先查看下当前是否有在扫描的请求,如果有,则直接退出,通过变量prGlueInfo->p rScanRequest来进行判断2)通过对request进行判断分解请求a.分解ssid,如果请求ssid的个数为1,则将ssid拷贝到rScanRequest的ssid中,如果大于1则直接退出,如果为0,则将rScanRequest.rSsid.u4SsidLen为0;b.分解IE,如果ie_len大于0,则将rScanRequest.pucIE指向request中的ie,并且置为u4IELength为03)通过kalioctl进行发送wlanoidSetBssidListScanExt参数为rScanRequestKalioctl 触发流程:将相关参数组装成prIoReq中,之后唤醒tx_thread来处理OID,然后等待执行结束,在tx_t hread中会调用wlanSetInformation或者wlanQueryInformation,不过这两部分的操作,最后都会调用prIoReq中的回调函数,wlanoidSetBssidListScanExt流程:1.判断参数中请求的长度参数的长度是否等于参数结构的大小2.判断射频是否关闭3.遍历prBSSDescList,将类型为BSS_TYPE_INFRASTRUCTURE的prBssDesc->aucRawBuf清空4.将scanrequest的参数解析出来5.获取ais状态机prAisFsmInfo6.启动prAisFsmInfo->rScanDoneTimer定时器时长为15s如果支持在线扫描,则直接aisFsmScanRequest,否则如果kalGetMediaStateIndicated(prAdap ter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED则跟着aisFsmScanRequest,其他直接WLAN_STATUS_FAILURE。
aisFsmScanRequest流程1.判断prConnSettings->fgIsScanReqIssued是否为false,同一时间只能有一次scan。
2.如果有ssid、IE等获取出来,拷贝到prAisFsmInfo中对应的变量中。
3.如果当前prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR,如果当前是处于prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE并且prAisFsmInfo->fgIsInfraC hannelFinished == FALSE(802.1x 可能还没完成,pend it 等后续操作),则执行aisFsm InsertRequest(prAdapter, AIS_REQUEST_SCAN);否则,则执行开始online scan(包括wlan ClearScanningResult(prAdapter)和aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN))4.如果当前prAisFsmInfo->eCurrentState == AIS_STATE_IDLE,则直接进行扫描(包括wlanClearScanningResult(prAdapter)和aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN))。
其他情况也是直接pend it 等后续操作aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCA N);wlanClearScanningResult流程1.如果当前处于连接状态,则遍历prAdapter->rWlanInfo.arScanResult,跟当前连接的ap的mac地址进行比对prAdapter->rWlanInfo.rCurrBssId.arMacAddress,如果一致,则将其搬到prAdapter->rWlanInfo.arScanResult[0]其他都清除。
如果当前不处于连接,则直接prAdapter->rWlanInfo.u4ScanResultNum = 0;prAdapter->rWlan Info.u4ScanIEBufferUsage = 0;aisFsmSteps(prAdapter, AIS_STATE_SCAN/AIS_STATE_ONLINE_SCAN/LOOK_FOR)流程:1.先将nextState保存到prAisFsmInfo->eCurrentState中。
2.Switch(nextState)就看AIS_STATE_SCAN/AIS_STATE_ONLINE_SCAN/LOOK_FOR3. A.先检测网络设备是否已经激活,如果没有激活,则进行激活操作。