0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux驱动开发_数码相册项目、360WIFI驱动移植介绍

DS小龙哥-嵌入式技术 2022-09-17 15:51 次阅读

【摘要】 这篇文章介绍两个知识点: 数码相册要求介绍、贴出案例代码、介绍360随身WIFI的驱动移植注意事项。

任务1: 文件系统本地挂载

pYYBAGMlOgKADXGfAAC5mMALges812.png

任务2:数码相册项目代码

​数码相册功能:

1.​支持两种格式图片显示: bmp、jpg

区分两种图片格式,通过后缀名称区分。

2.​支持触摸屏、按键方式翻页(支持前后翻页)

建立双向链表,调用读取目录的函数(opendir),将目录下所有符合要求的图片加入到链表里。

3.​支持三轴加速度计,实现姿态感应。根据三轴加速度的姿态,调整图片的显示方向。

4.​支持图片的自适应: 居中显示,超大尺寸的图片需要自动缩小到屏幕能够显示的大小。

5.​居中显示。

6.​数码相册需要有状态栏: 当前系统的时间信息,当前图片的名称、数量。

poYBAGMlOgOAKc0gAAB7ziGdZSE786.pngpYYBAGMlOgOAMX8tAABLRaVfRY4331.png

倒车影像、USB摄像头网页视频控制、广告机。

案例代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include "touch_input.h"
#include "key_input.h"
#include "mma7660_input.h"
#include "framebuffer.h"
#include "image_zoom.h"
#include "list.h"
#include "Imagedecoding.h"

struct PHOTOA_LBUM_INFO photo_album_info; /*重要结构*/

/*
函数功能: 处理捕获到的信号
*/
void exit_sighandler(int sig)
{
	printf("捕获到信号_%d\n",sig);
	exit(0); /*结束进程*/
}

/*
函数功能: 图片类型过滤
函数返回值: 0表示支持,其他值表示不支持
*/
int ImageTypeFiltering(char *name)
{
	/*1. 查找后缀*/
	char *jpg_p=strstr(name,".jpg");
	char *jpeg_p=strstr(name,".jpeg");
	char *bmp_p=strstr(name,".bmp");
	char *JPG_p=strstr(name,".JPG");
	char *JPEG_p=strstr(name,".JPEG");
	char *BMP_p=strstr(name,".BMP");

	/*2. 过滤后缀*/
	if(jpg_p==NULL&&jpeg_p==NULL&&bmp_p==NULL&&
	   JPG_p==NULL&&JPEG_p==NULL&&BMP_p==NULL)
	{
		return -1;
	}
	/*
		123.mp4.mp3    123.c.txt   p=strstr("123.c.txt",".c");   p执行    *p=.
	*/
	/*3. 名称比较,二次过滤*/
	int jpg_p_cmp=1;
	int jpeg_p_cmp=1;
	int bmp_p_cmp=1;
	int JPG_p_cmp=1;
	int JPEG_p_cmp=1;
	int BMP_p_cmp=1;
	
	if(jpg_p)jpg_p_cmp=strcmp(jpg_p,".jpg");
	if(jpeg_p)jpeg_p_cmp=strcmp(jpeg_p,".jpeg");
	if(bmp_p)bmp_p_cmp=strcmp(bmp_p,".bmp");
	if(JPG_p)JPG_p_cmp=strcmp(JPG_p,".JPG");
	if(JPEG_p)JPEG_p_cmp=strcmp(JPEG_p,".JPEG");
	if(BMP_p)BMP_p_cmp=strcmp(BMP_p,".BMP");

	if(jpg_p_cmp!=0&&jpeg_p_cmp!=0&&bmp_p_cmp!=0&&
	   JPG_p_cmp!=0&&JPEG_p_cmp!=0&&BMP_p_cmp!=0)
	{
		return -2;
	}
	return 0;
}
/*
函数功能: 遍历指定的目录,将图片的绝对路径加入到链表
函数参数: 传入目录名称
函数返回值: 负数表示失败, 大于0表示加入到链表里节点的数量
*/
int Traverse_Directory(char *dir_name)
{
	int cnt=0;
	/*1. 先清空链表*/
	Remove_ALL_Node();
	
	/*2. 打开目录*/
	DIR *dir=opendir(dir_name);
	if(dir==NULL)
	{
		DBUG_PRINTF("%s 目录打开失败!\n",dir_name);
		return -1;
	}
	
	/*3. 循环遍历目录*/
	struct dirent *dir_info=NULL;
	struct IMAGE_ListStruct *temp=NULL;
	int len;
	while(dir_info=readdir(dir))
	{
		 /*过滤图片*/
		 if(ImageTypeFiltering(dir_info->d_name)!=0)
		 {
		 	DBUG_PRINTF("不符合要求的文件: %s\n",dir_info->d_name);
		 	continue;
		 }
		 cnt++;
		 //给新节点申请空间
		 temp=malloc(sizeof(struct IMAGE_ListStruct));
		
		 //计算文件名称长度(绝对路径): 
		 len=strlen(dir_name)+strlen(dir_info->d_name)+1;
		 
		 //给存放文件名称指针申请空间
		 temp->file_name=malloc(len);
		
		 strcpy(temp->file_name,dir_name);
		 strcat(temp->file_name,dir_info->d_name); 
		  	 
		/*4. 添加链表节点*/
		AddListNode(ListHead,temp);
	}
	return cnt;
}

