Cortex-K60自学笔记(四)

摄像头模块测试

总结:关于摄像头模块,这周是花了自己特别多的时间的,问了特别多次,还好最后测试了完成了摄像头模块的测试。不算一波三折吧,虽然全是学长给的代码,但慢慢的调试过程中,自己也学到了很多知识。

camera.driver.c

#ifndef _CAMERA_DRIVER_H_
#define _CAMERA_DRIVER_H_


//本文件编辑选择宏,0是不编译,1是编译
#define CAMERA_TO_IMAGE_CHOOSE 1

#if CAMERA_TO_IMAGE_CHOOSE==1

#define START_ROW   80
#define END_ROW     185

#endif


//************移置主板宏定义中************
//摄像头引脚分配
#define H_GPIO_PORT          (PTB)
#define H_PIN                (GPIO_Pin23)
#define H_NUM                (23)
#define H_PORT               (PORTB)
#define H_PORT_IRQn          (PORTB_IRQn)

#define V_GPIO_PORT          (PTC)
#define V_PIN                (GPIO_Pin18)
#define V_NUM                (18)
#define V_PORT               (PORTC)
#define V_PORT_IRQn          (PORTC_IRQn)

#define DATA_GPIO_PORT       (PTD)
#define DATA_PIN             (GPIO_Pin0_7)

#define PCLK_GPIO_PORT       (PTC)
#define PCLK_PIN             (GPIO_Pin19)
#define PCLK_NUM             (19)
#define PCLK_PORT            (PORTC)
#define PCLK_DMA_REQn        (PORTC_DMAREQ)


//图像宏定义
#define IMAGE_HEIGHT 64   //提取后图像高度,必须是四的倍数
#define IMAGE_WIDTH 128  //提取后图像宽度

//摄像头的白色为0,黑色为1
//而液晶的白色为1,黑色为0,最终图像由液晶显示,故如下定义
#define IMAGE_WHITE 1    //白像素
#define IMAGE_BLACK 0    //黑像素

#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT)  //压缩后一副图像大小

//配置摄像头 属性
#define CAMERA_W            320                       //定义摄像头图像宽度
#define CAMERA_H            240                       //定义摄像头图像高度
#define CAMERA_SIZE         (CAMERA_W * CAMERA_H/8)   //图像占用空间大小
#define CAMERA_DMA_NUM      (CAMERA_SIZE)             //DMA采集次数
#define CAMERA_ROW_DMA_NUM  (CAMERA_W / 8)            //行DMA采集次数,必须是4的倍数
#define CAMERA_DATA_NUM     (CAMERA_W * CAMERA_H)     //数据个数
#define CAMERA_FPS          (50)                      //50 or 75 or 112 or 150

//从图中提取的开始位置和结束位置
#define COLUMN_START 25//10
#define COLUMN_END   275//310
#define COLUMN_NUM   250//300

#define ROW_START 0
#define ROW_END   215
#define ROW_NUM   215

//DMA初始化数据
#define DMA_REQ   (PCLK_DMA_REQn) //DMA请求源

#define DMA_CHX                   DMA_CH0                         //DMA选择通道
#define DMA_MAJOR_LOOP            CAMERA_ROW_DMA_NUM              //DMA主循环次数,每行传输完毕后自动关闭
#define DMA_MINER_BYTE            1                               //DMA副循环传输字节数
#define DMA_SOURCE_ADDR           (uint32)&(DATA_GPIO_PORT->PDIR) //传输源地址:PTD0~7
#define DMA_DEST_ADDR             (uint32)gl_Image0               //传输目的地址
#define DMA_SOURCE_DATA_SIZE      DMA_DST_8BIT                    //源数据传输宽度,1个字节
#define DMA_SOURCE_ADDR_OFFSET    0                               //源地址偏移量
#define DMA_DEST_DATA_SIZE        DMA_DST_8BIT                    //目的数据传输宽度
#define DMA_DEST_ADDR_OFFSET      1                               //目的地址偏移量


//摄像头初始化
void Camera_Init();

//摄像头引脚初始化(内部调用)
void Camera_GPIO_Init();

//摄像头DMA初始化(内部调用)
void Camera_DMA_Init();

//使能摄像头
void CameraStart();

//关闭摄像头
void CameraClose();

//解压函数
void ImgExtract(uint8 *, uint8 *, uint32 );//图像解压函数,图像字节数必须是4的倍数!!!

//压缩函数
void ImgCompress_128x64(uint8 *src, uint8 (*image)[IMAGE_WIDTH]);//图像压缩为128行64列

//中断函数
void camera_h_isr();//行中断

void camera_v_isr();//场中断

//摄像头数据处理中断函数
void camera_process_isr();

//均匀地取行取列
void init_get_colrow_array();

#endif

对于头文件分析,比较重要的有以下几个部分:
1.PCLK_DMA_EQRn : 像素点的同步时钟信号。也就是每个PCLK对应一个像素点,与DMA有关,详细的并未了解
2.V_PORT_IRQn:场中断,就是摄像头捕获的一个图像产生的一个中断
3.H_PORT_IRQn:行中断,就是每捕获一行产生一个中断

/*
*本文件用于:
*摄像头的底层驱动,重要的是解压和压缩函数;
*摄像头传输至单片机的图像顺序为由远处到近处,本文件接收其的原始数组存储顺序也是由远存储至近;
*即:gl_Image0[CAMERA_SIZE]、gl_Image1[CAMERA_SIZE],为由远及近;
*ImgExtract(uint8 *src, uint8 *dst, u32 colomn)不改变存储顺序,只进行解压,得到数组gl_ImageFull[CAMERA_W * IMAGE_HEIGHT]也是行小为远,行大为近;
*经ImgCompress_128x64(uint8 *src, uint8 (*image)[IMAGE_WIDTH]),压缩时顺序改变,改为gl_ImageCompress[IMAGE_HEIGHT][IMAGE_WIDTH]行大为远,行小为近;
*显示图像时需要注意调整显示函数:(oled是先显示远后显示近,由oled上方显示到下方,即需要上下颠倒)。
*/

#include "include.h"

uint8 gl_Image0[CAMERA_SIZE];                     //0号dma数据接收数组
uint8 gl_Image1[CAMERA_SIZE];                     //1号dma数据接收数组

uint8 gl_ImageFull[CAMERA_W * IMAGE_HEIGHT];      //由gl_Imagex解压来的储存所有像素点的数组

uint8 gl_ImageCompress[IMAGE_HEIGHT][IMAGE_WIDTH];//压缩后储存图像的最终数组
uint8 gl_now_flag = 0;                     //目前正在存储的图像标志