/*
函数功能: 删除链表里所有的节点
*/
int Remove_ALL_Node(void)
{
	struct IMAGE_ListStruct *p=ListHead; //保存头地址
	struct IMAGE_ListStruct *tmp=NULL;

	if(p==NULL) /*头为空就创建一个头*/
	{
		p=ListHead=CreateListHead(ListHead);
	}
	
	if(p->next==NULL)return 0;/*节点为空不需要删除*/
	else
	{
		tmp=p; 	  //保存上一个节点的地址---也就是头的地址,因为链表头不需要删除
		p=p->next; /*移动到下一个数据节点*/
		tmp->next=NULL; /*指定头的下一个节点为NULL*/
	}
	
	while(p!=NULL)
	{
		tmp=p; //保存上一个节点的地址
		p=p->next; /*偏移到下一个节点*/

		/*删除节点*/
		free(tmp->file_name);
		free(tmp);
	}
	return 0;
}

/*
函数功能: 在屏幕左下角实时显示当前时间
*/
void *time_pthread_func(void *dev)
{
	time_t sec_time;
	time_t sec_tmp;
	struct tm *system_time;
	char timebuff[20];
	while(1)
	{
		/*获取本地秒单位时间*/
		sec_time=time(NULL);
		if(sec_tmp!=sec_time)
		{
			sec_tmp=sec_time;
			/*使用时间函数将秒单位时间转为标准时间返回*/
			system_time=localtime(&sec_time);
			/*格式化打印时间*/
			strftime(timebuff,20,"%Y-%m-%d %H:%M:%S",system_time);
			/*清除底状态栏*/
			framebuffer_Fill(0,photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE,19*GBK_FONT_SIZE/2,photo_album_info.framebuffer_var.yres,0xD1EEEE);
			/*在指定位置进行显示时间*/
			framebuffer_String(0,photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE,timebuff);
		}
	}
}

/*
函数功能: GUI界面初始化代码
*/
void GUI_Init(void)
{
	/*1. 清屏初始化*/
	framebuffer_Fill(0,0,photo_album_info.framebuffer_var.xres,photo_album_info.framebuffer_var.yres,0x33ffcc); /*清除整个屏幕*/
	framebuffer_Fill(0,0,photo_album_info.framebuffer_var.xres,GBK_FONT_SIZE,0xD1EEEE);  /*清除顶状态栏*/
	framebuffer_Fill(0,photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE,photo_album_info.framebuffer_var.xres,photo_album_info.framebuffer_var.yres,0xD1EEEE);  /*清除底状态栏*/
	
	/*2. 项目名称显示(居中显示)*/
	framebuffer_String((photo_album_info.framebuffer_var.xres-strlen(PROJECT_NAME)*(GBK_FONT_SIZE/2))/2,
						0,PROJECT_NAME);
}

int main(int argc,char **argv)
{	
	int current_cnt=1; /*保存当前图片的位置*/
	struct IMAGE_ListStruct *List_current_p=NULL; /*用于保存节点的位置*/
	struct ImageDecodingInfo image_info={0,0,NULL}; /*保存当前图片解码信息*/
	int current_x=0; /*显示图片时,x坐标起始位置*/
	int current_y=0; /*显示图片时,y坐标起始位置*/
	char CurrentNumberStr[50]; /*显示当前数量字符串*/

	photo_album_info.lcd_direction=1; /*屏幕默认方向*/
		
	if(argc!=2)
	{
		printf("传入的参数格式: ./app <目录名称>\n");
		return 0;
	}
	
	/*1. 注册将要捕获的信号*/
	signal(SIGINT,exit_sighandler);  /*Ctrl+C发出*/
	signal(SIGSEGV,exit_sighandler); /*进程产生非法内存访问时发出*/
	
 	/*2. 初始化帧缓冲设备*/
	if(framebuffer_Device_init(&photo_album_info)!=0)exit(1);

	/*3. 字库初始化*/
	if(Fontlib_Init()!=0)exit(1);
	
	/*4. 创建读取触摸屏坐标的线程*/
	pthread_t touch_thread_id;
	pthread_create(&touch_thread_id,NULL,touch_pthread_func,NULL);
	pthread_detach(touch_thread_id);

	/*5. 创建读取按键值的线程*/
	pthread_t key_thread_id;
	pthread_create(&key_thread_id,NULL,key_pthread_func,NULL);
	pthread_detach(key_thread_id);
	
	/*6. 创建读取三轴加速度计姿态的线程*/
	pthread_t mma7660_thread_id;
	pthread_create(&mma7660_thread_id,NULL,mma7660_pthread_func,NULL);
	pthread_detach(mma7660_thread_id);

	/*7. 创建显示时间的线程*/
	pthread_t time_thread_id;
	pthread_create(&time_thread_id,NULL,time_pthread_func,NULL);
	pthread_detach(time_thread_id);
	
	/*8. 创建链表头*/
	ListHead=CreateListHead(ListHead);
	if(ListHead==NULL)
	{
		printf("创建链表头失败!\n");
		exit(1);
	}
	while(1)
	{
		List_current_p=ListHead; /*保存头地址*/
		current_cnt=1; 			  /*位置置1*/
				
		/*遍历指定目录,保存图片名称到链表,并返回图片的总数量*/
		photo_album_info.image_number=Traverse_Directory(argv[1]);
		
		/*打印链表里的节点信息*/
		PintListInfo(ListHead);

		/*偏移到数据节点*/
		List_current_p=List_current_p->next;
		
		while(List_current_p)
		{
			/*1. 等待加速计输入事件*/
			
			/*2. 判断图片类型,开始显示图片*/
			if(strstr(List_current_p->file_name,".jpg")||strstr(List_current_p->file_name,".jpeg")||
			   strstr(List_current_p->file_name,".JPG")||strstr(List_current_p->file_name,".JPEG"))
			{
				/*2.1 解码JPEG图片*/
				if(Decoding_JPEGImage(List_current_p->file_name,&image_info))
				{
					printf("%s图片解码失败!\n",List_current_p->file_name);
				}
			}
			else if(strstr(List_current_p->file_name,".bmp")||strstr(List_current_p->file_name,".BMP"))
			{
				/*2.2 解码BMP图片,得到图片信息*/
				if(Decoding_BmpImage(List_current_p->file_name,&image_info))
				{
					printf("%s图片解码失败!\n",List_current_p->file_name);
				}
			}

			/*3. 判断是否解码成功*/
			if(image_info.rgb==NULL || image_info.Height==0 || image_info.Width==0)
			{
				goto FREE_MEM; /*解码失败,继续下一张*/
			}

			/*4. 解码成功,在LCD屏上显示*/
				/*判断LCD屏剩余尺寸是否足够显示图片,不够显示就缩小*/
			if(image_info.Height>photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE*2||
				image_info.Width>photo_album_info.framebuffer_var.xres)
			{
				int maximum_height;
				int zoom_proportion;
				int maximum_width;
				if(image_info.Height>=image_info.Width) /*如果图片高度大于宽度,那么缩放就以高度为准*/
				{
					maximum_height=photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE*2;/*屏幕最大能够显示的高度*/
					zoom_proportion=image_info.Height-maximum_height; /*缩放比例*/
					maximum_width=image_info.Width-zoom_proportion; /*宽度根据高度进行比例缩放*/
					DBUG_PRINTF("Height:缩放之后的实际尺寸(宽*高):%d*%d\n",maximum_width,maximum_height);

					/*再次判断缩放之后图片宽度在LCD屏是否足够显示,如果不够,则进行缩小*/
					if(maximum_width>photo_album_info.framebuffer_var.xres)
					{
						
					}
				}
				else/*如果图片宽度大于高度,那么缩放就以宽度为准*/
				{
					maximum_width=photo_album_info.framebuffer_var.xres; /*屏幕最大能够显示的宽度*/
					zoom_proportion=image_info.Width-maximum_width; 	   /*缩放比例*/
					maximum_height=image_info.Height-zoom_proportion;      /*高度根据宽度进行比例缩放*/

					/*再次判断缩放之后图片高度在LCD屏是否足够显示,如果不够,则进行缩小*/
					if(maximum_height>photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE*2)
					{
						/*高度以屏幕最大高度为准*/
						maximum_height=photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE*2;
						/*高度缩小了,那么宽度也要按照比例缩小,否则会导致图片变形*/
						maximum_width=maximum_height-(maximum_height-photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE*2);
					}
					
					DBUG_PRINTF("Width:缩放之后的实际尺寸(宽*高):%d*%d\n",maximum_width,maximum_height);
				}
				/*申请空间存放缩放之后的数据*/
				unsigned char *rgb_zoom=malloc(maximum_width*maximum_height*3); 
				if(rgb_zoom==NULL)
				{
					perror("存放图片缩放数据的空间申请失败!");
					goto FREE_MEM;
				}

				/*将图片按照指定的尺寸进行缩小*/
				if(Image_Zoom(image_info.rgb,image_info.Width,image_info.Height,rgb_zoom,maximum_width,maximum_height)!=0)
				{
					goto FREE_MEM;
				}

				/*缩放成功,保存缩放之后图片实际参数*/
				image_info.Height=maximum_height;
				image_info.Width=maximum_width;
				free(image_info.rgb);    /*释放源RGB空间*/
				image_info.rgb=rgb_zoom; /*指针指向缩放之后的RGB数据空间*/

				/*显示图片的坐标起始位置*/
				current_x=(photo_album_info.framebuffer_var.xres-maximum_width)/2;;
				current_y=(photo_album_info.framebuffer_var.yres-maximum_height)/2;
			}
			else /*尺寸足够显示,进行居中显示*/
			{
				/*计算显示图片时,xy坐标位置--保证居中显示*/
				current_x=(photo_album_info.framebuffer_var.xres-image_info.Width)/2;
			    current_y=(photo_album_info.framebuffer_var.yres-image_info.Height)/2;
			}

			/*清空显示区域*/
			framebuffer_Fill(0,GBK_FONT_SIZE,photo_album_info.framebuffer_var.xres,photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE,0x33ffcc);

			/*在LCD指定位置显示图片*/
			DBUG_PRINTF("在LCD显示的位置:x=%d,y=%d\n",current_x,current_y);
			framebuffer_DisplayImages(current_x, /*横坐标位置*/
										current_y, /*纵坐标位置*/
										image_info.Width,
										image_info.Height,
										image_info.rgb);
			
			DBUG_PRINTF("显示: 第%d个节点的数据=%s\n",current_cnt,List_current_p->file_name);

			/*图片显示的数量情况*/
			sprintf(CurrentNumberStr,"%d/%d",photo_album_info.image_number,current_cnt);
			/*清除底状态栏*/
			framebuffer_Fill((photo_album_info.framebuffer_var.xres-(strlen(CurrentNumberStr)*GBK_FONT_SIZE/2))/2-32,
							 photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE,
							 photo_album_info.framebuffer_var.xres,
							 photo_album_info.framebuffer_var.yres,0xD1EEEE);
			/*在指定位置显示当前数量*/
			framebuffer_String((photo_album_info.framebuffer_var.xres-(strlen(CurrentNumberStr)*GBK_FONT_SIZE/2))/2,
			                     photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE,CurrentNumberStr);
			
			/*在右下角显示当前图片名称*/
			framebuffer_String(photo_album_info.framebuffer_var.xres/2+(strlen(CurrentNumberStr)*GBK_FONT_SIZE/2)/2 +GBK_FONT_SIZE*2,
			                     photo_album_info.framebuffer_var.yres-GBK_FONT_SIZE,basename(List_current_p->file_name));
FREE_MEM:
			if(image_info.rgb) /*判断空间是否申请成功*/
			{
				free(image_info.rgb); /*释放空间*/
				image_info.rgb=NULL;
			}
			image_info.Height=0;
			image_info.Width=0;	

			/*等待按键信号和触摸屏信号进行翻页 或者有切换屏幕的操作时进行切换屏幕方向*/
			while(!photo_album_info.page_direction&&!photo_album_info.lcd_state){}
			
			if(photo_album_info.page_direction==1) /*右翻页*/
			{
				List_current_p=List_current_p->next;
				current_cnt++; /*记录图片位置*/
			}
			else if(photo_album_info.page_direction==2)/*左翻页*/
			{
				if(current_cnt>1)
				{
					List_current_p=List_current_p->old;
					current_cnt--; /*记录图片位置*/	
				}
			}
			photo_album_info.page_direction=0; /*状态清0*/
			photo_album_info.lcd_state=0; /*状态清0*/
		}
	}
	return 0;
}