//取行数组(全局变量)
uint16 row[IMAGE_HEIGHT]={
  86,87,88,89,
  90,91,92,93,94,95,96,97,98,99,
  100,101,102,103,104,105,106,107,108,109,
  111,112,114,115,117,118,119,
  120,123,124,125,127,128,129,
  130,131,132,133,134,135,137,139,
  141,143,145,147,149,
  151,153,155,157,159,
  161,163,165,167,169,
  171,173,175
}
uint16 RowCol[IMAGE_HEIGHT][IMAGE_WIDTH]=
{
63, 65, 66, 68, 69, 71, 72, 74, 75, 77, 
78, 80, 81, 83, 84, 86, 87, 89, 90, 92, 
93, 95, 96, 98, 99, 101, 103, 104, 106, 107, 
109, 110, 112, 113, 115, 116, 118, 119, 121, 122, 
124, 125, 127, 128, 130, 131, 133, 134, 136, 137, 
139, 141, 142, 144, 145, 147, 148, 150, 151, 153, 
154, 156, 157, 159, 160, 162, 163, 165, 166, 168, 
169, 171, 172, 174, 175, 177, 178, 180, 182, 183, 
185, 186, 188, 189, 191, 192, 194, 195, 197, 198, 
200, 201, 203, 204, 206, 207, 209, 210, 212, 213, 
215, 216, 218, 220, 221, 223, 224, 226, 227, 229, 
230, 232, 233, 235, 236, 238, 239, 241, 242, 244, 
245, 247, 248, 250, 251, 253, 254, 256, 
61, 63, 64, 66, 67, 69, 70, 72, 73, 75, 
77, 78, 80, 81, 83, 84, 86, 87, 89, 90, 
92, 94, 95, 97, 98, 100, 101, 103, 104, 106, 
108, 109, 111, 112, 114, 115, 117, 118, 120, 121, 
123, 125, 126, 128, 129, 131, 132, 134, 135, 137, 
139, 140, 142, 143, 145, 146, 148, 149, 151, 153, 
154, 156, 157, 159, 160, 162, 163, 165, 166, 168, 
170, 171, 173, 174, 176, 177, 179, 180, 182, 184, 
185, 187, 188, 190, 191, 193, 194, 196, 198, 199, 
201, 202, 204, 205, 207, 208, 210, 211, 213, 215, 
216, 218, 219, 221, 222, 224, 225, 227, 229, 230, 
232, 233, 235, 236, 238, 239, 241, 242, 244, 246, 
247, 249, 250, 252, 253, 255, 256, 258, 
59, 61, 62, 64, 65, 67, 68, 70, 72, 73, 
75, 76, 78, 80, 81, 83, 84, 86, 87, 89, 
91, 92, 94, 95, 97, 99, 100, 102, 103, 105, 
106, 108, 110, 111, 113, 114, 116, 118, 119, 121, 
122, 124, 125, 127, 129, 130, 132, 133, 135, 137, 
138, 140, 141, 143, 144, 146, 148, 149, 151, 152, 
154, 156, 157, 159, 160, 162, 163, 165, 167, 168, 
170, 171, 173, 175, 176, 178, 179, 181, 182, 184, 
186, 187, 189, 190, 192, 194, 195, 197, 198, 200, 
201, 203, 205, 206, 208, 209, 211, 213, 214, 216, 
217, 219, 220, 222, 224, 225, 227, 228, 230, 232, 
233, 235, 236, 238, 239, 241, 243, 244, 246, 247, 
249, 251, 252, 254, 255, 257, 258, 260, 
57, 59, 60, 62, 63, 65, 67, 68, 70, 72, 
73, 75, 76, 78, 80, 81, 83, 84, 86, 88, 
89, 91, 93, 94, 96, 97, 99, 101, 102, 104, 
105, 107, 109, 110, 112, 113, 115, 117, 118, 120, 
122, 123, 125, 126, 128, 130, 131, 133, 134, 136, 
138, 139, 141, 143, 144, 146, 147, 149, 151, 152, 
154, 155, 157, 159, 160, 162, 164, 165, 167, 168, 
170, 172, 173, 175, 176, 178, 180, 181, 183, 185, 
186, 188, 189, 191, 193, 194, 196, 197, 199, 201, 
202, 204, 206, 207, 209, 210, 212, 214, 215, 217, 
218, 220, 222, 223, 225, 226, 228, 230, 231, 233, 
235, 236, 238, 239, 241, 243, 244, 246, 247, 249, 
251, 252, 254, 256, 257, 259, 260, 262, 
55, 57, 58, 60, 62, 63, 65, 67, 68, 70, 
71, 73, 75, 76, 78, 80, 81, 83, 85, 86, 
88, 90, 91, 93, 94, 96, 98, 99, 101, 103, 
104, 106, 108, 109, 111, 113, 114, 116, 118, 119, 
121, 122, 124, 126, 127, 129, 131, 132, 134, 136, 
137, 139, 141, 142, 144, 146, 147, 149, 150, 152, 
154, 155, 157, 159, 160, 162, 164, 165, 167, 169, 
170, 172, 173, 175, 177, 178, 180, 182, 183, 185, 
187, 188, 190, 192, 193, 195, 197, 198, 200, 201, 
203, 205, 206, 208, 210, 211, 213, 215, 216, 218, 
220, 221, 223, 225, 226, 228, 229, 231, 233, 234, 
236, 238, 239, 241, 243, 244, 246, 248, 249, 251, 
252, 254, 256, 257, 259, 261, 262, 264, 
53, 55, 56, 58, 60, 61, 63, 65, 66, 68, 
70, 71, 73, 75, 76, 78, 80, 82, 83, 85, 
87, 88, 90, 92, 93, 95, 97, 98, 100, 102, 
103, 105, 107, 108, 110, 112, 113, 115, 117, 118, 
120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 
137, 139, 140, 142, 144, 145, 147, 149, 150, 152, 
154, 155, 157, 159, 160, 162, 164, 165, 167, 169, 
170, 172, 174, 175, 177, 179, 180, 182, 184, 185, 
187, 189, 191, 192, 194, 196, 197, 199, 201, 202, 
204, 206, 207, 209, 211, 212, 214, 216, 217, 219, 
221, 222, 224, 226, 227, 229, 231, 232, 234, 236, 
237, 239, 241, 243, 244, 246, 248, 249, 251, 253, 
254, 256, 258, 259, 261, 263, 264, 266, 
51, 53, 54, 56, 58, 60, 61, 63, 65, 66, 
68, 70, 72, 73, 75, 77, 78, 80, 82, 83, 
85, 87, 89, 90, 92, 94, 95, 97, 99, 101, 
102, 104, 106, 107, 109, 111, 113, 114, 116, 118, 
119, 121, 123, 124, 126, 128, 130, 131, 133, 135, 
136, 138, 140, 142, 143, 145, 147, 148, 150, 152, 
154, 155, 157, 159, 160, 162, 164, 165, 167, 169, 
171, 172, 174, 176, 177, 179, 181, 183, 184, 186, 
188, 189, 191, 193, 195, 196, 198, 200, 201, 203, 
205, 206, 208, 210, 212, 213, 215, 217, 218, 220, 
222, 224, 225, 227, 229, 230, 232, 234, 236, 237, 
239, 241, 242, 244, 246, 247, 249, 251, 253, 254, 
256, 258, 259, 261, 263, 265, 266, 268, 
48, 50, 52, 53, 55, 57, 59, 60, 62, 64, 
66, 67, 69, 71, 73, 74, 76, 78, 80, 81, 
83, 85, 87, 88, 90, 92, 94, 95, 97, 99, 
101, 102, 104, 106, 108, 109, 111, 113, 115, 116, 
118, 120, 122, 124, 125, 127, 129, 131, 132, 134, 
136, 138, 139, 141, 143, 145, 146, 148, 150, 152, 
153, 155, 157, 159, 160, 162, 164, 166, 167, 169, 
171, 173, 174, 176, 178, 180, 181, 183, 185, 187, 
188, 190, 192, 194, 195, 197, 199, 201, 203, 204, 
206, 208, 210, 211, 213, 215, 217, 218, 220, 222, 
224, 225, 227, 229, 231, 232, 234, 236, 238, 239, 
241, 243, 245, 246, 248, 250, 252, 253, 255, 257, 
259, 260, 262, 264, 266, 267, 269, 271, 
47, 49, 51, 52, 54, 56, 58, 59, 61, 63, 
65, 66, 68, 70, 72, 74, 75, 77, 79, 81, 
82, 84, 86, 88, 90, 91, 93, 95, 97, 98, 
100, 102, 104, 105, 107, 109, 111, 113, 114, 116, 
118, 120, 121, 123, 125, 127, 128, 130, 132, 134, 
136, 137, 139, 141, 143, 144, 146, 148, 150, 152, 
153, 155, 157, 159, 160, 162, 164, 166, 167, 169, 
171, 173, 175, 176, 178, 180, 182, 183, 185, 187, 
189, 191, 192, 194, 196, 198, 199, 201, 203, 205, 
206, 208, 210, 212, 214, 215, 217, 219, 221, 222, 
224, 226, 228, 229, 231, 233, 235, 237, 238, 240, 
242, 244, 245, 247, 249, 251, 253, 254, 256, 258, 
260, 261, 263, 265, 267, 268, 270, 272, 
45, 47, 49, 50, 52, 54, 56, 58, 59, 61, 
63, 65, 67, 68, 70, 72, 74, 76, 77, 79, 
81, 83, 85, 86, 88, 90, 92, 94, 95, 97, 
99, 101, 103, 105, 106, 108, 110, 112, 114, 115, 
117, 119, 121, 123, 124, 126, 128, 130, 132, 133, 
135, 137, 139, 141, 142, 144, 146, 148, 150, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 169, 
171, 173, 175, 177, 178, 180, 182, 184, 186, 187, 
189, 191, 193, 195, 196, 198, 200, 202, 204, 205, 
207, 209, 211, 213, 214, 216, 218, 220, 222, 224, 
225, 227, 229, 231, 233, 234, 236, 238, 240, 242, 
243, 245, 247, 249, 251, 252, 254, 256, 258, 260, 
261, 263, 265, 267, 269, 270, 272, 274, 
45, 47, 49, 50, 52, 54, 56, 58, 59, 61, 
63, 65, 67, 68, 70, 72, 74, 76, 77, 79, 
81, 83, 85, 86, 88, 90, 92, 94, 95, 97, 
99, 101, 103, 105, 106, 108, 110, 112, 114, 115, 
117, 119, 121, 123, 124, 126, 128, 130, 132, 133, 
135, 137, 139, 141, 142, 144, 146, 148, 150, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 169, 
171, 173, 175, 177, 178, 180, 182, 184, 186, 187, 
189, 191, 193, 195, 196, 198, 200, 202, 204, 205, 
207, 209, 211, 213, 214, 216, 218, 220, 222, 224, 
225, 227, 229, 231, 233, 234, 236, 238, 240, 242, 
243, 245, 247, 249, 251, 252, 254, 256, 258, 260, 
261, 263, 265, 267, 269, 270, 272, 274, 
43, 45, 47, 49, 50, 52, 54, 56, 58, 60, 
61, 63, 65, 67, 69, 71, 72, 74, 76, 78, 
80, 82, 83, 85, 87, 89, 91, 93, 94, 96, 
98, 100, 102, 104, 105, 107, 109, 111, 113, 115, 
116, 118, 120, 122, 124, 126, 127, 129, 131, 133, 
135, 137, 138, 140, 142, 144, 146, 148, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
171, 173, 175, 177, 179, 181, 182, 184, 186, 188, 
190, 192, 193, 195, 197, 199, 201, 203, 204, 206, 
208, 210, 212, 214, 215, 217, 219, 221, 223, 225, 
226, 228, 230, 232, 234, 236, 237, 239, 241, 243, 
245, 247, 248, 250, 252, 254, 256, 258, 259, 261, 
263, 265, 267, 269, 270, 272, 274, 276, 
39, 41, 43, 45, 47, 48, 50, 52, 54, 56, 
58, 60, 62, 64, 66, 67, 69, 71, 73, 75, 
77, 79, 81, 83, 85, 86, 88, 90, 92, 94, 
96, 98, 100, 102, 104, 105, 107, 109, 111, 113, 
115, 117, 119, 121, 122, 124, 126, 128, 130, 132, 
134, 136, 138, 140, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 179, 181, 183, 185, 187, 189, 
191, 193, 195, 197, 198, 200, 202, 204, 206, 208, 
210, 212, 214, 215, 217, 219, 221, 223, 225, 227, 
229, 231, 233, 234, 236, 238, 240, 242, 244, 246, 
248, 250, 252, 253, 255, 257, 259, 261, 263, 265, 
267, 269, 271, 272, 274, 276, 278, 280, 
38, 40, 42, 44, 46, 48, 49, 51, 53, 55, 
57, 59, 61, 63, 65, 67, 69, 71, 72, 74, 
76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 
95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 
115, 116, 118, 120, 122, 124, 126, 128, 130, 132, 
134, 136, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 183, 185, 187, 189, 
191, 193, 195, 197, 199, 201, 203, 204, 206, 208, 
210, 212, 214, 216, 218, 220, 222, 224, 226, 227, 
229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 
248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 
268, 270, 271, 273, 275, 277, 279, 281, 
38, 40, 42, 44, 46, 48, 49, 51, 53, 55, 
57, 59, 61, 63, 65, 67, 69, 71, 72, 74, 
76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 
95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 
115, 116, 118, 120, 122, 124, 126, 128, 130, 132, 
134, 136, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 183, 185, 187, 189, 
191, 193, 195, 197, 199, 201, 203, 204, 206, 208, 
210, 212, 214, 216, 218, 220, 222, 224, 226, 227, 
229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 
248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 
268, 270, 271, 273, 275, 277, 279, 281, 
36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 
55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 
75, 77, 79, 81, 83, 85, 87, 89, 90, 92, 
94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 
114, 116, 118, 120, 122, 124, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 195, 197, 199, 201, 203, 205, 207, 209, 
211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 
230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 
250, 252, 254, 256, 258, 260, 262, 264, 265, 267, 
269, 271, 273, 275, 277, 279, 281, 283, 
36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 
55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 
75, 77, 79, 81, 83, 85, 87, 89, 90, 92, 
94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 
114, 116, 118, 120, 122, 124, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 195, 197, 199, 201, 203, 205, 207, 209, 
211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 
230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 
250, 252, 254, 256, 258, 260, 262, 264, 265, 267, 
269, 271, 273, 275, 277, 279, 281, 283, 
35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 
55, 57, 59, 60, 62, 64, 66, 68, 70, 72, 
74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 
94, 96, 98, 100, 102, 104, 106, 108, 110, 111, 
113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 196, 198, 200, 202, 204, 206, 208, 209, 
211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 
231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 
251, 253, 255, 257, 259, 260, 262, 264, 266, 268, 
270, 272, 274, 276, 278, 280, 282, 284, 
35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 
55, 57, 59, 60, 62, 64, 66, 68, 70, 72, 
74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 
94, 96, 98, 100, 102, 104, 106, 108, 110, 111, 
113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 196, 198, 200, 202, 204, 206, 208, 209, 
211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 
231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 
251, 253, 255, 257, 259, 260, 262, 264, 266, 268, 
270, 272, 274, 276, 278, 280, 282, 284, 
34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 
54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 
74, 76, 77, 79, 81, 83, 85, 87, 89, 91, 
93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 
113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 
212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 
232, 234, 236, 238, 240, 242, 243, 245, 247, 249, 
251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 
271, 273, 275, 277, 279, 281, 283, 285, 
33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 
53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 
73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 
93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 
113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 
212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 
232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 
252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 
272, 274, 276, 278, 280, 282, 284, 286, 
33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 
53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 
73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 
93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 
113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 
212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 
232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 
252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 
272, 274, 276, 278, 280, 282, 284, 286, 
29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 
50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 
70, 72, 74, 76, 78, 80, 82, 84, 87, 89, 
91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 
111, 113, 115, 117, 119, 121, 124, 126, 128, 130, 
132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 
193, 195, 198, 200, 202, 204, 206, 208, 210, 212, 
214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 
235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 
255, 257, 259, 261, 263, 265, 267, 269, 272, 274, 
276, 278, 280, 282, 284, 286, 288, 290, 
28, 30, 32, 34, 36, 38, 40, 42, 45, 47, 
49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 
69, 71, 74, 76, 78, 80, 82, 84, 86, 88, 
90, 92, 94, 96, 98, 100, 103, 105, 107, 109, 
111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 
132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 175, 177, 179, 181, 183, 185, 187, 190, 192, 
194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 
214, 216, 219, 221, 223, 225, 227, 229, 231, 233, 
235, 237, 239, 241, 243, 245, 248, 250, 252, 254, 
256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 
277, 279, 281, 283, 285, 287, 289, 291, 
28, 30, 32, 34, 36, 38, 40, 42, 45, 47, 
49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 
69, 71, 74, 76, 78, 80, 82, 84, 86, 88, 
90, 92, 94, 96, 98, 100, 103, 105, 107, 109, 
111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 
132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 175, 177, 179, 181, 183, 185, 187, 190, 192, 
194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 
214, 216, 219, 221, 223, 225, 227, 229, 231, 233, 
235, 237, 239, 241, 243, 245, 248, 250, 252, 254, 
256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 
277, 279, 281, 283, 285, 287, 289, 291, 
25, 27, 29, 31, 33, 36, 38, 40, 42, 44, 
46, 48, 50, 53, 55, 57, 59, 61, 63, 65, 
67, 69, 72, 74, 76, 78, 80, 82, 84, 86, 
89, 91, 93, 95, 97, 99, 101, 103, 105, 108, 
110, 112, 114, 116, 118, 120, 122, 125, 127, 129, 
131, 133, 135, 137, 139, 141, 144, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 175, 178, 180, 182, 184, 186, 188, 190, 192, 
194, 197, 199, 201, 203, 205, 207, 209, 211, 214, 
216, 218, 220, 222, 224, 226, 228, 230, 233, 235, 
237, 239, 241, 243, 245, 247, 250, 252, 254, 256, 
258, 260, 262, 264, 266, 269, 271, 273, 275, 277, 
279, 281, 283, 286, 288, 290, 292, 294, 
24, 26, 28, 30, 33, 35, 37, 39, 41, 43, 
45, 47, 50, 52, 54, 56, 58, 60, 62, 65, 
67, 69, 71, 73, 75, 77, 79, 82, 84, 86, 
88, 90, 92, 94, 97, 99, 101, 103, 105, 107, 
109, 111, 114, 116, 118, 120, 122, 124, 126, 129, 
131, 133, 135, 137, 139, 141, 143, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 176, 178, 180, 182, 184, 186, 188, 190, 193, 
195, 197, 199, 201, 203, 205, 208, 210, 212, 214, 
216, 218, 220, 222, 225, 227, 229, 231, 233, 235, 
237, 240, 242, 244, 246, 248, 250, 252, 254, 257, 
259, 261, 263, 265, 267, 269, 272, 274, 276, 278, 
280, 282, 284, 286, 289, 291, 293, 295, 
23, 25, 27, 29, 32, 34, 36, 38, 40, 42, 
44, 47, 49, 51, 53, 55, 57, 60, 62, 64, 
66, 68, 70, 72, 75, 77, 79, 81, 83, 85, 
87, 90, 92, 94, 96, 98, 100, 103, 105, 107, 
109, 111, 113, 115, 118, 120, 122, 124, 126, 128, 
130, 133, 135, 137, 139, 141, 143, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 176, 178, 180, 182, 184, 186, 189, 191, 193, 
195, 197, 199, 201, 204, 206, 208, 210, 212, 214, 
216, 219, 221, 223, 225, 227, 229, 232, 234, 236, 
238, 240, 242, 244, 247, 249, 251, 253, 255, 257, 
259, 262, 264, 266, 268, 270, 272, 275, 277, 279, 
281, 283, 285, 287, 290, 292, 294, 296, 
23, 25, 27, 29, 32, 34, 36, 38, 40, 42, 
44, 47, 49, 51, 53, 55, 57, 60, 62, 64, 
66, 68, 70, 72, 75, 77, 79, 81, 83, 85, 
87, 90, 92, 94, 96, 98, 100, 103, 105, 107, 
109, 111, 113, 115, 118, 120, 122, 124, 126, 128, 
130, 133, 135, 137, 139, 141, 143, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 176, 178, 180, 182, 184, 186, 189, 191, 193, 
195, 197, 199, 201, 204, 206, 208, 210, 212, 214, 
216, 219, 221, 223, 225, 227, 229, 232, 234, 236, 
238, 240, 242, 244, 247, 249, 251, 253, 255, 257, 
259, 262, 264, 266, 268, 270, 272, 275, 277, 279, 
281, 283, 285, 287, 290, 292, 294, 296, 
20, 22, 24, 27, 29, 31, 33, 35, 38, 40, 
42, 44, 46, 49, 51, 53, 55, 57, 60, 62, 
64, 66, 68, 71, 73, 75, 77, 79, 82, 84, 
86, 88, 90, 92, 95, 97, 99, 101, 103, 106, 
108, 110, 112, 114, 117, 119, 121, 123, 125, 128, 
130, 132, 134, 136, 139, 141, 143, 145, 147, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 172, 
174, 176, 178, 180, 183, 185, 187, 189, 191, 194, 
196, 198, 200, 202, 205, 207, 209, 211, 213, 216, 
218, 220, 222, 224, 227, 229, 231, 233, 235, 237, 
240, 242, 244, 246, 248, 251, 253, 255, 257, 259, 
262, 264, 266, 268, 270, 273, 275, 277, 279, 281, 
284, 286, 288, 290, 292, 295, 297, 299, 
20, 22, 24, 27, 29, 31, 33, 35, 38, 40, 
42, 44, 46, 49, 51, 53, 55, 57, 60, 62, 
64, 66, 68, 71, 73, 75, 77, 79, 82, 84, 
86, 88, 90, 92, 95, 97, 99, 101, 103, 106, 
108, 110, 112, 114, 117, 119, 121, 123, 125, 128, 
130, 132, 134, 136, 139, 141, 143, 145, 147, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 172, 
174, 176, 178, 180, 183, 185, 187, 189, 191, 194, 
196, 198, 200, 202, 205, 207, 209, 211, 213, 216, 
218, 220, 222, 224, 227, 229, 231, 233, 235, 237, 
240, 242, 244, 246, 248, 251, 253, 255, 257, 259, 
262, 264, 266, 268, 270, 273, 275, 277, 279, 281, 
284, 286, 288, 290, 292, 295, 297, 299, 
19, 21, 23, 26, 28, 30, 32, 34, 37, 39, 
41, 43, 46, 48, 50, 52, 54, 57, 59, 61, 
63, 65, 68, 70, 72, 74, 77, 79, 81, 83, 
85, 88, 90, 92, 94, 96, 99, 101, 103, 105, 
108, 110, 112, 114, 116, 119, 121, 123, 125, 127, 
130, 132, 134, 136, 138, 141, 143, 145, 147, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 172, 
174, 176, 178, 181, 183, 185, 187, 189, 192, 194, 
196, 198, 200, 203, 205, 207, 209, 211, 214, 216, 
218, 220, 223, 225, 227, 229, 231, 234, 236, 238, 
240, 242, 245, 247, 249, 251, 254, 256, 258, 260, 
262, 265, 267, 269, 271, 273, 276, 278, 280, 282, 
285, 287, 289, 291, 293, 296, 298, 300, 
19, 21, 23, 26, 28, 30, 32, 34, 37, 39, 
41, 43, 46, 48, 50, 52, 54, 57, 59, 61, 
63, 65, 68, 70, 72, 74, 77, 79, 81, 83, 
85, 88, 90, 92, 94, 96, 99, 101, 103, 105, 
108, 110, 112, 114, 116, 119, 121, 123, 125, 127, 
130, 132, 134, 136, 138, 141, 143, 145, 147, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 172, 
174, 176, 178, 181, 183, 185, 187, 189, 192, 194, 
196, 198, 200, 203, 205, 207, 209, 211, 214, 216, 
218, 220, 223, 225, 227, 229, 231, 234, 236, 238, 
240, 242, 245, 247, 249, 251, 254, 256, 258, 260, 
262, 265, 267, 269, 271, 273, 276, 278, 280, 282, 
285, 287, 289, 291, 293, 296, 298, 300, 
18, 20, 22, 25, 27, 29, 31, 34, 36, 38, 
40, 43, 45, 47, 49, 51, 54, 56, 58, 60, 
63, 65, 67, 69, 71, 74, 76, 78, 80, 83, 
85, 87, 89, 92, 94, 96, 98, 100, 103, 105, 
107, 109, 112, 114, 116, 118, 121, 123, 125, 127, 
129, 132, 134, 136, 138, 141, 143, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 176, 178, 181, 183, 185, 187, 190, 192, 194, 
196, 198, 201, 203, 205, 207, 210, 212, 214, 216, 
219, 221, 223, 225, 227, 230, 232, 234, 236, 239, 
241, 243, 245, 248, 250, 252, 254, 256, 259, 261, 
263, 265, 268, 270, 272, 274, 276, 279, 281, 283, 
285, 288, 290, 292, 294, 297, 299, 301, 
16, 18, 21, 23, 25, 27, 30, 32, 34, 36, 
39, 41, 43, 45, 48, 50, 52, 54, 57, 59, 
61, 63, 66, 68, 70, 72, 75, 77, 79, 82, 
84, 86, 88, 91, 93, 95, 97, 100, 102, 104, 
106, 109, 111, 113, 115, 118, 120, 122, 124, 127, 
129, 131, 134, 136, 138, 140, 143, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 176, 179, 181, 183, 185, 188, 190, 192, 195, 
197, 199, 201, 204, 206, 208, 210, 213, 215, 217, 
219, 222, 224, 226, 228, 231, 233, 235, 237, 240, 
242, 244, 247, 249, 251, 253, 256, 258, 260, 262, 
265, 267, 269, 271, 274, 276, 278, 280, 283, 285, 
287, 289, 292, 294, 296, 298, 301, 303, 
16, 18, 21, 23, 25, 27, 30, 32, 34, 36, 
39, 41, 43, 45, 48, 50, 52, 54, 57, 59, 
61, 63, 66, 68, 70, 72, 75, 77, 79, 82, 
84, 86, 88, 91, 93, 95, 97, 100, 102, 104, 
106, 109, 111, 113, 115, 118, 120, 122, 124, 127, 
129, 131, 134, 136, 138, 140, 143, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 176, 179, 181, 183, 185, 188, 190, 192, 195, 
197, 199, 201, 204, 206, 208, 210, 213, 215, 217, 
219, 222, 224, 226, 228, 231, 233, 235, 237, 240, 
242, 244, 247, 249, 251, 253, 256, 258, 260, 262, 
265, 267, 269, 271, 274, 276, 278, 280, 283, 285, 
287, 289, 292, 294, 296, 298, 301, 303, 
15, 17, 20, 22, 24, 26, 29, 31, 33, 35, 
38, 40, 42, 45, 47, 49, 51, 54, 56, 58, 
61, 63, 65, 67, 70, 72, 74, 76, 79, 81, 
83, 86, 88, 90, 92, 95, 97, 99, 101, 104, 
106, 108, 111, 113, 115, 117, 120, 122, 124, 127, 
129, 131, 133, 136, 138, 140, 142, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 177, 179, 181, 183, 186, 188, 190, 192, 195, 
197, 199, 202, 204, 206, 208, 211, 213, 215, 218, 
220, 222, 224, 227, 229, 231, 233, 236, 238, 240, 
243, 245, 247, 249, 252, 254, 256, 258, 261, 263, 
265, 268, 270, 272, 274, 277, 279, 281, 284, 286, 
288, 290, 293, 295, 297, 299, 302, 304, 
15, 17, 20, 22, 24, 26, 29, 31, 33, 35, 
38, 40, 42, 45, 47, 49, 51, 54, 56, 58, 
61, 63, 65, 67, 70, 72, 74, 76, 79, 81, 
83, 86, 88, 90, 92, 95, 97, 99, 101, 104, 
106, 108, 111, 113, 115, 117, 120, 122, 124, 127, 
129, 131, 133, 136, 138, 140, 142, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 177, 179, 181, 183, 186, 188, 190, 192, 195, 
197, 199, 202, 204, 206, 208, 211, 213, 215, 218, 
220, 222, 224, 227, 229, 231, 233, 236, 238, 240, 
243, 245, 247, 249, 252, 254, 256, 258, 261, 263, 
265, 268, 270, 272, 274, 277, 279, 281, 284, 286, 
288, 290, 293, 295, 297, 299, 302, 304, 
15, 17, 20, 22, 24, 26, 29, 31, 33, 35, 
38, 40, 42, 45, 47, 49, 51, 54, 56, 58, 
61, 63, 65, 67, 70, 72, 74, 76, 79, 81, 
83, 86, 88, 90, 92, 95, 97, 99, 101, 104, 
106, 108, 111, 113, 115, 117, 120, 122, 124, 127, 
129, 131, 133, 136, 138, 140, 142, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 177, 179, 181, 183, 186, 188, 190, 192, 195, 
197, 199, 202, 204, 206, 208, 211, 213, 215, 218, 
220, 222, 224, 227, 229, 231, 233, 236, 238, 240, 
243, 245, 247, 249, 252, 254, 256, 258, 261, 263, 
265, 268, 270, 272, 274, 277, 279, 281, 284, 286, 
288, 290, 293, 295, 297, 299, 302, 304, 
14, 16, 19, 21, 23, 25, 28, 30, 32, 35, 
37, 39, 41, 44, 46, 48, 51, 53, 55, 58, 
60, 62, 64, 67, 69, 71, 74, 76, 78, 80, 
83, 85, 87, 90, 92, 94, 96, 99, 101, 103, 
106, 108, 110, 113, 115, 117, 119, 122, 124, 126, 
129, 131, 133, 135, 138, 140, 142, 145, 147, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 172, 
174, 177, 179, 181, 184, 186, 188, 190, 193, 195, 
197, 200, 202, 204, 206, 209, 211, 213, 216, 218, 
220, 223, 225, 227, 229, 232, 234, 236, 239, 241, 
243, 245, 248, 250, 252, 255, 257, 259, 261, 264, 
266, 268, 271, 273, 275, 278, 280, 282, 284, 287, 
289, 291, 294, 296, 298, 300, 303, 305, 
13, 15, 18, 20, 22, 25, 27, 29, 31, 34, 
36, 38, 41, 43, 45, 48, 50, 52, 55, 57, 
59, 61, 64, 66, 68, 71, 73, 75, 78, 80, 
82, 85, 87, 89, 91, 94, 96, 98, 101, 103, 
105, 108, 110, 112, 115, 117, 119, 121, 124, 126, 
128, 131, 133, 135, 138, 140, 142, 145, 147, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 172, 
174, 177, 179, 181, 184, 186, 188, 191, 193, 195, 
198, 200, 202, 204, 207, 209, 211, 214, 216, 218, 
221, 223, 225, 228, 230, 232, 234, 237, 239, 241, 
244, 246, 248, 251, 253, 255, 258, 260, 262, 264, 
267, 269, 271, 274, 276, 278, 281, 283, 285, 288, 
290, 292, 294, 297, 299, 301, 304, 306, 
13, 15, 18, 20, 22, 25, 27, 29, 31, 34, 
36, 38, 41, 43, 45, 48, 50, 52, 55, 57, 
59, 61, 64, 66, 68, 71, 73, 75, 78, 80, 
82, 85, 87, 89, 91, 94, 96, 98, 101, 103, 
105, 108, 110, 112, 115, 117, 119, 121, 124, 126, 
128, 131, 133, 135, 138, 140, 142, 145, 147, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 172, 
174, 177, 179, 181, 184, 186, 188, 191, 193, 195, 
198, 200, 202, 204, 207, 209, 211, 214, 216, 218, 
221, 223, 225, 228, 230, 232, 234, 237, 239, 241, 
244, 246, 248, 251, 253, 255, 258, 260, 262, 264, 
267, 269, 271, 274, 276, 278, 281, 283, 285, 288, 
290, 292, 294, 297, 299, 301, 304, 306, 
12, 14, 17, 19, 21, 24, 26, 28, 31, 33, 
35, 38, 40, 42, 45, 47, 49, 51, 54, 56, 
58, 61, 63, 65, 68, 70, 72, 75, 77, 79, 
82, 84, 86, 89, 91, 93, 96, 98, 100, 103, 
105, 107, 110, 112, 114, 117, 119, 121, 123, 126, 
128, 130, 133, 135, 137, 140, 142, 144, 147, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 172, 
175, 177, 179, 182, 184, 186, 189, 191, 193, 196, 
198, 200, 202, 205, 207, 209, 212, 214, 216, 219, 
221, 223, 226, 228, 230, 233, 235, 237, 240, 242, 
244, 247, 249, 251, 254, 256, 258, 261, 263, 265, 
268, 270, 272, 274, 277, 279, 281, 284, 286, 288, 
291, 293, 295, 298, 300, 302, 305, 307, 
10, 12, 15, 17, 19, 22, 24, 26, 29, 31, 
34, 36, 38, 41, 43, 45, 48, 50, 52, 55, 
57, 59, 62, 64, 67, 69, 71, 74, 76, 78, 
81, 83, 85, 88, 90, 92, 95, 97, 99, 102, 
104, 107, 109, 111, 114, 116, 118, 121, 123, 125, 
128, 130, 132, 135, 137, 139, 142, 144, 147, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 172, 
175, 177, 180, 182, 184, 187, 189, 191, 194, 196, 
198, 201, 203, 205, 208, 210, 212, 215, 217, 220, 
222, 224, 227, 229, 231, 234, 236, 238, 241, 243, 
245, 248, 250, 252, 255, 257, 260, 262, 264, 267, 
269, 271, 274, 276, 278, 281, 283, 285, 288, 290, 
293, 295, 297, 300, 302, 304, 307, 309, 
9, 11, 14, 16, 18, 21, 23, 26, 28, 30, 
33, 35, 37, 40, 42, 45, 47, 49, 52, 54, 
56, 59, 61, 64, 66, 68, 71, 73, 75, 78, 
80, 82, 85, 87, 90, 92, 94, 97, 99, 101, 
104, 106, 109, 111, 113, 116, 118, 120, 123, 125, 
128, 130, 132, 135, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 184, 187, 189, 191, 194, 196, 
199, 201, 203, 206, 208, 210, 213, 215, 218, 220, 
222, 225, 227, 229, 232, 234, 237, 239, 241, 244, 
246, 248, 251, 253, 255, 258, 260, 263, 265, 267, 
270, 272, 274, 277, 279, 282, 284, 286, 289, 291, 
293, 296, 298, 301, 303, 305, 308, 310, 
9, 11, 14, 16, 18, 21, 23, 26, 28, 30, 
33, 35, 37, 40, 42, 45, 47, 49, 52, 54, 
56, 59, 61, 64, 66, 68, 71, 73, 75, 78, 
80, 82, 85, 87, 90, 92, 94, 97, 99, 101, 
104, 106, 109, 111, 113, 116, 118, 120, 123, 125, 
128, 130, 132, 135, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 184, 187, 189, 191, 194, 196, 
199, 201, 203, 206, 208, 210, 213, 215, 218, 220, 
222, 225, 227, 229, 232, 234, 237, 239, 241, 244, 
246, 248, 251, 253, 255, 258, 260, 263, 265, 267, 
270, 272, 274, 277, 279, 282, 284, 286, 289, 291, 
293, 296, 298, 301, 303, 305, 308, 310, 
8, 10, 13, 15, 18, 20, 22, 25, 27, 29, 
32, 34, 37, 39, 41, 44, 46, 49, 51, 53, 
56, 58, 60, 63, 65, 68, 70, 72, 75, 77, 
80, 82, 84, 87, 89, 92, 94, 96, 99, 101, 
103, 106, 108, 111, 113, 115, 118, 120, 123, 125, 
127, 130, 132, 134, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 185, 187, 189, 192, 194, 196, 
199, 201, 204, 206, 208, 211, 213, 216, 218, 220, 
223, 225, 227, 230, 232, 235, 237, 239, 242, 244, 
247, 249, 251, 254, 256, 259, 261, 263, 266, 268, 
270, 273, 275, 278, 280, 282, 285, 287, 290, 292, 
294, 297, 299, 301, 304, 306, 309, 311, 
8, 10, 13, 15, 18, 20, 22, 25, 27, 29, 
32, 34, 37, 39, 41, 44, 46, 49, 51, 53, 
56, 58, 60, 63, 65, 68, 70, 72, 75, 77, 
80, 82, 84, 87, 89, 92, 94, 96, 99, 101, 
103, 106, 108, 111, 113, 115, 118, 120, 123, 125, 
127, 130, 132, 134, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 185, 187, 189, 192, 194, 196, 
199, 201, 204, 206, 208, 211, 213, 216, 218, 220, 
223, 225, 227, 230, 232, 235, 237, 239, 242, 244, 
247, 249, 251, 254, 256, 259, 261, 263, 266, 268, 
270, 273, 275, 278, 280, 282, 285, 287, 290, 292, 
294, 297, 299, 301, 304, 306, 309, 311, 
8, 10, 13, 15, 18, 20, 22, 25, 27, 29, 
32, 34, 37, 39, 41, 44, 46, 49, 51, 53, 
56, 58, 60, 63, 65, 68, 70, 72, 75, 77, 
80, 82, 84, 87, 89, 92, 94, 96, 99, 101, 
103, 106, 108, 111, 113, 115, 118, 120, 123, 125, 
127, 130, 132, 134, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 185, 187, 189, 192, 194, 196, 
199, 201, 204, 206, 208, 211, 213, 216, 218, 220, 
223, 225, 227, 230, 232, 235, 237, 239, 242, 244, 
247, 249, 251, 254, 256, 259, 261, 263, 266, 268, 
270, 273, 275, 278, 280, 282, 285, 287, 290, 292, 
294, 297, 299, 301, 304, 306, 309, 311, 
8, 10, 13, 15, 18, 20, 22, 25, 27, 29, 
32, 34, 37, 39, 41, 44, 46, 49, 51, 53, 
56, 58, 60, 63, 65, 68, 70, 72, 75, 77, 
80, 82, 84, 87, 89, 92, 94, 96, 99, 101, 
103, 106, 108, 111, 113, 115, 118, 120, 123, 125, 
127, 130, 132, 134, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 185, 187, 189, 192, 194, 196, 
199, 201, 204, 206, 208, 211, 213, 216, 218, 220, 
223, 225, 227, 230, 232, 235, 237, 239, 242, 244, 
247, 249, 251, 254, 256, 259, 261, 263, 266, 268, 
270, 273, 275, 278, 280, 282, 285, 287, 290, 292, 
294, 297, 299, 301, 304, 306, 309, 311, 
7, 9, 12, 14, 17, 19, 21, 24, 26, 29, 
31, 33, 36, 38, 41, 43, 45, 48, 50, 53, 
55, 57, 60, 62, 65, 67, 69, 72, 74, 77, 
79, 81, 84, 86, 89, 91, 93, 96, 98, 101, 
103, 105, 108, 110, 113, 115, 117, 120, 122, 125, 
127, 129, 132, 134, 137, 139, 141, 144, 146, 149, 
151, 153, 156, 158, 161, 163, 166, 168, 170, 173, 
175, 178, 180, 182, 185, 187, 190, 192, 194, 197, 
199, 202, 204, 206, 209, 211, 214, 216, 218, 221, 
223, 226, 228, 230, 233, 235, 238, 240, 242, 245, 
247, 250, 252, 254, 257, 259, 262, 264, 266, 269, 
271, 274, 276, 278, 281, 283, 286, 288, 290, 293, 
295, 298, 300, 302, 305, 307, 310, 312, 
6, 8, 11, 13, 16, 18, 21, 23, 25, 28, 
30, 33, 35, 37, 40, 42, 45, 47, 50, 52, 
54, 57, 59, 62, 64, 66, 69, 71, 74, 76, 
79, 81, 83, 86, 88, 91, 93, 95, 98, 100, 
103, 105, 108, 110, 112, 115, 117, 120, 122, 124, 
127, 129, 132, 134, 137, 139, 141, 144, 146, 149, 
151, 153, 156, 158, 161, 163, 166, 168, 170, 173, 
175, 178, 180, 182, 185, 187, 190, 192, 195, 197, 
199, 202, 204, 207, 209, 211, 214, 216, 219, 221, 
224, 226, 228, 231, 233, 236, 238, 240, 243, 245, 
248, 250, 253, 255, 257, 260, 262, 265, 267, 269, 
272, 274, 277, 279, 282, 284, 286, 289, 291, 294, 
296, 298, 301, 303, 306, 308, 311, 313, 
4, 6, 9, 11, 14, 16, 19, 21, 24, 26, 
28, 31, 33, 36, 38, 41, 43, 46, 48, 51, 
53, 55, 58, 60, 63, 65, 68, 70, 73, 75, 
77, 80, 82, 85, 87, 90, 92, 95, 97, 100, 
102, 104, 107, 109, 112, 114, 117, 119, 122, 124, 
126, 129, 131, 134, 136, 139, 141, 144, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
175, 178, 180, 183, 185, 188, 190, 193, 195, 197, 
200, 202, 205, 207, 210, 212, 215, 217, 219, 222, 
224, 227, 229, 232, 234, 237, 239, 242, 244, 246, 
249, 251, 254, 256, 259, 261, 264, 266, 268, 271, 
273, 276, 278, 281, 283, 286, 288, 291, 293, 295, 
298, 300, 303, 305, 308, 310, 313, 315, 
4, 6, 9, 11, 14, 16, 19, 21, 24, 26, 
28, 31, 33, 36, 38, 41, 43, 46, 48, 51, 
53, 55, 58, 60, 63, 65, 68, 70, 73, 75, 
77, 80, 82, 85, 87, 90, 92, 95, 97, 100, 
102, 104, 107, 109, 112, 114, 117, 119, 122, 124, 
126, 129, 131, 134, 136, 139, 141, 144, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
175, 178, 180, 183, 185, 188, 190, 193, 195, 197, 
200, 202, 205, 207, 210, 212, 215, 217, 219, 222, 
224, 227, 229, 232, 234, 237, 239, 242, 244, 246, 
249, 251, 254, 256, 259, 261, 264, 266, 268, 271, 
273, 276, 278, 281, 283, 286, 288, 291, 293, 295, 
298, 300, 303, 305, 308, 310, 313, 315, 
3, 5, 8, 10, 13, 15, 18, 20, 23, 25, 
28, 30, 33, 35, 38, 40, 42, 45, 47, 50, 
52, 55, 57, 60, 62, 65, 67, 70, 72, 74, 
77, 79, 82, 84, 87, 89, 92, 94, 97, 99, 
102, 104, 107, 109, 111, 114, 116, 119, 121, 124, 
126, 129, 131, 134, 136, 139, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 180, 183, 185, 188, 190, 193, 195, 198, 
200, 203, 205, 208, 210, 212, 215, 217, 220, 222, 
225, 227, 230, 232, 235, 237, 240, 242, 245, 247, 
249, 252, 254, 257, 259, 262, 264, 267, 269, 272, 
274, 277, 279, 281, 284, 286, 289, 291, 294, 296, 
299, 301, 304, 306, 309, 311, 314, 316, 
3, 5, 8, 10, 13, 15, 18, 20, 23, 25, 
28, 30, 33, 35, 38, 40, 42, 45, 47, 50, 
52, 55, 57, 60, 62, 65, 67, 70, 72, 74, 
77, 79, 82, 84, 87, 89, 92, 94, 97, 99, 
102, 104, 107, 109, 111, 114, 116, 119, 121, 124, 
126, 129, 131, 134, 136, 139, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 180, 183, 185, 188, 190, 193, 195, 198, 
200, 203, 205, 208, 210, 212, 215, 217, 220, 222, 
225, 227, 230, 232, 235, 237, 240, 242, 245, 247, 
249, 252, 254, 257, 259, 262, 264, 267, 269, 272, 
274, 277, 279, 281, 284, 286, 289, 291, 294, 296, 
299, 301, 304, 306, 309, 311, 314, 316, 
3, 5, 8, 10, 13, 15, 18, 20, 23, 25, 
28, 30, 33, 35, 38, 40, 42, 45, 47, 50, 
52, 55, 57, 60, 62, 65, 67, 70, 72, 74, 
77, 79, 82, 84, 87, 89, 92, 94, 97, 99, 
102, 104, 107, 109, 111, 114, 116, 119, 121, 124, 
126, 129, 131, 134, 136, 139, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 180, 183, 185, 188, 190, 193, 195, 198, 
200, 203, 205, 208, 210, 212, 215, 217, 220, 222, 
225, 227, 230, 232, 235, 237, 240, 242, 245, 247, 
249, 252, 254, 257, 259, 262, 264, 267, 269, 272, 
274, 277, 279, 281, 284, 286, 289, 291, 294, 296, 
299, 301, 304, 306, 309, 311, 314, 316, 
3, 5, 8, 10, 13, 15, 18, 20, 23, 25, 
28, 30, 33, 35, 38, 40, 42, 45, 47, 50, 
52, 55, 57, 60, 62, 65, 67, 70, 72, 74, 
77, 79, 82, 84, 87, 89, 92, 94, 97, 99, 
102, 104, 107, 109, 111, 114, 116, 119, 121, 124, 
126, 129, 131, 134, 136, 139, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 180, 183, 185, 188, 190, 193, 195, 198, 
200, 203, 205, 208, 210, 212, 215, 217, 220, 222, 
225, 227, 230, 232, 235, 237, 240, 242, 245, 247, 
249, 252, 254, 257, 259, 262, 264, 267, 269, 272, 
274, 277, 279, 281, 284, 286, 289, 291, 294, 296, 
299, 301, 304, 306, 309, 311, 314, 316, 
2, 4, 7, 9, 12, 14, 17, 19, 22, 24, 
27, 29, 32, 34, 37, 39, 42, 44, 47, 49, 
52, 54, 57, 59, 62, 64, 66, 69, 71, 74, 
76, 79, 81, 84, 86, 89, 91, 94, 96, 99, 
101, 104, 106, 109, 111, 114, 116, 119, 121, 124, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 195, 198, 
200, 203, 205, 208, 210, 213, 215, 218, 220, 223, 
225, 228, 230, 233, 235, 238, 240, 243, 245, 248, 
250, 253, 255, 257, 260, 262, 265, 267, 270, 272, 
275, 277, 280, 282, 285, 287, 290, 292, 295, 297, 
300, 302, 305, 307, 310, 312, 315, 317, 
1, 3, 6, 8, 11, 13, 16, 18, 21, 23, 
26, 28, 31, 33, 36, 38, 41, 43, 46, 48, 
51, 53, 56, 58, 61, 63, 66, 68, 71, 73, 
76, 78, 81, 83, 86, 88, 91, 93, 96, 98, 
101, 103, 106, 108, 111, 113, 116, 118, 121, 123, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 196, 198, 
201, 203, 206, 208, 211, 213, 216, 218, 221, 223, 
226, 228, 231, 233, 236, 238, 241, 243, 246, 248, 
251, 253, 256, 258, 261, 263, 266, 268, 271, 273, 
276, 278, 281, 283, 286, 288, 291, 293, 296, 298, 
301, 303, 306, 308, 311, 313, 316, 318, 
1, 3, 6, 8, 11, 13, 16, 18, 21, 23, 
26, 28, 31, 33, 36, 38, 41, 43, 46, 48, 
51, 53, 56, 58, 61, 63, 66, 68, 71, 73, 
76, 78, 81, 83, 86, 88, 91, 93, 96, 98, 
101, 103, 106, 108, 111, 113, 116, 118, 121, 123, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 196, 198, 
201, 203, 206, 208, 211, 213, 216, 218, 221, 223, 
226, 228, 231, 233, 236, 238, 241, 243, 246, 248, 
251, 253, 256, 258, 261, 263, 266, 268, 271, 273, 
276, 278, 281, 283, 286, 288, 291, 293, 296, 298, 
301, 303, 306, 308, 311, 313, 316, 318, 
0, 3, 5, 8, 10, 13, 15, 18, 20, 23, 
25, 28, 30, 33, 35, 38, 40, 43, 45, 48, 
50, 53, 55, 58, 60, 63, 65, 68, 70, 73, 
75, 78, 80, 83, 85, 88, 90, 93, 95, 98, 
100, 103, 105, 108, 111, 113, 116, 118, 121, 123, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 196, 198, 
201, 203, 206, 208, 211, 214, 216, 219, 221, 224, 
226, 229, 231, 234, 236, 239, 241, 244, 246, 249, 
251, 254, 256, 259, 261, 264, 266, 269, 271, 274, 
276, 279, 281, 284, 286, 289, 291, 294, 296, 299, 
301, 304, 306, 309, 311, 314, 316, 319, 
0, 3, 5, 8, 10, 13, 15, 18, 20, 23, 
25, 28, 30, 33, 35, 38, 40, 43, 45, 48, 
50, 53, 55, 58, 60, 63, 65, 68, 70, 73, 
75, 78, 80, 83, 85, 88, 90, 93, 95, 98, 
100, 103, 105, 108, 111, 113, 116, 118, 121, 123, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 196, 198, 
201, 203, 206, 208, 211, 214, 216, 219, 221, 224, 
226, 229, 231, 234, 236, 239, 241, 244, 246, 249, 
251, 254, 256, 259, 261, 264, 266, 269, 271, 274, 
276, 279, 281, 284, 286, 289, 291, 294, 296, 299, 
301, 304, 306, 309, 311, 314, 316, 319, 
0, 3, 5, 8, 10, 13, 15, 18, 20, 23, 
25, 28, 30, 33, 35, 38, 40, 43, 45, 48, 
50, 53, 55, 58, 60, 63, 65, 68, 70, 73, 
75, 78, 80, 83, 85, 88, 90, 93, 95, 98, 
100, 103, 105, 108, 111, 113, 116, 118, 121, 123, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 196, 198, 
201, 203, 206, 208, 211, 214, 216, 219, 221, 224, 
226, 229, 231, 234, 236, 239, 241, 244, 246, 249, 
251, 254, 256, 259, 261, 264, 266, 269, 271, 274, 
276, 279, 281, 284, 286, 289, 291, 294, 296, 299, 
301, 304, 306, 309, 311, 314, 316, 319
};
void Camera_Init()
{
   Camera_GPIO_Init();
   Camera_DMA_Init();
   ov7725_eagle_init();
   //ov7725_eagle_reg_init();
}