任务3: 360 WIFI驱动测试、无线工具使用

\12 20181210 文件系统本地挂载、360WIFI驱动与相关无线工具安装\参考资料\01 360USB无线网卡驱动及相关无线工具安装\03 WIFI驱动及相关工具库一键移植文件\360wifi_20170926.tar

poYBAGMlOgOAX9TMAACZKEVl49k218.pngpYYBAGMlOgSAcahXAAIJxCJoo30491.png

​Udhcpc自动分配IP地址的命令,需要的脚本和使用方法

poYBAGMlOgSARJSSAADmbsII4fM145.pngpYYBAGMlOgSAKNS-AACigoJi8Ws239.png

​两个脚本里的代码。

poYBAGMlOgiAd4HMAADWGwWGgOI614.pngpYYBAGMlOgiAISstAADxqb9IAGI925.png

​WIFI的配置文件

poYBAGMlOgiAMHgOAAF0zgAnJzw732.png

​一键移植文件布局。

pYYBAGMlOgiAOb0-AADBrlORsmo775.png

[root@wbyq 360wifi]# ls

360wifi_1.sh 360wifi_2.sh bin etc lib mt7601Usta.ko simple.script

[root@wbyq 360wifi]# tree

.

├── 360wifi_1.sh

├── 360wifi_2.sh

├── bin

│ ├── ifrename

│ ├── iwconfig

│ ├── iwevent

│ ├── iwgetid

│ ├── iwlist

│ ├── iwpriv

│ ├── iwspy

│ ├── wpa_cli

│ ├── wpa_supplicant

│ └── wpa_supplicant.conf

├── etc

│ ├── Wireless

│ │ └── RT2870STA

│ │ ├── RT2870STA.dat

│ │ └── RT2870STA.dat~

│ └── wpa_supplicant.conf

├── lib

│ └── libiw.so.29

├── mt7601Usta.ko

└── simple.script

5 directories, 18 files

[root@wbyq 360wifi]#

​USB设备匹配的流程

当前USB设备插到电脑的USB口上之后,USB产生USB中断,USB主机就会发生特定命令,询问插入

进来的设备,是什么设备。设备会按照USB协议的规定,回应一个数据包---结构体。

主机收到数据包之后会进行解析,会按照设备的类型或者设备ID进行在内核里寻找与之匹配的驱动,

寻找成功就会调用USB驱动程序。

​启动脚本连接WIFI

[root@tiny4412 etc]#vi wpa_supplicant.conf //修改将要连接的路由器名称和密码

[root@tiny4412 etc]#cd /work/360wifi/

[root@tiny4412 360wifi]#ls

360wifi_1.sh bin lib simple.script

360wifi_2.sh etc mt7601Usta.ko

[root@tiny4412 360wifi]#./360wifi_2.sh //运行脚本2,安装WIFI驱动,启动WIFI连接热点,连接上之后再分配IP地址

[ 917.120000] rtusb init rt2870 --->

[ 917.120000] <-- RTMPAllocTxRxRingMemory, Status=0

[ 917.120000] <-- RTMPAllocAdapterBlock, Status=0

[ 917.120000] BULK IN MaxPacketSize = 512

[ 917.120000] EP address = 0x84

[ 917.120000] BULK IN MaxPacketSize = 512

[ 917.120000] EP address = 0x85

[ 917.120000] BULK OUT MaxPacketSize = 512

[ 917.125000] EP address = 0x 8

[ 917.130000] BULK OUT MaxPacketSize = 512

[ 917.130000] EP address = 0x 4

[ 917.135000] BULK OUT MaxPacketSize = 512

[ 917.140000] EP address = 0x 5

[ 917.145000] BULK OUT MaxPacketSize = 512