/*
*备注:使能引脚:行、场中断初始化为上升沿触发、下拉、低通滤波;8个数据传输引脚初始化为禁止中断、下拉、低通滤波;PCLK初始化为下降沿DMA触发、下拉、低通滤波
*/


void Camera_GPIO_Init()
{
   //行中断信号初始化
   GPIO_InitTypeDef GPIO_init;
   GPIO_init.GPIO_PTx = H_GPIO_PORT;
   GPIO_init.GPIO_Pins = H_PIN;
   GPIO_init.GPIO_Dir = DIR_INPUT;
   GPIO_init.GPIO_PinControl = IRQC_RI | INPUT_PULL_DOWN | INPUT_PF_EN;
   GPIO_init.GPIO_Output = 0;
   GPIO_init.GPIO_Isr = camera_h_isr;
   LPLD_GPIO_Init(GPIO_init);
   
   //场中断信号初始化
   GPIO_init.GPIO_PTx = V_GPIO_PORT;
   GPIO_init.GPIO_Pins = V_PIN;
   GPIO_init.GPIO_Dir = DIR_INPUT;
   GPIO_init.GPIO_PinControl = IRQC_RI | INPUT_PULL_DOWN | INPUT_PF_EN;
   GPIO_init.GPIO_Output = 0;
   GPIO_init.GPIO_Isr = camera_v_isr;
   LPLD_GPIO_Init(GPIO_init);
   //数据信号初始化
   GPIO_init.GPIO_PTx = DATA_GPIO_PORT;
   GPIO_init.GPIO_Pins = DATA_PIN;
   GPIO_init.GPIO_Dir = DIR_INPUT;
   GPIO_init.GPIO_PinControl = IRQC_DIS | INPUT_PULL_DOWN | INPUT_PF_EN;
   GPIO_init.GPIO_Output = 0;
   GPIO_init.GPIO_Isr = NULL;
   LPLD_GPIO_Init(GPIO_init);
   //PCLK信号初始化
   GPIO_init.GPIO_PTx = PCLK_GPIO_PORT;
   GPIO_init.GPIO_Pins = PCLK_PIN;
   GPIO_init.GPIO_Dir = DIR_INPUT;
   GPIO_init.GPIO_PinControl = IRQC_DMAFA | INPUT_PULL_DOWN | INPUT_PF_EN;
   GPIO_init.GPIO_Output = 0;
   GPIO_init.GPIO_Isr = NULL;
   LPLD_GPIO_Init(GPIO_init);
   
}

/*
*备注配置DMA
*/
void Camera_DMA_Init()
{
   static DMA_InitTypeDef DMA_init;
   DMA_init.DMA_CHx = DMA_CHX;                              //通道
   DMA_init.DMA_Req = DMA_REQ;                              //DMA请求源
   DMA_init.DMA_PeriodicTriggerEnable = FALSE;              //PIT周期触发关闭
   
   DMA_init.DMA_MajorLoopCnt = DMA_MAJOR_LOOP;              //主循环次数
   DMA_init.DMA_MinorByteCnt = DMA_MINER_BYTE;              //副循环一次传输字节数
   
   DMA_init.DMA_SourceAddr = DMA_SOURCE_ADDR;               //传输源地址
   DMA_init.DMA_DestAddr = DMA_DEST_ADDR;                   //传输目的地址
   
   DMA_init.DMA_SourceDataSize = DMA_SOURCE_DATA_SIZE;      //源数据传输宽度
   DMA_init.DMA_SourceAddrOffset = DMA_SOURCE_ADDR_OFFSET;  //源地址读取后偏移量
   DMA_init.DMA_DestDataSize = DMA_DEST_DATA_SIZE;          //目的数据传输宽度
   DMA_init.DMA_DestAddrOffset = DMA_DEST_ADDR_OFFSET;      //目的地址写入后偏移量
   DMA_init.DMA_AutoDisableReq = TRUE;                      //自动禁用请求
   
   LPLD_DMA_Init(DMA_init);
   LPLD_DMA_DisableReq(DMA_CHX);                            //禁用硬件请求DMA
   
}

void CameraStart()
{
   init_nvic(); 
   enable_irq(V_PORT_IRQn);//开启场中断
   enable_irq(H_PORT_IRQn);//开启行中断
   enable_irq(Reserved110_IRQn);//开启软件中断
   
}

void CameraClose()
{
   disable_irq(V_PORT_IRQn);//关闭场中断
   disable_irq(H_PORT_IRQn);//关闭行中断
   disable_irq(Reserved110_IRQn);//关闭软件中断
//   LPLD_DMA_DisableReq(DMA_CHX);//关闭DMA请求
}

/*
函数名称:ImgExtract(uint8 *src, uint8 *dst, uint32 size)
函数参数: dst:目的地址; src:源地址; size:解压的字节数
函数功能: 将源地址的图像解压为0,1,图像字节数必须是4的倍数
函数时间:2.3~2.4ms
备注:将dma得到的数组,由原来的8位数8个像素改为8个数8个像素
*/

void ImgExtract(uint8 *src, uint8 *dst, uint32 colomn)
{
  register uint8 tmpsrc;
  register uint8 *tmpsrc_Row;
  register uint8 u8i = 64, u8j = colomn;
  
  //将列数换算为对应的一行所用的存储字节数
  colomn=colomn/8;
  
  for (u8i=0; u8i<64; u8i++)
  {
    //依开始行、结束行均匀取行
    tmpsrc_Row = &src[row[u8i]*colomn];
    
    for (u8j=0; u8j<colomn; u8j++)
    {
      tmpsrc = ~(*tmpsrc_Row);            //为了程序执行效率考虑
      tmpsrc_Row++;                       //使用指针代替数组寻址运算

      *dst++ = ((tmpsrc >> 7 ) & 0x01);
      *dst++ = ((tmpsrc >> 6 ) & 0x01);
      *dst++ = ((tmpsrc >> 5 ) & 0x01);
      *dst++ = ((tmpsrc >> 4 ) & 0x01);
      *dst++ = ((tmpsrc >> 3 ) & 0x01);
      *dst++ = ((tmpsrc >> 2 ) & 0x01);
      *dst++ = ((tmpsrc >> 1 ) & 0x01);
      *dst++ = ((tmpsrc >> 0 ) & 0x01);
    }
  }
}


/*
函数名称:ImgCompress_128x64(uint8 *src, uint8 (*image)[IMAGE_WIDTH])
函数参数:  image:目的地址; src:解压后的源地址

函数时间:1.7~1.8ms
备注:将全部的图像依取行和取列数组取相应的行和列
*/

void ImgCompress_128x64(uint8 *src, uint8 (*image)[IMAGE_WIDTH])
{
   register uint16 i, j;
   const uint8 *p = NULL;
   
   for (i = 0; i < IMAGE_HEIGHT; i++)
   {
     p=&src[i*CAMERA_W];
//      for (j = 0; j < IMAGE_WIDTH; j += 4)
//      {
//         image[IMAGE_HEIGHT-1-i][j] = *(p + RowCol[i][j]);
//         image[IMAGE_HEIGHT-1-i][j + 1] = *(p + RowCol[i][j + 1]);
//         image[IMAGE_HEIGHT-1-i][j + 2] = *(p + RowCol[i][j + 2]);
//         image[IMAGE_HEIGHT-1-i][j + 3] = *(p + RowCol[i][j + 3]);
//      }
     for (j = 0; j < IMAGE_WIDTH; j += 1)
     {
       if(RowCol[i][j] != 65535)
       {
         image[IMAGE_HEIGHT-1-i][j] = *(p + RowCol[i][j]);
       }
     }
   }
}


//中断函数
void camera_h_isr()//行中断
{
  static u16 h_counter=0;               //行计数位
  if ((H_PORT->ISFR & H_PIN) != 0)     //注意优先级,该句话滤掉杂波,必不可少
  {
    h_counter++;
    if(h_counter==CAMERA_H)
    {
      h_counter=0;
      SOFT_INTERRUPT_STIG();
    }
    LPLD_DMA_EnableReq(DMA_CHX);      //开启DMA传输
  }
}

void camera_v_isr()//场中断
{
   if ((V_PORT->ISFR & V_PIN) != 0)//注意优先级,该句话滤掉杂波,必不可少
   {
      disable_irq(V_PORT_IRQn);
      if (gl_now_flag == 0)
      {
         LPLD_DMA_LoadDstAddr(DMA_CHX, (uint32)gl_Image1);
         gl_now_flag = 1;
      }
      else
      {
         LPLD_DMA_LoadDstAddr(DMA_CHX, (uint32)gl_Image0);//重新加载目的地址
         gl_now_flag = 0;
      }
      SOFT_INTERRUPT_STIG();//触发中断,该中断函数结束后立即进入图像处理
      enable_irq(V_PORT_IRQn);
   }
}

//软中断中调用解压、压缩函数
void camera_process_isr()
{
   //图像解压提取,约占4.2ms
   if (gl_now_flag == 0)
   {
      ImgExtract(gl_Image1, gl_ImageFull, CAMERA_W);//解压图像
   }
   else
   {
      ImgExtract(gl_Image0, gl_ImageFull, CAMERA_W);//解压图像
   }
   ImgCompress_128x64(gl_ImageFull, gl_ImageCompress);//提取压缩
}

//均匀地取行取列
void init_get_colrow_array()
{
  float32 get_row_ = 0, get_col_ = 0;
  get_row_ = ((float32)CAMERA_H) / ((float32)IMAGE_HEIGHT);
  get_col_ = ((float32)CAMERA_W) / ((float32)IMAGE_WIDTH);
  
  int i, j;
  
  for (j = 0; j < IMAGE_WIDTH; j++)
  {
    for (i = 0; i < IMAGE_HEIGHT; i++)
    {
      RowCol[i][j] = (uint16)(get_col_ * j);
    }
  }
  
  for (i = 0; i < IMAGE_HEIGHT; i++)
  {
    row[i] = (uint16)(get_row_ * i);
  }
  
}

这里先说一下图像采集的整个流程吧:>1.首先定义中断优先级,依次将场中断,场中断定义为优先级最高的两个中断。再定义一个软中断,主要是对于中断产生的数组做一些压缩解压缩,格式转换的处理,使其能实时得到需要显示的数据。然后使能包括行,场中断,以及自定义的场中断。接着,中断捕获产生一个一维的数组,数组经过压缩和解压缩传到存储区存储在数组里,这里压缩应该是为了减小DMA传输的时间,然后经过一个数组定义的取行取列对图像的进行进一步的压缩,从而得到128x64的图像,最后通过一个ImgCompress_128x64将一维数组转为二维数组,再通过oled的一个专用于显示128x64的图像的函数显示图像。

最后附加一个函数分析


void ImgCompress_128x64(uint8 *src, uint8 (*image)[IMAGE_WIDTH])
{
   register uint16 i, j;
   const uint8 *p = NULL;
   
   for (i = 0; i < IMAGE_HEIGHT; i++)
   {
     p=&src[i*CAMERA_W];
     for (j = 0; j < IMAGE_WIDTH; j += 1)
     {
       if(RowCol[i][j] != 65535)
       {
         image[IMAGE_HEIGHT-1-i][j] = *(p + RowCol[i][j]);
       }
     }
   }
}

这是一个一维数组取行取列后转二维的处理函数,然后对其按照上面那一段特别长的数组的取行取列的位对其进行转换,我最初以为gl_ImageFull()已经是经过取行取列处理过的数组,写了一个特别low的函数,特别尴尬。>总的来说这周的学习还是比较满意的,接下来的一周,希望能完成电机控制,让车跑起来吧。