[ 917.145000] EP address = 0x 6

[ 917.150000] BULK OUT MaxPacketSize = 512

[ 917.155000] EP address = 0x 7

[ 917.155000] BULK OUT MaxPacketSize = 512

[ 917.160000] EP address = 0x 9

[ 917.170000] usbcore: registered new interface driver rt2870

[ 917.350000] Current MAC: =b0:d5:9d:0c:51:29

[ 917.355000] NICReadEEPROMParameters: RxPath = 1, TxPath = 1

[ 917.360000] 20MHz BW, 2.4G band-03030505, Adata = 03030505, Gdata = 03030505

[ 917.365000] 20MHz BW, 2.4G band-00000004, Adata = 00000004, Gdata = 00000004

[ 917.365000] 20MHz BW, 2.4G band-00000002, Adata = 00000002, Gdata = 00000002

[ 917.365000] 20MHz BW, 2.4G band-00000002, Adata = 00000002, Gdata = 00000002

[ 917.370000] 20MHz BW, 2.4G band-ffff0002, Adata = ffff0002, Gdata = ffff0002

[ 917.610000] BuildChannel # 1 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 2 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 3 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 4 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 5 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 6 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 7 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 8 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 9 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 10 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 11 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 12 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 13 :: Pwr0 = 6, Pwr1 =0, Flags = 0

BuildChannel # 14 :: Pwr0 = 6, Pwr1 =0, Flags = 0

<==== rt28xx_init, Status=0

[ 917.665000] 0x1300 = 00064300

udhcpc (v1.23.2) started

Setting IP address 0.0.0.0 on ra0

Sending discover...

[ 920.025000] RSN_IE: f0b15003, len = 22

[ 920.025000] 0x0000 : 30 14 01 00 00 0f ac 04 01 00 00 0f ac 04 01 00

[ 920.025000] 0x0010 : 00 0f ac 02 0c 00

[ 920.035000] /work/360_WIFI/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/os/linux/../../sta/rtmp_data.c:540 assert pRxWI->RxWIWirelessCliID == BSSID_WCIDfailed

[ 920.090000] Key = 28:fd:b8:58:c5:ce:85:e5:33:97:d8:09:8d:46:c2:6a

[ 920.090000] Rx MIC Key = 00:00:00:00:00:00:00:00

[ 920.090000] Tx MIC Key = 00:00:00:00:00:00:00:00 (表示WIFI已经成功连接热点)

Sending discover...

[ 923.340000] CmdThread : CMDTHREAD_SET_ASIC_WCID : WCID = 1, SetTid = 10000, DeleteTid = ffffffff.

[ 923.340000] 1-MACValue= e02d6594,

[ 923.340000] 2-MACValue= 1701d,

Sending select for 192.168.43.240...

Lease of 192.168.43.240 obtained, lease time 3600

Setting IP address 192.168.43.240 on ra0

Deleting routers

route: SIOCDELRT: No such process

Adding router 192.168.43.1

Recreating /etc/resolv.conf

Adding DNS server 192.168.43.1 //表示WIFI已经成功分配了IP地址

​查看网卡IP地址,ping百度测试是否可以访问外网

poYBAGMlOgmAVlI2AAEy73TU20A009.png

​查看当前WIFI连接的网卡信息

pYYBAGMlOgmAMmzKAADlfDG6SdM030.png

​通过WIFI管理工具,扫描周边的热点

[root@tiny4412 360wifi]#iwlist scanning


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    11

    文章

    1717

    浏览量

    84340
  • 数码
    +关注

    关注

    0

    文章

    288

    浏览量

    36558
  • WIFI
    +关注

    关注

    81

    文章

    5160

    浏览量

    199422
收藏 人收藏

    评论

    相关推荐

    rk3399移植Linux内核

    RK3399是一款由中国厂商瑞芯微推出的高性能处理器芯片,被广泛用于嵌入式系统开发。在进行应用程序开发之前,我们需要将Linux内核移植到RK3399上,以支持硬件的
    的头像 发表于 01-08 09:56 340次阅读

    飞凌OK113i-C全志T113-i开发板rtl8723du WIFI功能测试及蓝牙驱动移植

    飞凌 OK113i-C 全志T113-i开发板板载一个RTL8723du wifi/蓝牙二合一模块,板子出厂已经移植好了WIFI驱动但是蓝牙
    的头像 发表于 12-11 13:52 1011次阅读

    数码驱动芯片的使用方法

    数码驱动芯片(也称为LED驱动芯片)是一种用于控制数码管显示的集成电路。它可以将微控制器产生的数字信号转换为适合数码管显示的电流和电压。本
    的头像 发表于 12-08 16:24 1569次阅读

    【ELF 1开发板试用】+ 5.0 Wireless_Tools WIFI工具移植

    Wireless_Tools WIFI工具移植 Wireless_Tools介绍 Wireless Tools是一组用于Linux的工具,可与Wireless Extensions一起
    发表于 12-06 16:35

    电子时钟制作(瑞萨RA)(4)----驱动LED数码

    本篇文章主要介绍如何使用e2studio对瑞萨RA2E1开发板进行数码管的驱动
    的头像 发表于 12-01 14:03 241次阅读
    电子时钟制作(瑞萨RA)(4)----<b class='flag-5'>驱动</b>LED<b class='flag-5'>数码</b>管

    linux安装网卡驱动教程

    Linux系统中安装网卡驱动是一个比较基础的操作,下面我将为你详细讲解如何安装网卡驱动。 第一步,检查网卡型号和驱动支持情况:首先,你需要确定你的网卡型号,并查看该网卡型号在
    的头像 发表于 11-17 11:11 1618次阅读

    数码驱动电路讲解

    根据项目需求可以用I/O外部上拉,用来驱动数码管;也可以74HC138(38译码器)+74HC245(8路信号收发器)驱动数码管。本文会以后
    的头像 发表于 11-01 17:34 1938次阅读
    <b class='flag-5'>数码</b>管<b class='flag-5'>驱动</b>电路讲解

    多位数码驱动电路介绍

    电子发烧友网站提供《多位数码驱动电路介绍.doc》资料免费下载
    发表于 10-27 10:22 0次下载
    多位<b class='flag-5'>数码</b>管<b class='flag-5'>驱动</b>电路<b class='flag-5'>介绍</b>

    一文总结linux的platform驱动

    linux设备驱动中,有许多没有特定总线的外设驱动,在实际开发中,又需要使用到总线、驱动和设备模型这三个概念,故而
    的头像 发表于 10-16 16:45 409次阅读
    一文总结<b class='flag-5'>linux</b>的platform<b class='flag-5'>驱动</b>

    Linux驱动移植 Linux系统架构优点

    系统移植 linux 驱动移植 移植是说同样的一个 linux 操作系统,我们可以跑到不同的硬件
    的头像 发表于 07-27 17:06 566次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>驱动</b><b class='flag-5'>移植</b> <b class='flag-5'>Linux</b>系统架构优点

    Linux 驱动开发:USB无线wifi驱动开发(MT7601)、完成WIFI管理工具安装

    这篇文章会详细介绍WIFI驱动从哪里下载,下载下来如何修改进行编译安装测试,并交叉编译对应的WIFI工具,最终完成WIFI的基本使用,完成I
    的头像 发表于 07-14 13:48 5896次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>驱动</b><b class='flag-5'>开发</b>:USB无线<b class='flag-5'>wifi</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>(MT7601)、完成<b class='flag-5'>WIFI</b>管理工具安装

    基于STM32设计的数码相册

    项目是基于STM32设计的数码相册,能够通过LCD显示屏解码显示主流的图片,支持bmp、jpg、gif等格式。用户可以通过按键或者触摸屏来切换图片,同时还可以旋转显示,并能够自适应居中显示,小尺寸图片居中显示,大尺寸图片自动缩小显示(超出屏幕范围)。图片从SD卡中获取。
    的头像 发表于 06-24 21:14 1.1w次阅读
    基于STM32设计的<b class='flag-5'>数码相册</b>

    通过ESP32制作数码相册

    电子发烧友网站提供《通过ESP32制作数码相册.zip》资料免费下载
    发表于 06-16 11:30 2次下载
    通过ESP32制作<b class='flag-5'>数码相册</b>

    360驱动大师下载入口

    360驱动大师下载入口。
    发表于 06-12 16:36 0次下载

    Linux clock子系统及驱动实例

    Linux驱动中,操作时钟只需要简单调用内核提供的通用接口即可,clock驱动通常是由芯片厂商开发的,在Linux启动时clock
    发表于 05-31 16:10 460次阅读
    <b class='flag-5'>Linux</b> clock子系统及<b class='flag-5'>驱动</b>实例