mcc

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z 开发板:CB-S 1、(可选修改/调试技巧:) 除了ov5640.c之外,其它的驱动都不编译,节省编译时间! W:\ov5640_spi20_r40t\lichee\linux-3.10\drivers\media\platform\sunxi-vfe\device\Makefile obj-m += ov5640.o #obj-m += ov2640.o #obj-m += ov7736.o #obj-m += s5k4ec.o #obj-m += s5k4ec_mipi.o #obj-m += gc2035.o #obj-m += gt2005.o #obj-m += gc0307.o #obj-m += gc0308.o #obj-m += gc0328.o #obj-m += gc0328c.o #obj-m += gc2145.o #obj-m += gc0329.o #obj-m += gc0311.o #obj-m += hi253.o #obj-m += sp2518.o #obj-m += sp2519.o #obj-m += sp0718.o #obj-m += sp0838.o #obj-m += ov16825.o #obj-m += ov5650.o #obj-m += ov5647.o #obj-m += ov5647_mipi.o #obj-m += t8et5.o #obj-m += s5k4e1.o #obj-m += s5k4e1_mipi.o #obj-m += sp2518.o #obj-m += sp0718.o #obj-m += gc5004.o #obj-m += gc5004_mipi.o #obj-m += ov5648.o #obj-m += ar0330.o #obj-m += ov5648.o #obj-m += sp5408.o #obj-m += ov12830.o #obj-m += ov8825.o #obj-m += ov8850.o #obj-m += gc2155.o #obj-m += ov8858.o #obj-m += ov13850.o #obj-m += imx214.o #obj-m += ov8858_4lane.o #obj-m += sp5409.o #obj-m += s5k5e2yx.o #obj-m += ov2710_mipi.o #obj-m += ov2686.o (这里是看ov5640的驱动的probe执是否正确?设备ID是否读取成功!) W:\ov5640_spi20_r40t\lichee\linux-3.10\drivers\media\platform\sunxi-vfe\device\ov5640.c static int sensor_detect(struct v4l2_subdev *sd) { data_type rdval; printk("****wyb %s:%d/%s()! \n", __FILE__, __LINE__, __func__); LOG_ERR_RET(sensor_read(sd, 0x300a, &rdval;)) printk("****wyb %s:%d/%s()! 0x300a rdval=0xx\n", __FILE__, __LINE__, __func__, rdval); if(rdval != 0x56) return -ENODEV; LOG_ERR_RET(sensor_read(sd, 0x300b, &rdval;)) printk("****wyb %s:%d/%s()! 0x300b rdval=0xx\n", __FILE__, __LINE__, __func__, rdval); if(rdval != 0x40) return -ENODEV; return 0; } (在全志R16平台改过这个文件,让摄像头不要休眠,但是全志R40平台的tina v2.1系统下不需要修改!) W:\ov5640_spi20_r40t\lichee\linux-3.10\drivers\media\platform\sunxi-vfe\vfe.c 2、(可
调通sina33下的AP6212A0(WIFI+BT) 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 wb4916 AT qq.com 完成时间:2017/6/26 11:01 版本:V1.1 本文参照: 《A33 wifi移植说明书.pdf》 还有就是全志R16的parrotv1.1的官方SDK(Android4.4.2) 1、打开AP6212的BT,关闭rtl8723bs的BT: [ 3.141273] Bluetooth: HCI UART driver ver 2.2 [ 3.146210] Bluetooth: HCI H4 protocol initialized [ 3.151563] Bluetooth: HCI BCSP protocol initialized [ 3.157154] usbcore: registered new interface driver btusb [ 3.163282] Bluetooth: Generic Bluetooth SDIO driver ver 0.1 [ 3.169599] Bluetooth: BlueSleep Mode Driver Ver 1.1 [ 3.175402] Bluetooth: get rtl8723bs rtl8723bs_bt_host_wake gpio failed [ 3.953017] Bluetooth: RFCOMM TTY layer initialized [ 3.958456] Bluetooth: RFCOMM socket layer initialized [ 3.964183] Bluetooth: RFCOMM ver 1.11 [ 3.968340] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [ 3.968638] [mmc]: sdc2 set ios: clk 25000000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 3.968734] [mmc]: mclk 0xf1c20090 0xc100000b [ 3.989421] Bluetooth: BNEP filters: protocol multicast [ 3.995242] Bluetooth: HIDP (Human Interface Emulation) ver 1.2 [ 4.001921] L2TP core driver, V2.0 [ 4.005706] PPPoL2TP kernel driver, V2.0 [ 4.010070] L2TP IP encapsulation support (L2TPv3) [ 4.015468] L2TP netlink interface [ 4.019264] L2TP ethernet pseudowire support (L2TPv3) [ 4.023860] [mmc]: sdc2 set ios: clk 25000000Hz bm PP pm ON vdd 3.3V width 1 timing MMC-HS(SDR20) dt B [ 4.023929] [mmc]: mclk 0xf1c20090 0xc100000b [ 4.040272] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5 [ 4.048780] ThumbEE CPU extension supported. [ 4.053550] Registering SWP/SWPB emulation handler [ 4.059269] [rfkill]: rfkill set power 1 [ 4.063652] gpio ap6xxx_bt_regon set val 0, act val 0 正常启动的BT加载: [ 3.207764] Bluetooth: HCI UART driver ver 2.2 [ 3.212725] Bluetooth: HCI H4 protocol initialized [ 3.218045] Bluetooth: HCI BCSP protocol initialized [ 3.223671] usbcore: registered new interface driver btusb [ 3.229766] Bluetooth: Generic Bluetooth SDIO driver ver 0.1 [ 3.236243] Bluetooth: MSM Sleep Mode Driver Ver 1.2 rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r$ ll rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ ./build.sh config Welcome to mkscript setup progress All available chips: 0. sun8iw5p1 Choice: 0 All available platforms: 0. android 1. dragonboard 2. linux Choice: 0 All available kernel: 0. linux-3.4 Choice: 0 All available boards: 0. evb 1. maple 2. redwood 3. y2 4. y3 Choice: 4 rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ cd linux-3.4/ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4$ make ARCH=arm menuconfig [*] Networking support ---> <*> Bluetooth subsystem support ---> Bluetooth device drivers ---> < > Broadcom Bluetooth Low Power Manager Support <*> Realtek Bluesleep driver support 修改为: <*> Broadcom Bluetooth Low Power Manager Support < > An inverter between bt hostwake pin and cpu (NEW) < > Realtek Bluesleep driver support 2、(这个不修改:) R:\wyb\ap6212a0_a33_sc3817r\android\device\softwinner\astar-y3\overlay\frameworks\base\core\res\res\values\config.xml <!-- List of regexpressions describing the interface (if any) that represent tetherable Wifi interfaces. If the device doesn't want to support tethering over Wifi this should be empty. An example would be "softap.*" --> <string-array translatable="false" name="config_tether_wifi_regexs"> <item>"wlan0"</item> </string-array> <!-- List of regexpressions describing the interface (if any) that represent tetherable bluetooth interfaces. If the device doesn't want to support tethering over bluetooth this should be empty. --> <!-- default: disable Bluetooth PAN feature --> <string-array translatable="false" name="config_tether_bluetooth_regexs"> <item>"bt-pan"</item> </string-array> 3、 R:\wyb\ap6212a0_a33_sc3817r\android\device\softwinner\astar-y3\astar_y3.mk # ap6181/6210/6330 sdio wifi fw and nvram #$(call inherit-product-if-exists, hardware/broadcom/wlan/firmware/ap6181/device-bcm.mk) #$(call inherit-product-if-exists, hardware/broadcom/wlan/firmware/ap6210/device-bcm.mk) $(call inherit-product-if-exists, hardware/broadcom/wlan/firmware/ap6212/device-bcm.mk) #$(call inherit-product-if-exists, hardware/broadcom/wlan/firmware/ap6330/device-bcm.mk) #rtl8723bs bt fw and config #$(call inherit-product, hardware/realtek/bluetooth/rtl8723bs/firmware/rtlbtfw_cfg.mk) # camera config for camera detector #PRODUCT_COPY_FILES += \ # device/softwinner/astar-y3/hawkview/sensor_list_cfg.ini:system/etc/hawkview/sensor_list_cfg.ini #add gms features #PRODUCT_COPY_FILES += \ # frameworks/native/data/etc/android.hardware.faketouch.xml:system/etc/permissions/android.hardware.faketouch.xml \ # frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \ # frameworks/native/data/etc/android.hardware.usb.host.xml:system/etc/permissions/android.hardware.usb.host.xml # 3G Data Card Packages #PRODUCT_PACKAGES += \ # u3gmonitor \ # chat \ # rild \ # pppd # 3G Data Card Configuration Flie #PRODUCT_COPY_FILES += \ # device/softwinner/polaris-common/rild/ip-down:system/etc/ppp/ip-down \ # device/softwinner/polaris-common/rild/ip-up:system/etc/ppp/ip-up \ # device/softwinner/polaris-common/rild/3g_dongle.cfg:system/etc/3g_dongle.cfg \ # device/softwinner/polaris-common/rild/usb_modeswitch:system/bin/usb_modeswitch \ # device/softwinner/polaris-common/rild/call-pppd:system/xbin/call-pppd \ # device/softwinner/polaris-common/rild/usb_modeswitch.sh:system/xbin/usb_modeswitch.sh \ # device/softwinner/polaris-common/rild/apns-conf_sdk.xml:system/etc/apns-conf.xml \ # device/softwinner/polaris-common/rild/libsoftwinner-ril.so:system/lib/libsoftwinner-ril.so #PRODUCT_COPY_FILES += \ # device/softwinner/polaris-common/rild/init.3gdongle.rc:root/init.sunxi.3gdongle.rc # 3G Data Card usb modeswitch File #PRODUCT_COPY_FILES += \ # $(call find-copy-subdir-files,*,device/softwinner/polaris-common/rild/usb_modeswitch.d,system/etc/usb_modeswitch.d) PRODUCT_PROPERTY_OVERRIDES += \ ro.sw.embeded.telephony = false PRODUCT_PROPERTY_OVERRIDES += \ persist.sys.timezone=Asia/Shanghai \ persist.sys.language=zh \ persist.sys.country=CN PRODUCT_PACKAGES += Bluetooth #PRODUCT_PROPERTY_OVERRIDES += \ # ro.product.8723b_bt.used=true #GPS Feature #PRODUCT_PACKAGES += gps.polaris #BOARD_USES_GPS_TYPE := simulator #PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.location.xml:system/etc/permissions/android.hardware.location.xml # evb logger PRODUCT_COPY_FILES += \ device/softwinner/astar-y3/tools/logger.sh:system/bin/logger.sh PRODUCT_PROPERTY_OVERRIDES += \ persist.sys.usb.config=mass_storage,adb \ ro.adb.secure=0 ro.udisk.lable=Polaris \ ro.font.scale=1.0 \ ro.hwa.force=false \ rw.logger=0 \ ro.sys.bootfast=true \ debug.hwc.showfps=0 \ debug.hwui.render_dirty_regions=false #ro.sys.storage_type = emulated \ #for gms #PRODUCT_PROPERTY_OVERRIDES += \ # ro.sys.mutedrm=true \ # ro.adb.secure=1 PRODUCT_PROPERTY_OVERRIDES += \ ro.sf.lcd_density=213 \ ro.product.firmware=v2.0 $(call inherit-product-if-exists, device/softwinner/astar-y3/modules/modules.mk) DEVICE_PACKAGE_OVERLAYS := device/softwinner/astar-y3/overlay PRODUCT_CHARACTERISTICS := tablet # Overrides PRODUCT_AAPT_CONFIG := xlarge hdpi xhdpi large PRODUCT_AAPT_PREF_CONFIG := xhdpi PRODUCT_BRAND := Allwinner PRODUCT_NAME := astar_y3 PRODUCT_DEVICE := astar-y3 PRODUCT_MODEL := QUAD-CORE A33 y3 PRODUCT_MANUFACTURER := softwinner #include device/softwinner/polaris-common/prebuild/google/products/gms_base.mk 4、 R:\wyb\ap6212a0_a33_sc3817r\android\device\softwinner\astar-y3\BoardConfig.mk # wifi and bt configuration # 1. Wifi Configuration # 1.1 realtek wifi support # 1.1 realtek wifi configuration #BOARD_WIFI_VENDOR := realtek ifeq ($(BOARD_WIFI_VENDOR), realtek) WPA_SUPPLICANT_VERSION := VER_0_8_X BOARD_WPA_SUPPLICANT_DRIVER := NL80211 BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_rtl BOARD_HOSTAPD_DRIVER := NL80211 BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_rtl SW_BOARD_USR_WIFI := rtl8188eu BOARD_WLAN_DEVICE := rtl8188eu #SW_BOARD_USR_WIFI := rtl8723au #BOARD_WLAN_DEVICE := rtl8723au #SW_BOARD_USR_WIFI := rtl8723bs #BOARD_WLAN_DEVICE := rtl8723bs endif # 1.2 broadcom wifi support BOARD_WIFI_VENDOR := broadcom ifeq ($(BOARD_WIFI_VENDOR), broadcom) BOARD_WPA_SUPPLICANT_DRIVER := NL80211 WPA_SUPPLICANT_VERSION := VER_0_8_X BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd BOARD_HOSTAPD_DRIVER := NL80211 BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd BOARD_WLAN_DEVICE := bcmdhd WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/bcmdhd/parameters/firmware_path" #SW_BOARD_USR_WIFI := AP6181 #SW_BOARD_USR_WIFI := AP6210 #WIFI_DRIVER_FW_PATH_STA := "/system/vendor/modules/fw_bcm40181a2.bin" #WIFI_DRIVER_FW_PATH_P2P := "/system/vendor/modules/fw_bcm40181a2_p2p.bin" #WIFI_DRIVER_FW_PATH_AP := "/system/vendor/modules/fw_bcm40181a2_apsta.bin" # 2017/6/21 15:11 wenyuanbo configure ap6212 use ap6210 SW_BOARD_USR_WIFI := AP6212 WIFI_DRIVER_FW_PATH_STA := "/system/vendor/modules/fw_bcm43438a0.bin" WIFI_DRIVER_FW_PATH_P2P := "/system/vendor/modules/fw_bcm43438a0_p2p.bin" WIFI_DRIVER_FW_PATH_AP := "/system/vendor/modules/fw_bcm43438a0_apsta.bin" #SW_BOARD_USR_WIFI := AP6330 #WIFI_DRIVER_FW_PATH_STA := "/system/vendor/modules/fw_bcm40183b2_ag.bin" #WIFI_DRIVER_FW_PATH_P2P := "/system/vendor/modules/fw_bcm40183b2_ag_p2p.bin" #WIFI_DRIVER_FW_PATH_AP := "/system/vendor/modules/fw_bcm40183b2_ag_apsta.bin" endif #1.3 eag wifi config #BOARD_WIFI_VENDOR := eagle ifeq ($(BOARD_WIFI_VENDOR), eagle) WPA_SUPPLICANT_VERSION := VER_0_8_X BOARD_WPA_SUPPLICANT_DRIVER := NL80211 BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_eagle BOARD_HOSTAPD_DRIVER := NL80211 BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_eagle SW_BOARD_USR_WIFI := esp8089 BOARD_WLAN_DEVICE := esp8089 endif # 2. Bluetooth Configuration # make sure BOARD_HAVE_BLUETOOTH is true for every bt vendor BOARD_HAVE_BLUETOOTH := true BOARD_HAVE_BLUETOOTH_BCM := true #SW_BOARD_HAVE_BLUETOOTH_NAME := ap6210 SW_BOARD_HAVE_BLUETOOTH_NAME := ap6212 #SW_BOARD_HAVE_BLUETOOTH_NAME := ap6330 #BOARD_HAVE_BLUETOOTH_RTK := true #BLUETOOTH_HCI_USE_RTK_H5 := true #SW_BOARD_HAVE_BLUETOOTH_NAME := rtl8723bs 5、 R:\wyb\ap6212a0_a33_sc3817r\android\device\softwinner\astar-y3\init.sun8i.rc on early-fs mount_all /fstab.sun8i setprop ro.crypto.fuse_sdcard true insmod /system/vendor/modules/disp.ko insmod /system/vendor/modules/lcd.ko insmod /system/vendor/modules/mali.ko insmod /system/vendor/modules/leds-sunxi.ko insmod /system/vendor/modules/bcmdhd.ko insmod /system/vendor/modules/bcm_btlpm.ko #2G or 3G init.rc # import init.sunxi.3gdongle.rc ## 1. realtek & eagle wifi service ## 1.1 realtek & eagle wifi sta service #service wpa_supplicant /system/bin/wpa_supplicant \ # -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ # -O/data/misc/wifi/sockets \ # -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 # # we will start as root and wpa_supplicant will switch to user wifi # # after setting up the capabilities required for WEXT # # user wifi # # group wifi inet keystore # class main # socket wpa_wlan0 dgram 660 wifi wifi # disabled # oneshot # ## 1.2 realtek & eagle wifi sta p2p concurrent service #service p2p_supplicant /system/bin/wpa_supplicant \ # -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ # -e/data/misc/wifi/entropy.bin -N \ # -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ # -O/data/misc/wifi/sockets \ # -g@android:wpa_wlan0 # class main # socket wpa_wlan0 dgram 660 wifi wifi # disabled # oneshot # 2. broadcom wifi service # 2.1 broadcom wifi station and softap service wpa_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ -I/system/etc/wifi/wpa_supplicant_overlay.conf \ -O/data/misc/wifi/sockets \ -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 # we will start as root and wpa_supplicant will switch to user wifi # after setting up the capabilities required for WEXT # user wifi # group wifi inet keystore class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot # 2.2 broadcom wifi sta p2p concurrent service service p2p_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ -I/system/etc/wifi/wpa_supplicant_overlay.conf \ -O/data/misc/wifi/sockets -N \ -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ -I/system/etc/wifi/p2p_supplicant_overlay.conf \ -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin \ -g@android:wpa_wlan0 # we will start as root and wpa_supplicant will switch to user wifi # after setting up the capabilities required for WEXT # user wifi # group wifi inet keystore class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot 6、(不需要修改) R:\wyb\ap6212a0_a33_sc3817r\android\device\softwinner\astar-y3\ueventd.sun8i.rc 7、 R:\wyb\ap6212a0_a33_sc3817r\android\frameworks\base\packages\SettingsProvider\res\values\defaults.xml <integer name="def_screen_off_timeout">1800000</integer> <bool name="def_lockscreen_disabled">true</bool> 8、 R:\wyb\ap6212a0_a33_sc3817r\android\frameworks\base\services\java\com\android\server\BatteryService.java // private static final boolean DEBUG = false; private static final boolean DEBUG = true; private void sendIntentLocked() { // Pack up the values and broadcast them to everyone final Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING); int icon = getIconLocked(mBatteryProps.batteryLevel); intent.putExtra(BatteryManager.EXTRA_STATUS, mBatteryProps.batteryStatus); intent.putExtra(BatteryManager.EXTRA_HEALTH, mBatteryProps.batteryHealth); intent.putExtra(BatteryManager.EXTRA_PRESENT, mBatteryProps.batteryPresent); //intent.putExtra(BatteryManager.EXTRA_LEVEL, mBatteryProps.batteryLevel); intent.putExtra(BatteryManager.EXTRA_LEVEL, 100); intent.putExtra(BatteryManager.EXTRA_SCALE, BATTERY_SCALE); intent.putExtra(BatteryManager.EXTRA_ICON_SMALL, icon); intent.putExtra(BatteryManager.EXTRA_PLUGGED, mPlugType); //intent.putExtra(BatteryManager.EXTRA_VOLTAGE, mBatteryProps.batteryVoltage); intent.putExtra(BatteryManager.EXTRA_VOLTAGE, 4200); intent.putExtra(BatteryManager.EXTRA_TEMPERATURE, mBatteryProps.batteryTemperature); intent.putExtra(BatteryManager.EXTRA_TECHNOLOGY, mBatteryProps.batteryTechnology); intent.putExtra(BatteryManager.EXTRA_INVALID_CHARGER, mInvalidCharger); if (DEBUG) { Slog.d(TAG, "2016/12/05 10:41 wenyuanbo **** Sending ACTION_BATTERY_CHANGED. level:" + mBatteryProps.batteryLevel + ", scale:" + BATTERY_SCALE + ", status:" + mBatteryProps.batteryStatus + ", health:" + mBatteryProps.batteryHealth + ", present:" + mBatteryProps.batteryPresent + ", voltage: " + mBatteryProps.batteryVoltage + ", temperature: " + mBatteryProps.batteryTemperature + ", technology: " + mBatteryProps.batteryTechnology + ", AC powered:" + mBatteryProps.chargerAcOnline + ", USB powered:" + mBatteryProps.chargerUsbOnline + ", Wireless powered:" + mBatteryProps.chargerWirelessOnline + ", icon:" + icon + ", invalid charger:" + mInvalidCharger); } mHandler.post(new Runnable() { @Override public void run() { ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL); } }); } 9、(直接拷贝同目录下的ap6210:) R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\libbt\conf\softwinner\ap6212\Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := bt_vendor.conf LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/bluetooth LOCAL_MODULE_TAGS := eng LOCAL_SRC_FILES := $(LOCAL_MODULE) include $(BUILD_PREBUILT) R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\libbt\conf\softwinner\ap6212\bt_vendor.conf # UART device port where Bluetooth controller is attached UartPort = /dev/ttyS1 # Firmware patch file location FwPatchFilePath = /system/vendor/modules/ # Firmware Name FwPatchFileName = bcm43438a0.hcd 10、新增:vnd_astar-y3-ap6212.txt,直接拷贝:vnd_astar-y2-ap6210.txt R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\libbt\include\vnd_astar-y3-ap6212.txt R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\libbt\include\vnd_astar-y2-ap6210.txt BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyS1" FW_PATCHFILE_LOCATION = "/system/vendor/modules/" LPM_IDLE_TIMEOUT_MULTIPLE = 5 UART_TARGET_BAUD_RATE = 1500000 BT_WAKE_VIA_PROC = TRUE #LPM_SLEEP_MODE = FALSE BTVND_DBG = TRUE BTHW_DBG = TRUE VNDUSERIAL_DBG = TRUE UPIO_DBG = TRUE 11、 R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\libbt\src\userial_vendor.c //#ifdef USE_AP6210_BT_MODULE #if defined(USE_AP6210_BT_MODULE) || defined(USE_AP6212_BT_MODULE) /* PATCH for AP6210. Will detect CTS(module side) to select transport mode*/ ALOGE("userial vendor open: USE AP6210 BT MODULE."); usleep(100000); close(vnd_userial.fd); if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR)) == -1) { ALOGE("userial vendor open: unable to open %s", vnd_userial.port_name); return -1; } #endif //USE_AP6210_BT_MODULE 12、 R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\libbt\Android.mk ifeq ($(SW_BOARD_HAVE_BLUETOOTH_NAME), ap6210) LOCAL_CFLAGS += -DUSE_AP6210_BT_MODULE endif ifeq ($(SW_BOARD_HAVE_BLUETOOTH_NAME), ap6212) LOCAL_CFLAGS += -DUSE_AP6212_BT_MODULE endif ifeq ($(SW_BOARD_HAVE_BLUETOOTH_NAME), ap6330) include $(LOCAL_PATH)/conf/softwinner/ap6330/Android.mk endif ifeq ($(SW_BOARD_HAVE_BLUETOOTH_NAME), ap6210) include $(LOCAL_PATH)/conf/softwinner/ap6210/Android.mk endif ifeq ($(SW_BOARD_HAVE_BLUETOOTH_NAME), ap6212) include $(LOCAL_PATH)/conf/softwinner/ap6212/Android.mk endif 13、 R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\libbt\vnd_buildcfg.mk ifeq ($(SW_BOARD_HAVE_BLUETOOTH_NAME), ap6210) SRC := $(call my-dir)/include/$(addprefix vnd_, $(addsuffix -ap6210.txt,$(basename $(TARGET_DEVICE)))) endif ifeq ($(SW_BOARD_HAVE_BLUETOOTH_NAME), ap6212) SRC := $(call my-dir)/include/$(addprefix vnd_, $(addsuffix -ap6212.txt,$(basename $(TARGET_DEVICE)))) endif 14、(这些AP6212的WIFI的bin文件和BT的hcd文件来自全志R16的SDK,当然也可以找正基原厂/代理商索取:) R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\wlan\firmware\ap6212\bcm43438a0.hcd (根据ap6210修改:) R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\wlan\firmware\ap6212\device-bcm.mk # # Copyright (C) 2008 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ######################## -include hardware/broadcom/wlan/bcmdhd/config/config-bcm.mk PRODUCT_COPY_FILES += \ hardware/broadcom/wlan/firmware/ap6212/fw_bcm43438a0.bin:system/vendor/modules/fw_bcm43438a0.bin \ hardware/broadcom/wlan/firmware/ap6212/fw_bcm43438a0_apsta.bin:system/vendor/modules/fw_bcm43438a0_apsta.bin \ hardware/broadcom/wlan/firmware/ap6212/fw_bcm43438a0_p2p.bin:system/vendor/modules/fw_bcm43438a0_p2p.bin \ hardware/broadcom/wlan/firmware/ap6212/nvram_ap6210.txt:system/vendor/modules/nvram_ap6210.txt \ hardware/broadcom/wlan/firmware/ap6212/bcm43438a0.hcd:system/vendor/modules/bcm43438a0.hcd #hardware/broadcom/wlan/firmware/ap6212/config.txt:system/vendor/modules/config.txt ######################## R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\wlan\firmware\ap6212\fw_bcm43438a0.bin R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\wlan\firmware\ap6212\fw_bcm43438a0_apsta.bin R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\wlan\firmware\ap6212\fw_bcm43438a0_p2p.bin R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\wlan\firmware\ap6212\nvram_ap6212.txt 直接拷贝自nvram_ap6212.txt: R:\wyb\ap6212a0_a33_sc3817r\android\hardware\broadcom\wlan\firmware\ap6212\nvram_ap6210.txt 15、(可选修改:) R:\wyb\ap6212a0_a33_sc3817r\android\packages\apps\Camera2\src\com\android\camera\CameraActivity.java private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { int Level = intent.getIntExtra("level", 0); int Scale = intent.getIntExtra("scale", 100); Log.w(TAG, "2016/11/29 19:54 &&&& wenyuanbo battery Level" + Level); /* *Logic: *1.the battery level is lower then 5%. *2.if in camera, make sure that not in the snapshot progress. *3.if in videocamera, make sure that not in the videorecording progress. *4.everytime starting the camera activity, the battery level is broadcasted, * if meeting the conditions above, give a dialog, press it and finish the activity. *5.if the conditions are not satisfied when started, play for a moment, in the camera acitvity * or video camera activity, the conditiosn are satisfied, also give a dialog for finishing the activity. * *by fuqiang. */ if(Level < 5) { Runnable runnable_close_camera = new Runnable() { @Override public void run() { //close the camera. // CameraActivity.this.finish(); } }; Log.w(TAG, "2016/11/29 18:20 **** wenyuanbo battery Level" + Level); showLocationDialog(); } /* *Logic: *1.the battery level is lhigher then 5% and lower than 15%. *2.if in camera, make sure that not in the snapshot progress. *3.if in videocamera, make sure that not in the videorecording progress. *4.whether in camera or in videocamera, make sure that the flash mode is supported. *5.everytime starting the camera activity, the battery level is broadcasted, * if meeting the conditions above, forbidden the flash(gray icon), give a dialog to notise user. *6.if the conditions are not satisfied when started, play for a moment, in the camera acitvity * or video camera activity, the conditiosn are satisfied, forbidden the flash and give a notice dialog. *7.the dialog is only given once for each camera activity starting. * *by fuqiang. */ else if(Level < 16) { //close the flash mode. /* if (mIsLowBatteryDialogShown == false) { mRotateDialog.showAlertDialog( getString(R.string.warning), getString(R.string.low_battery_15), null, null, getString(R.string.close), null); mIsLowBatteryDialogShown = true; } */ } } } }; 16、(可选:) R:\wyb\ap6212a0_a33_sc3817r\lichee\tools\pack\chips\sun8iw5p1\configs\default\env.cfg bootdelay=3 loglevel=8 17、 R:\wyb\ap6212a0_a33_sc3817r\lichee\tools\pack\chips\sun8iw5p1\configs\y3\sys_config.fex [power_sply] dcdc1_vol = 3000 dcdc2_vol = 1100 dcdc3_vol = 1200 dcdc4_vol = 0 dcdc5_vol = 1500 aldo1_vol = 3300 aldo2_vol = 2500 aldo3_vol = 3000 dldo1_vol = 3300 dldo2_vol = 3300 dldo3_vol = 2800 ;gpio0_vol = 2800 ldoio0_vol = 2800 ;---------------------------------------------------------------------------------- ;uart configuration ;uart_used = uart x enable ;uart_type = 2:2 wire,4:4 wire,8:8 wire, full function ;---------------------------------------------------------------------------------- [uart0] uart_used = 1 uart_port = 0 uart_type = 2 uart_tx = port:PF02<3><1><default><default> uart_rx = port:PF04<3><1><default><default> [uart1] uart_used = 1 uart_port = 1 uart_type = 4 uart_tx = port:PG06<2><1><default><default> uart_rx = port:PG07<2><1><default><default> uart_rts = port:PG08<2><1><default><default> uart_cts = port:PG09<2><1><default><default> [uart2] uart_used = 1 uart_type = 4 uart_tx = port:PB00<2><1><default><default> uart_rx = port:PB01<2><1><default><default> uart_rts = port:PB02<2><1><default><default> uart_cts = port:PB03<2><1><default><default> [uart3] uart_used = 0 uart_type = 4 uart_tx = port:PH06<3><1><default><default> uart_rx = port:PH07<3><1><default><default> uart_rts = port:PH08<3><1><default><default> uart_cts = port:PH09<3><1><default><default> [uart4] uart_used = 0 uart_port = 4 uart_type = 2 uart_tx = port:PA04<2><1><default><default> uart_rx = port:PA05<2><1><default><default> uart_rts = port:PA06<2><1><default><default> uart_cts = port:PA07<2><1><default><default> ;---------------------------------------------------------------------------------- ;capacitor tp configuration ;ctp_twi_id : twi controller ID ;ctp_twi_addr : I2C slave address, 7bit ;ctp_screen_max_x/_y : resolution of touch panel ;ctp_revert_x/_y_flag : whether need to revert x/y ;ctp_exchange_x_y_flag: whether need to exchange the value of x and y ;ctp_int_port : port for tp's interrupt signal ;ctp_wakeup : port for wakeup tp ;---------------------------------------------------------------------------------- [ctp_para] ctp_used = 1 ctp_name = "gt82x" ctp_twi_id = 0 ctp_twi_addr = 0x5d ctp_screen_max_x = 1280 ctp_screen_max_y = 800 ctp_revert_x_flag = 1 ctp_revert_y_flag = 1 ctp_exchange_x_y_flag = 1 ctp_int_port = port:PL04<4><default><default><default> ctp_wakeup = port:PL03<1><default><default><1> ctp_power_ldo = ctp_power_ldo_vol = ctp_power_io = ;-------------------------------------------------------------------------------- ; CTP automatic detection configuration ;ctp_detect_used --- Whether startup automatic inspection function. 1:used,0:unused ;Module name postposition 1 said detection, 0 means no detection. ;-------------------------------------------------------------------------------- [ctp_list_para] ctp_det_used = 1 ft5x_ts = 1 gt82x = 1 gslX680 = 1 gslX680new = 0 gt9xx_ts = 1 gt9xxf_ts = 0 tu_ts = 0 gt818_ts = 1 zet622x = 1 aw5306_ts = 1 icn83xx_ts = 0 [lcd0_para] lcd_used = 1 lcd_driver_name = "default_lcd" lcd_if = 3 lcd_x = 1280 lcd_y = 800 lcd_width = 150 lcd_height = 94 lcd_dclk_freq = 71 lcd_pwm_used = 1 lcd_pwm_ch = 0 lcd_pwm_freq = 50000 lcd_pwm_pol = 1 lcd_hbp = 20 lcd_ht = 1418 lcd_hspw = 10 lcd_vbp = 10 lcd_vt = 830 lcd_vspw = 5 lcd_lvds_if = 0 lcd_lvds_colordepth = 1 lcd_lvds_mode = 0 lcd_frm = 1 lcd_gamma_en = 0 lcd_bright_curve_en = 0 lcd_cmap_en = 0 deu_mode = 0 lcdgamma4iep = 22 smart_color = 90 lcd_bl_en = port:PD13<1><0><default><1> ;ap6xxx_wl_regon = port:PL06<1><default><default><0> ;lcd_bl_en = port:PL06<1><0><default><1> lcd_power = "axp22_dc1sw" lcdd0 = port:PD18<3><0><default><default> lcdd1 = port:PD19<3><0><default><default> lcdd2 = port:PD20<3><0><default><default> lcdd3 = port:PD21<3><0><default><default> lcdd4 = port:PD22<3><0><default><default> lcdd5 = port:PD23<3><0><default><default> lcdd6 = port:PD24<3><0><default><default> lcdd7 = port:PD25<3><0><default><default> lcdd8 = port:PD26<3><0><default><default> lcdd9 = port:PD27<3><0><default><default> ;---------------------------------------------------------------------------------- ;pwm config ;---------------------------------------------------------------------------------- [pwm0_para] pwm_used = 0 pwm_positive = port:PH00<2><0><default><default> [pwm1_para] pwm_used = 1 pwm_positive = port:PH01<2><0><default><default> ;-------------------------------------------------------------------------------- ;wifi configuration ;wifi_sdc_id: 0- SDC0, 1- SDC1, 2- SDC2, 3- SDC3 ;wifi_usbc_id: 0- USB0, 1- USB1, 2- USB2 ;wifi_usbc_type: 1- EHCI(speed 2.0), 2- OHCI(speed 1.0) ;wifi_mod_sel: 0- none, 1- ap6181, 2- ap6210(wifi+bt), ; 3 - rtl8188eu, 4- rtl8723au(wifi+bt), ; 5 - rtl8723bs, 6- esp8089 ;-------------------------------------------------------------------------------- [wifi_para] wifi_used = 1 wifi_sdc_id = 1 wifi_usbc_id = 1 wifi_usbc_type = 1 wifi_mod_sel = 2 wifi_power = "axp22_dldo1" wifi_power_ext1 = "axp22_dldo2" wifi_power_ext2 = "axp22_aldo1" wifi_power_switch = ;wifi_power_switch = port:power0<1><0><default><0> ; 1 - ap6181 sdio wifi gpio config ;ap6xxx_wl_regon = port:PL06<1><default><default><0> ;ap6xxx_wl_host_wake = port:PL07<4><default><default><0> ;ap6xxx_lpo_use_apclk = 1 ; 2 - ap6210 sdio wifi gpio config ap6xxx_wl_regon = port:PL06<1><default><default><0> ;ap6xxx_wl_regon = port:PD13<1><default><default><0> ap6xxx_wl_host_wake = port:PL07<4><default><default><0> ap6xxx_bt_regon = port:PL08<1><default><default><0> ap6xxx_bt_wake = port:PL10<1><default><default><0> ap6xxx_bt_host_wake = port:PL09<4><default><default><0> ap6xxx_lpo_use_apclk = 1 ; 3 - rtl8188eu usb wifi gpio conifg ; 4 - rtl8723au usb wifi + bt ; 5 - rtl8723bs sdio wifi + bt ;rtl8723bs_chip_en = port:PL11<1><default><default><0> ;rtl8723bs_wl_regon = port:PL06<1><default><default><0> ;rtl8723bs_wl_host_wake = port:PL07<4><default><default><0> ;rtl8723bs_bt_regon = port:PL08<1><default><default><0> ;rtl8723bs_bt_wake = port:PL10<1><default><default><0> ;rtl8723bs_bt_host_wake = port:PL09<4><default><default><0> ;rtl8723bs_lpo_use_apclk = 0 ; 6 - eagle sdio wifi ;esp_wl_chip_en = port:PL03<1><default><default><0> ;esp_wl_rst = port:PL02<1><default><default><0> ;-------------------------------------------------------------------------------- ;blue tooth ;bt_used ---- blue tooth used (0- no used, 1- used) ;bt_uard_id ---- uart index ;-------------------------------------------------------------------------------- [bt_para] bt_used = 1 bt_uart_id = 1 power_start = 3 pmu_temp_enable = 0 18、 刷机之后,BT可以用。 传输4.5MB的JPG图片大概需要2分钟。 WIFI: 在设置→WLAN(打开之后): shell@astar-y3:/ $ shell@astar-y3:/ $ [ 469.609956] init: computing context for service '/system/bin/wpa_supplicant' [ 469.618386] init: starting 'p2p_supplicant' [ 469.625739] init: Created socket '/dev/socket/wpa_wlan0' with mode '660', user '1010', group '1010' [ 469.673379] init: waitpid returned pid 2065, status = 0000ff00 [ 469.679923] init: process 'p2p_supplicant', pid 2065 exited [ 476.197334] sndpcm_unmute,line:1099 [ 451.464755] CPU1: Booted secondary processor [ 478.459403] CPU1: shutdown [ 478.462947] [hotplug]: cpu(0) try to kill cpu(1) [ 478.468478] [hotplug]: cpu1 is killed! . shell@astar-y3:/ $ 分析启动的log: [ 17.526849] gpio ap6xxx_wl_regon set val 1, act val 1 [ 17.632508] [ap6xxx]: sdio wifi power state: on [ 17.637576] [mmc]: sdc1 set ios: clk 0Hz bm PP pm UP vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 17.637751] =========== WLAN placed in POWER ON ======== [ 17.654651] [mmc]: sdc1 card_power_on start... [ 17.659576] [mmc]: sdc1 power_supply is null [ 17.664322] [mmc]: sdc1 card_power_on ok [ 17.680039] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 17.690275] [mmc]: mclk 0xf1c2008c 0x8002000e [ 17.772361] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 52, RTO !! [ 17.781309] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 52, RTO !! [ 17.789448] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 17.799714] [mmc]: mclk 0xf1c2008c 0x8002000e [ 17.862032] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 17.872262] [mmc]: mclk 0xf1c2008c 0x8002000e [ 17.933953] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 8, RTO !! [ 17.941997] *******************Try sdio******************* [ 17.948400] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 17.958630] [mmc]: mclk 0xf1c2008c 0x8002000e [ 18.027775] mmc1: queuing unknown CIS tuple 0x80 (2 bytes) [ 18.035416] mmc1: queuing unknown CIS tuple 0x80 (3 bytes) [ 18.043087] mmc1: queuing unknown CIS tuple 0x80 (3 bytes) [ 18.051920] mmc1: queuing unknown CIS tuple 0x80 (7 bytes) [ 18.145287] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing SD-HS(SDR25) dt B [ 18.155436] [mmc]: mclk 0xf1c2008c 0x8002000e [ 18.215346] [mmc]: sdc1 set ios: clk 50000000Hz bm PP pm ON vdd 3.3V width 1 timing SD-HS(SDR25) dt B [ 18.225736] [mmc]: mclk 0xf1c2008c 0x8100000b [ 18.285675] [mmc]: sdc1 set ios: clk 50000000Hz bm PP pm ON vdd 3.3V width 4 timing SD-HS(SDR25) dt B [ 18.296021] [mmc]: mclk 0xf1c2008c 0x8140030b [ 18.357915] mmc1: new high speed SDIO card at address 0001 [ 18.364532] bcmsdh_register: Linux Kernel SDIO/MMC Driver [ 18.364575] *******************sdio init ok******************* [ 18.377207] bcm_wlan_get_oob_irq enter. [ 18.381537] gpio [359] map to virq [7] ok [ 18.388851] F1 signature OK, socitype:0x1 chip:0xa9a6 rev:0x0 pkg:0x4 [ 18.396019] dhdsdio_probe_attach: unsupported chip: 0xa9a6 [ 18.402155] dhdsdio_probe: dhdsdio_probe_attach failed [ 18.407899] bcmsdh_probe: device attach failed [ 18.412981] [ 18.412984] Dongle Host Driver, version 1.88.45.3 (r420671) [ 18.412989] Compiled in drivers/net/wireless/bcmdhd on Jun 26 2017 at 12:06:39 [ 18.428835] dhd_module_init: sdio_register_driver timeout or error [ 18.435928] gpio ap6xxx_wl_regon set val 0, act val 0 [ 18.541549] [ap6xxx]: sdio wifi power state: off [ 18.546679] =========== WLAN placed in POWER OFF ======== [ 18.546915] mmc1: card 0001 removed [ 18.546995] [mmc]: mmc not poweroff notifiy [ 18.547007] [mmc]: sdc1 set ios: clk 0Hz bm OD pm OFF vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 18.547160] [mmc]: sdc1 card_power_off start... [ 18.547166] [mmc]: sdc1 power_supply is null [ 18.547173] [mmc]: sdc1 card_power_off ok [ 18.631655] init: command 'insmod' r=-1 [ 18.636066] init: command 'insmod' r=-1 [ 18.658010] fs_mgr: swapon failed for /dev/block/zram0 [ 18.663804] init: command 'swapon_all' r=-1 [ 18.668504] init: processing action 0x58e70 (console_init) [ 18.675396] init: width = 1280 [ 18.678788] init: height = 800 [ 18.682224] init: s.st_size = 3145728 [ 18.686308] init: logo match failed!fbsize = 4096000 [ 18.718811] init: command 'console_init' r=0 [ 18.723628] init: processing action 0x55bf0 (fs) [ 18.730640] init: command 'mkdir' r=-2 [ 18.741901] init: command 'insmod' r=0 [ 18.752227] init: command 'insmod' r=0 [ 18.756491] init: command 'insmod' r=-1 [ 18.771211] init: command 'insmod' r=0 [ 18.779731] init: command 'insmod' r=0 [ 18.791739] init: command 'insmod' r=0 [ 18.803941] init: command 'insmod' r=0 [ 18.816178] init: command 'insmod' r=0 19、查找:(dhdsdio_probe_attach: unsupported chip: 0xa9a6) rootroot@rootroot-E400:~$ cd wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd/ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ grep "unsupported chip" . -R ./dhd_sdio.c: DHD_ERROR(("%s: unsupported chip: 0xx\n", ./sbutils.c: SI_ERROR(("sb_chip2numcores: unsupported chip 0x%x\n", 匹配到二进制文件 ./dhd_sdio.o 匹配到二进制文件 ./bcmdhd.o 匹配到二进制文件 ./bcmdhd.ko 匹配到二进制文件 ./sbutils.o rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ 经过确认: R:\wyb\ap6212a0_a33_sc3817r\lichee\linux-3.4\drivers\net\wireless\bcmdhd\dhd_sdio.c static bool dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, uint16 devid) { …… bcmsdh_chipinfo(sdh, bus->sih->chip, bus->sih->chiprev); if (!dhdsdio_chipmatch((uint16)bus->sih->chip)) { DHD_ERROR(("%s: unsupported chip: 0xx\n", __FUNCTION__, bus->sih->chip)); goto fail; } …… } 继续追踪: static bool dhdsdio_chipmatch(uint16 chipid) { if (chipid == BCM4325_CHIP_ID) return TRUE; if (chipid == BCM4329_CHIP_ID) return TRUE; if (chipid == BCM4315_CHIP_ID) return TRUE; if (chipid == BCM4319_CHIP_ID) return TRUE; if (chipid == BCM4336_CHIP_ID) return TRUE; if (chipid == BCM4330_CHIP_ID) return TRUE; if (chipid == BCM43237_CHIP_ID) return TRUE; if (chipid == BCM43362_CHIP_ID) return TRUE; if (chipid == BCM4314_CHIP_ID) return TRUE; if (chipid == BCM43242_CHIP_ID) return TRUE; if (chipid == BCM43340_CHIP_ID) return TRUE; if (chipid == BCM43341_CHIP_ID) return TRUE; if (chipid == BCM43143_CHIP_ID) return TRUE; if (chipid == BCM43342_CHIP_ID) return TRUE; if (chipid == BCM4334_CHIP_ID) return TRUE; if (chipid == BCM43239_CHIP_ID) return TRUE; if (chipid == BCM4324_CHIP_ID) return TRUE; if (chipid == BCM4335_CHIP_ID) return TRUE; if (chipid == BCM4339_CHIP_ID) return TRUE; if (chipid == BCM43349_CHIP_ID) return TRUE; if (chipid == BCM4345_CHIP_ID) return TRUE; if (chipid == BCM4350_CHIP_ID) return TRUE; if (chipid == BCM4354_CHIP_ID) return TRUE; if (chipid == BCM4356_CHIP_ID) return TRUE; if (chipid == BCM4358_CHIP_ID) return TRUE; if (chipid == BCM4371_CHIP_ID) return TRUE; if (chipid == BCM43430_CHIP_ID) return TRUE; if (BCM4349_CHIP(chipid)) return TRUE; return FALSE; } 20、 rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ ll 总用量 40 drwxr-xr-x 7 rootroot rootroot 4096 6月 26 12:02 ./ drwx------ 6 rootroot rootroot 4096 6月 26 14:16 ../ drwxr-xr-x 10 rootroot rootroot 4096 9月 4 2014 brandy/ -rw-rw-r-- 1 rootroot rootroot 116 6月 26 12:02 .buildconfig drwxr-xr-x 15 rootroot rootroot 4096 9月 4 2014 buildroot/ -r-xr-xr-x 1 rootroot rootroot 55 9月 4 2014 build.sh* drwxr-xr-x 28 rootroot rootroot 4096 6月 26 14:30 linux-3.4/ drwxrwxr-x 3 rootroot rootroot 4096 6月 26 12:02 out/ -r--r--r-- 1 rootroot rootroot 232 9月 4 2014 README drwxr-xr-x 7 rootroot rootroot 4096 6月 7 19:33 tools/ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ ./build.sh config Welcome to mkscript setup progress All available chips: 0. sun8iw5p1 Choice: 0 All available platforms: 0. android 1. dragonboard 2. linux Choice: 0 All available kernel: 0. linux-3.4 Choice: 0 All available boards: 0. evb 1. maple 2. redwood 3. y2 4. y3 Choice: 4 rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ ./build.sh INFO: ---------------------------------------- INFO: build lichee ... INFO: chip: sun8iw5p1 INFO: platform: android INFO: kernel: linux-3.4 INFO: board: y3 INFO: output: out/sun8iw5p1/android/y3 INFO: ---------------------------------------- INFO: build buildroot ... external toolchain has been installed INFO: build buildroot OK. INFO: build kernel ... INFO: prepare toolchain ... Building kernel CHK include/linux/version.h CHK include/generated/utsrelease.h make[1]: “include/generated/mach-types.h”是最新的。 CALL scripts/checksyscalls.sh CHK include/generated/compile.h CC arch/arm/mach-sunxi/pm/standby/common.o CC arch/arm/mach-sunxi/pm/standby/standby_clock.o CC arch/arm/mach-sunxi/pm/standby/standby_ir.o CC arch/arm/mach-sunxi/pm/standby/standby_key.o CC arch/arm/mach-sunxi/pm/standby/standby_power.o CC arch/arm/mach-sunxi/pm/standby/standby_twi.o CC arch/arm/mach-sunxi/pm/standby/standby_usb.o AS arch/arm/mach-sunxi/pm/standby/standby_delay.o CC arch/arm/mach-sunxi/pm/standby/./arisc/standby_arisc.o CC arch/arm/mach-sunxi/pm/standby/./arisc/arisc_hwmsgbox.o CHK kernel/config_data.h CC arch/arm/mach-sunxi/pm/standby/./arisc/arisc_hwspinlock.o CC arch/arm/mach-sunxi/pm/standby/./arisc/arisc_message_manager.o CC arch/arm/mach-sunxi/pm/standby/./../pm_debug.o CC arch/arm/mach-sunxi/pm/standby/./../mem_timing.o CC arch/arm/mach-sunxi/pm/standby/./../mem_mmu_pc.o AS arch/arm/mach-sunxi/pm/standby/./../mem_mmu_pc_asm.o CC arch/arm/mach-sunxi/pm/standby/./../mem_serial.o CC arch/arm/mach-sunxi/pm/standby/./../mem_printk.o AS arch/arm/mach-sunxi/pm/standby/./../mem_divlib.o CC arch/arm/mach-sunxi/pm/standby/./../mem_divlibc.o CC arch/arm/mach-sunxi/pm/standby/./../mem_int.o CC arch/arm/mach-sunxi/pm/standby/./../mem_tmr.o CC arch/arm/mach-sunxi/pm/standby/./../mem_tmstmp.o CC arch/arm/mach-sunxi/pm/standby/./../mem_clk.o CC arch/arm/mach-sunxi/pm/standby/./../mem_hwspinlock.o CC arch/arm/mach-sunxi/pm/standby/standby.o rm -rf *.o arch/arm/mach-sunxi/pm/standby/../*.o CC arch/arm/mach-sunxi/pm/standby/super/common.o CC arch/arm/mach-sunxi/pm/standby/super/super_twi.o CC [M] drivers/net/wireless/bcmdhd/dhd_sdio.o AS arch/arm/mach-sunxi/pm/standby/super/super_delay.o CC arch/arm/mach-sunxi/pm/standby/super/super_clock.o CC arch/arm/mach-sunxi/pm/standby/super/super_power.o CC arch/arm/mach-sunxi/pm/standby/super/super_cpus.o AS arch/arm/mach-sunxi/pm/standby/super/resume/resume1.o CC arch/arm/mach-sunxi/pm/standby/super/resume/resume_head.o CC arch/arm/mach-sunxi/pm/standby/super/resume/resume1_c_part.o CC arch/arm/mach-sunxi/pm/standby/../pm_debug.o CC arch/arm/mach-sunxi/pm/standby/../mem_timing.o CC arch/arm/mach-sunxi/pm/standby/../mem_mmu_pc.o AS arch/arm/mach-sunxi/pm/standby/../mem_mmu_pc_asm.o CC arch/arm/mach-sunxi/pm/standby/../mem_cpu.o CC arch/arm/mach-sunxi/pm/standby/../mem_serial.o CC arch/arm/mach-sunxi/pm/standby/../mem_printk.o CC [M] drivers/net/wireless/bcmdhd/dhd_cdc.o CC [M] drivers/net/wireless/bcmdhd/bcmsdh_linux.o CC [M] drivers/net/wireless/bcmdhd/dhd_common.o AS arch/arm/mach-sunxi/pm/standby/../mem_divlib.o CC arch/arm/mach-sunxi/pm/standby/../mem_divlibc.o drivers/net/wireless/bcmdhd/dhd_sdio.c: In function ‘dhdsdio_chipmatch’: drivers/net/wireless/bcmdhd/dhd_sdio.c:6936:16: error: ‘BCM43430_CHIP_ID’ undeclared (first use in this function) drivers/net/wireless/bcmdhd/dhd_sdio.c:6936:16: note: each undeclared identifier is reported only once for each function it appears in CC arch/arm/mach-sunxi/pm/standby/../mem_int.o make[4]: *** [drivers/net/wireless/bcmdhd/dhd_sdio.o] 错误 1 make[4]: *** 正在等待未完成的任务.... CC arch/arm/mach-sunxi/pm/standby/../mem_tmr.o CC arch/arm/mach-sunxi/pm/standby/../mem_tmstmp.o CC arch/arm/mach-sunxi/pm/standby/../mem_hwspinlock.o CC arch/arm/mach-sunxi/pm/standby/../mem_clk.o Source file is open Destination file is created. Source file is open Destination file is open. temp value is 400. 0 soure_file size is 9496. destination_file size is 0x2800. check sum generated is 0x68D92007. Everything is ok. rm -rf *.o arch/arm/mach-sunxi/pm/standby/../*.o CC arch/arm/mach-sunxi/pm/mem_mapping.o CC arch/arm/mach-sunxi/pm/mem_divlibc.o CC arch/arm/mach-sunxi/pm/mem_cpu.o AS arch/arm/mach-sunxi/pm/mem_cpu_asm.o AS arch/arm/mach-sunxi/pm/mem_mmu_pc_asm.o CC arch/arm/mach-sunxi/pm/mem_mmu_pc.o CC arch/arm/mach-sunxi/pm/mem_int.o CC arch/arm/mach-sunxi/pm/mem_clk.o CC arch/arm/mach-sunxi/pm/mem_tmr.o CC arch/arm/mach-sunxi/pm/mem_tmstmp.o CC arch/arm/mach-sunxi/pm/mem_twi.o CC arch/arm/mach-sunxi/pm/mem_gpio.o CC arch/arm/mach-sunxi/pm/mem_sram.o CC arch/arm/mach-sunxi/pm/mem_ccu.o CC arch/arm/mach-sunxi/pm/mem_cci400.o CC arch/arm/mach-sunxi/pm/mem_gtbus.o CC arch/arm/mach-sunxi/pm/pm_debug.o CC arch/arm/mach-sunxi/pm/mem_timing.o CC arch/arm/mach-sunxi/pm/mem_hwspinlock.o CC arch/arm/mach-sunxi/pm/pm.o CC arch/arm/mach-sunxi/pm/extended_standby.o CC arch/arm/mach-sunxi/pm/standby/super/super_power.o CC arch/arm/mach-sunxi/pm/standby/super/super_twi.o CC arch/arm/mach-sunxi/pm/standby/super/super_clock.o AS arch/arm/mach-sunxi/pm/standby.o AS arch/arm/mach-sunxi/pm/mem.o LD arch/arm/mach-sunxi/pm/pm_tmp.o LD arch/arm/mach-sunxi/pm/built-in.o LD arch/arm/mach-sunxi/built-in.o make[3]: *** [drivers/net/wireless/bcmdhd] 错误 2 make[2]: *** [drivers/net/wireless] 错误 2 make[1]: *** [drivers/net] 错误 2 make: *** [drivers] 错误 2 ERROR: build kernel Failed rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ 21、(dhdsdio_probe_attach: unsupported chip: 0xa9a6) R:\wyb\ap6212a0_a33_sc3817r\lichee\linux-3.4\drivers\net\wireless\bcmdhd\include\bcmdevs.h #define BCM4350_CHIP_ID 0x4350 #define BCM43430_CHIP_ID 43430 /* 43430 chipcommon chipid 0xa9a6 */ #define BCM4342_CHIP_ID 4342 可以编译通过了。 (查看属性:) shell@astar-y3:/ $ shell@astar-y3:/ $ cd /system/vendor/modules/ shell@astar-y3:/system/vendor/modules $ ll bcm* -rw-r--r-- root root 26020 2017-06-26 12:46 bcm43438a0.hcd -rw-r--r-- root root 748856 2017-06-26 12:46 bcmdhd.ko shell@astar-y3:/system/vendor/modules $ Microsoft Windows [版本 6.1.7600] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 C:\Users\Administrator>cd R:\wyb\ap6212a0_a33_sc3817r\lichee\linux-3.4\drivers\n et\wireless\bcmdhd C:\Users\Administrator>r: R:\wyb\ap6212a0_a33_sc3817r\lichee\linux-3.4\drivers\net\wireless\bcmdhd>adb remount * daemon not running. starting it now on port 5037 * * daemon started successfully * remount succeeded R:\wyb\ap6212a0_a33_sc3817r\lichee\linux-3.4\drivers\net\wireless\bcmdhd> R:\wyb\ap6212a0_a33_sc3817r\lichee\linux-3.4\drivers\net\wireless\bcmdhd>adb push bcmdhd.ko /system/vendor/modules/ 1677 KB/s (748864 bytes in 0.436s) R:\wyb\ap6212a0_a33_sc3817r\lichee\linux-3.4\drivers\net\wireless\bcmdhd> 继续查看属性: shell@astar-y3:/system/vendor/modules $ ll bcm* -rw-r--r-- root root 26020 2017-06-26 12:46 bcm43438a0.hcd -rw-rw-rw- root root 748864 2017-06-26 14:34 bcmdhd.ko shell@astar-y3:/system/vendor/modules $ shell@astar-y3:/system/vendor/modules $ shell@astar-y3:/system/vendor/modules $ chmod 644 bcmdhd.ko Unable to chmod bcmdhd.ko: Operation not permitted 10|shell@astar-y3:/system/vendor/modules $ (必须在su下才能够修改属性:) shell@astar-y3:/system/vendor/modules $ su shell@astar-y3:/system/vendor/modules # chmod 644 bcmdhd.ko shell@astar-y3:/system/vendor/modules # shell@astar-y3:/system/vendor/modules # sync shell@astar-y3:/system/vendor/modules # reboot 22、 [ 0.658241] [wifi]: select wifi: ap6210 !! [ 0.658587] [ap6xxx]: module power name axp22_dldo1 [ 0.658601] [ap6xxx]: module power ext1 name axp22_dldo2 [ 0.658613] [ap6xxx]: module power ext2 name axp22_aldo1 [ 0.658721] [ap6xxx]: get ap6xxx wifi_power_switch failed [ 0.658731] [ap6xxx]: ap6xxx module power set by axp. [ 0.658930] [ap6xxx]: first time [ 0.659285] [ap6xxx]: regulator on. [ 0.661306] [wifi_pm]: wifi gpio init is OK !! (重启之后,WIFI模块要想办法配置为ap6212,现阶段借用的是AP6210!) [ 8.517657] gpio ap6xxx_wl_regon set val 1, act val 1 [ 8.623325] [ap6xxx]: sdio wifi power state: on [ 8.628389] [mmc]: sdc1 set ios: clk 0Hz bm PP pm UP vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 8.628566] =========== WLAN placed in POWER ON ======== [ 8.645459] [mmc]: sdc1 card_power_on start... [ 8.650397] [mmc]: sdc1 power_supply is null [ 8.655129] [mmc]: sdc1 card_power_on ok [ 8.680031] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 8.690267] [mmc]: mclk 0xf1c2008c 0x8002000e [ 8.772360] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 52, RTO !! [ 8.781316] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 52, RTO !! [ 8.789448] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 8.799684] [mmc]: mclk 0xf1c2008c 0x8002000e [ 8.861971] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 8.872189] [mmc]: mclk 0xf1c2008c 0x8002000e [ 8.933887] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 8, RTO !! [ 8.941921] *******************Try sdio******************* [ 8.948329] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B [ 8.958545] [mmc]: mclk 0xf1c2008c 0x8002000e [ 9.027690] mmc1: queuing unknown CIS tuple 0x80 (2 bytes) [ 9.035325] mmc1: queuing unknown CIS tuple 0x80 (3 bytes) [ 9.043192] mmc1: queuing unknown CIS tuple 0x80 (3 bytes) [ 9.052046] mmc1: queuing unknown CIS tuple 0x80 (7 bytes) [ 9.145358] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing SD-HS(SDR25) dt B [ 9.155486] [mmc]: mclk 0xf1c2008c 0x8002000e [ 9.215398] [mmc]: sdc1 set ios: clk 50000000Hz bm PP pm ON vdd 3.3V width 1 timing SD-HS(SDR25) dt B [ 9.225785] [mmc]: mclk 0xf1c2008c 0x8100000b [ 9.285721] [mmc]: sdc1 set ios: clk 50000000Hz bm PP pm ON vdd 3.3V width 4 timing SD-HS(SDR25) dt B [ 9.296049] [mmc]: mclk 0xf1c2008c 0x8140030b [ 9.357922] mmc1: new high speed SDIO card at address 0001 [ 9.364523] bcmsdh_register: Linux Kernel SDIO/MMC Driver [ 9.364563] *******************sdio init ok******************* [ 9.377203] bcm_wlan_get_oob_irq enter. [ 9.381534] gpio [359] map to virq [7] ok [ 9.388816] F1 signature OK, socitype:0x1 chip:0xa9a6 rev:0x0 pkg:0x4 [ 9.396740] DHD: dongle ram size is set to 524288(orig 524288) at 0x0 [ 9.404660] dhdsdio_probe: Disable prop_txstatus [ 9.410903] wl_create_event_handler(): thread:wl_event_handler:5d started [ 9.410914] tsk Enter, tsk = 0xddca13d8 [ 9.423788] p2p0: P2P Interface Registered [ 9.428464] dhd_attach(): thread:dhd_watchdog_thread:5e started [ 9.435144] dhd_attach(): thread:dhd_dpc:5f started [ 9.440653] dhd_attach(): thread:dhd_sysioc:60 started [ 9.447276] Broadcom Dongle Host Driver: register interface [wlan0] MAC: 00:90:4c:11:22:33 [ 9.456558] [ 9.456561] Dongle Host Driver, version 1.88.45.3 (r420671) [ 9.456565] Compiled in drivers/net/wireless/bcmdhd on Jun 26 2017 at 14:34:04 [ 9.472427] gpio ap6xxx_wl_regon set val 0, act val 0 [ 9.578054] [ap6xxx]: sdio wifi power state: off [ 9.583186] =========== WLAN placed in RESET ======== (WIFI启动加载正常) shell@astar-y3:/ $ lsmod gt82x 9849 0 - Live 0x00000000 sunxi_schw 12559 0 - Live 0x00000000 (O) cdc_ether 5099 0 - Live 0x00000000 rtl8150 9023 0 - Live 0x00000000 mcs7830 6292 0 - Live 0x00000000 qf9700 7805 0 - Live 0x00000000 asix 17150 0 - Live 0x00000000 usbnet 17700 4 cdc_ether,mcs7830,qf9700,asix, Live 0x00000000 sunxi_keyboard 3021 0 - Live 0x00000000 sw_device 13604 0 - Live 0x00000000 vfe_v4l2 445364 0 - Live 0x00000000 gc2035 12696 0 - Live 0x00000000 gc0308 10702 0 - Live 0x00000000 vfe_subdev 4523 3 vfe_v4l2,gc2035,gc0308, Live 0x00000000 vfe_os 4099 2 vfe_v4l2,vfe_subdev, Live 0x00000000 cci 21594 2 gc2035,gc0308, Live 0x00000000 videobuf_dma_contig 5535 1 vfe_v4l2, Live 0x00000000 videobuf_core 16520 2 vfe_v4l2,videobuf_dma_contig, Live 0x00000000 bcmdhd 556965 0 - Live 0x00000000 leds_sunxi 1351 0 - Live 0x00000000 mali 209914 20 - Live 0x00000000 (O) lcd 38180 0 - Live 0x00000000 disp 993096 8 mali,lcd, Live 0x00000000 nand 280622 0 - Live 0x00000000 (O) shell@astar-y3:/ $ (bcmdhd.ko这个驱动模块加载正常:) (BT没有打开,但是不停地打印BT超时出错,不知道是何解?) shell@astar-y3:/ $ [ 511.880344] [BT_LPM] bluesleep_tx_timer_expire: Tx timer expired [ 511.887326] [BT_LPM] bluesleep_tx_timer_expire: Tx has been idle 23、 由于此时WIFI出于记住上一次的状态的状态(打不开),所以需要重新刷镜像IMG,然后替换:bcmdhd.ko shell@astar-y3:/ $ shell@astar-y3:/ $ lsmod gt82x 9849 0 - Live 0x00000000 sunxi_schw 12559 0 - Live 0x00000000 (O) cdc_ether 5099 0 - Live 0x00000000 rtl8150 9023 0 - Live 0x00000000 mcs7830 6292 0 - Live 0x00000000 qf9700 7805 0 - Live 0x00000000 asix 17150 0 - Live 0x00000000 usbnet 17700 4 cdc_ether,mcs7830,qf9700,asix, Live 0x00000000 sunxi_keyboard 3021 0 - Live 0x00000000 sw_device 13604 0 - Live 0x00000000 vfe_v4l2 445364 0 - Live 0x00000000 gc2035 12696 0 - Live 0x00000000 gc0308 10702 0 - Live 0x00000000 vfe_subdev 4523 3 vfe_v4l2,gc2035,gc0308, Live 0x00000000 vfe_os 4099 2 vfe_v4l2,vfe_subdev, Live 0x00000000 cci 21594 2 gc2035,gc0308, Live 0x00000000 videobuf_dma_contig 5535 1 vfe_v4l2, Live 0x00000000 videobuf_core 16520 2 vfe_v4l2,videobuf_dma_contig, Live 0x00000000 bcmdhd 556965 0 - Live 0x00000000 leds_sunxi 1351 0 - Live 0x00000000 mali 209914 15 - Live 0x00000000 (O) lcd 38180 0 - Live 0x00000000 disp 993096 8 mali,lcd, Live 0x00000000 nand 280622 0 - Live 0x00000000 (O) shell@astar-y3:/ $ shell@astar-y3:/ $ shell@astar-y3:/ $ [ 110.012176] init: computing context for service '/system/bin/wpa_supplicant' [ 110.025400] init: starting 'p2p_supplicant' [ 110.039886] init: Created socket '/dev/socket/wpa_wlan0' with mode '660', user '1010', group '1010' [ 110.119751] dhd_conf_set_fw_name_by_chip: firmware_path=/system/vendor/modules/fw_bcm43438a0.bin [ 110.140144] [ 110.140153] Dongle Host Driver, version 1.88.45.3 (r420671) [ 110.140158] Compiled in drivers/net/wireless/bcmdhd on Jun 26 2017 at 14:34:04 [ 110.173523] wl_android_wifi_on in 1 [ 110.177409] wl_android_wifi_on in 2: g_wifi_on=0 [ 110.200103] gpio ap6xxx_wl_regon set val 1, act val 1 [ 110.280025] [BT_LPM] bluesleep_tx_timer_expire: Tx timer expired [ 110.286694] [BT_LPM] bluesleep_tx_timer_expire: Tx has been idle [ 110.355684] [ap6xxx]: sdio wifi power state: on [ 110.360930] =========== WLAN going back to live ======== [ 110.366925] sdio_reset_comm(): [ 110.370346] [mmc]: sdc1 set ios: clk 50000000Hz bm PP pm ON vdd 3.3V width 4 timing SD-HS(SDR25) dt B [ 110.380773] [mmc]: mclk 0xf1c2008c 0x8140030b [ 110.443029] [mmc]: sdc1 set ios: clk 50000000Hz bm PP pm ON vdd 3.3V width 4 timing SD-HS(SDR25) dt B [ 110.454758] [mmc]: mclk 0xf1c2008c 0x8140030b [ 110.516097] [mmc]: sdc1 set ios: clk 150000Hz bm PP pm ON vdd 3.3V width 4 timing SD-HS(SDR25) dt B [ 110.530958] [mmc]: mclk 0xf1c2008c 0x80430309 [ 110.592013] [mmc]: sdc1 set ios: clk 150000Hz bm PP pm ON vdd 3.3V width 4 timing SD-HS(SDR25) dt B [ 110.603518] [mmc]: mclk 0xf1c2008c 0x80030009 [ 110.681418] mmc1: queuing unknown CIS tuple 0x80 (2 bytes) [ 110.690726] mmc1: queuing unknown CIS tuple 0x80 (3 bytes) [ 110.700331] mmc1: queuing unknown CIS tuple 0x80 (3 bytes) [ 110.712218] mmc1: queuing unknown CIS tuple 0x80 (7 bytes) [ 110.894520] [mmc]: sdc1 set ios: clk 150000Hz bm PP pm ON vdd 3.3V width 4 timing SD-HS(SDR25) dt B [ 110.904933] [mmc]: mclk 0xf1c2008c 0x80030009 [ 110.964907] [mmc]: sdc1 set ios: clk 50000000Hz bm PP pm ON vdd 3.3V width 4 timing SD-HS(SDR25) dt B [ 110.975514] [mmc]: mclk 0xf1c2008c 0x8100000b [ 111.035618] [mmc]: sdc1 set ios: clk 50000000Hz bm PP pm ON vdd 3.3V width 4 timing SD-HS(SDR25) dt B [ 111.046398] [mmc]: mclk 0xf1c2008c 0x8140030b [ 111.108547] [ 111.108566] [ 111.108579] dhd_bus_devreset: == WLAN ON == [ 111.116882] dhd_bus_devreset called when dongle is not in reset [ 111.123683] Will call dhd_bus_start instead [ 111.128637] dhd_conf_set_fw_name_by_chip: firmware_path=/system/vendor/modules/fw_bcm43438a0.bin [ 111.140963] dhd_conf_download_config: Ignore config file /system/vendor/modules/config.txt [ 111.151802] Final fw_path=/system/vendor/modules/fw_bcm43438a0.bin [ 111.158689] Final nv_path=/system/vendor/modules/nvram_ap6210.txt [ 111.165542] Final conf_path=/system/vendor/modules/config.txt [ 111.257577] dhdsdio_download_nvram: Open nvram file failed /system/vendor/modules/nvram_ap6210.txt [ 111.268309] _dhdsdio_download_firmware: dongle nvram file download failed [ 111.276022] dhd_bus_start: dhdsdio_probe_download failed. firmware = /system/vendor/modules/fw_bcm43438a0.bin nvram = /system/vendor/modules/nvram_ap6210.txt config = /system/vendor/modules/config.txt [ 111.295979] dhd_bus_devreset: dhd_bus_start fail with -1 [ 111.304154] dhd_dev_reset: dhd_bus_devreset: -1 [ 111.309190] dhd_prot_ioctl : bus is down. we have nothing to do [ 111.330328] dhd_bus_devreset: WLAN OFF DONE [ 111.335225] gpio ap6xxx_wl_regon set val 0, act val 0 [ 111.472499] [ap6xxx]: sdio wifi power state: off [ 111.477661] =========== WLAN placed in RESET ======== [ 111.483304] wl_android_wifi_on: Failed [ 111.487473] wl_android_wifi_off in 1 [ 111.491478] wl_android_wifi_off in 2: g_wifi_on=0 [ 111.496711] wl_android_wifi_off out [ 111.509335] init: waitpid returned pid 1211, status = 0000ff00 [ 111.516072] init: process 'p2p_supplicant', pid 1211 exited shell@astar-y3:/ $ shell@astar-y3:/ $ 24、定位问题:dhd_bus_devreset: dhd_bus_start fail with -1 rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ cd linux-3.4/drivers/net/wireless/bcmdhd/ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ grep "dhd_bus_start fail with" . -R ./dhd_sdio.c: DHD_ERROR(("%s: dhd_bus_start fail with %d\n", 匹配到二进制文件 ./dhd_sdio.o 匹配到二进制文件 ./bcmdhd.o 匹配到二进制文件 ./bcmdhd.ko rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee$ cd linux-3.4/drivers/net/wireless/bcmdhd/ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ grep "dhd_bus_start fail with" . -R ./dhd_sdio.c: DHD_ERROR(("%s: dhd_bus_start fail with %d\n", 匹配到二进制文件 ./dhd_sdio.o 匹配到二进制文件 ./bcmdhd.o 匹配到二进制文件 ./bcmdhd.ko rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ int dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag) { …… dhd_conf_set_fw_name_by_chip(dhdp, fw_path, firmware_path); if ((bcmerror = dhd_bus_start(dhdp)) != 0) DHD_ERROR(("%s: dhd_bus_start fail with %d\n", __FUNCTION__, bcmerror)); } } return bcmerror; } rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ grep dhd_bus_start . -R ./dhd_sdio.c: if ((ret = dhd_bus_start(bus->dhd)) != 0) { ./dhd_sdio.c: DHD_ERROR(("%s: dhd_bus_start failed\n", __FUNCTION__)); ./dhd_sdio.c: DHD_ERROR(("Will call dhd_bus_start instead\n")); ./dhd_sdio.c: if ((bcmerror = dhd_bus_start(dhdp)) != 0) ./dhd_sdio.c: DHD_ERROR(("%s: dhd_bus_start fail with %d\n", ./dhd_sdio - 副本.c: if ((ret = dhd_bus_start(bus->dhd)) != 0) { ./dhd_sdio - 副本.c: DHD_ERROR(("%s: dhd_bus_start failed\n", __FUNCTION__)); ./dhd_sdio - 副本.c: DHD_ERROR(("Will call dhd_bus_start instead\n")); ./dhd_sdio - 副本.c: if ((bcmerror = dhd_bus_start(dhdp)) != 0) ./dhd_sdio - 副本.c: DHD_ERROR(("%s: dhd_bus_start fail with %d\n", ./dhd_sdio - 副本 (2).c: if ((ret = dhd_bus_start(bus->dhd)) != 0) { ./dhd_sdio - 副本 (2).c: DHD_ERROR(("%s: dhd_bus_start failed\n", __FUNCTION__)); ./dhd_sdio - 副本 (2).c: DHD_ERROR(("Will call dhd_bus_start instead\n")); ./dhd_sdio - 副本 (2).c: if ((bcmerror = dhd_bus_start(dhdp)) != 0) ./dhd_sdio - 副本 (2).c: DHD_ERROR(("%s: dhd_bus_start fail with %d\n", ./dhd.h:extern int dhd_bus_start(dhd_pub_t *dhdp); ./wl_android.c:/* Initialize g_wifi_on to 1 so dhd_bus_start will be called for the first ./dhd_linux.c: if ((ret = dhd_bus_start(&dhd->pub)) != 0) { ./dhd_linux.c: /* dhd_prot_init has been called in dhd_bus_start or wl_android_wifi_on */ ./dhd_linux.c:dhd_bus_start(dhd_pub_t *dhdp) rootroot@rootroot-E400:~/wyb/ap6212a0_a33_sc3817r/lichee/linux-3.4/drivers/net/wireless/bcmdhd$ 定位到这里: int dhd_bus_start(dhd_pub_t *dhdp) { …… /* try to download image and nvram to the dongle */ if ((dhd->pub.busstate == DHD_BUS_DOWN) && (fw_path[0] != '\0') && (nv_path[0] != '\0')) { #ifdef SHOW_NVRAM_TYPE { /* Show nvram type in the kernel log */ int i; for (i = 0; nv_path[i] != '\0'; ++i) { if (nv_path[i] == '.') { ++i; break; } } DHD_ERROR(("%s: nvram_type = [%s]\n", __FUNCTION__, &nv_path[i])); } #endif /* SHOW_NVRAM_TYPE */ /* wake lock moved to dhdsdio_download_firmware */ if (!(dhd_bus_download_firmware(dhd->pub.bus, dhd->pub.osh, fw_path, nv_path, conf_path))) { DHD_ERROR(("%s: dhdsdio_probe_download failed. firmware = %s nvram = %s config = %s\n", __FUNCTION__, fw_path, nv_path, conf_path)); #ifdef DHDTHREAD if (dhd->threads_only) dhd_os_sdunlock(dhdp); #endif /* DHDTHREAD */ // 2017/6/23 18:40 wenyuanbo download ap6212 fail not return error!!!! //return -1; } } …… return 0; } 由于ap6212没有config.txt文件,下载肯定会出错,比对全志R16平台去AP6212的处理,关闭这里: //return -1; 25、 shell@astar-y3:/ $ shell@astar-y3:/ $ [ 110.012176] init: computing context for service '/system/bin/wpa_supplicant' [ 110.025400] init: starting 'p2p_supplicant' [ 110.039886] init: Created socket '/dev/socket/wpa_wlan0' with mode '660', user '1010', group '1010' [ 110.119751] dhd_conf_set_fw_name_by_chip: firmware_path=/system/vendor/modules/fw_bcm43438a0.bin [ 110.140144] [ 110.140153] Dongle Host Driver, version 1.88.45.3 (r420671) [ 110.140158] Compiled in drivers/net/wireless/bcmdhd on Jun 26 2017 at 14:34:04 [ 110.173523] wl_android_wifi_on in 1 [ 110.177409] wl_android_wifi_on in 2: g_wifi_on=0 [ 110.200103] gpio ap6xxx_wl_regon set val 1, act val 1 [ 110.280025] [BT_LPM] bluesleep_tx_timer_expire: Tx timer expire

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值