/*********************************************************** * Function: * Description: * Input: * Input: * Output: * Return: * Others: ***********************************************************/ static void rt_thread_entry_sd_test( void* parameter ) { FRESULT res; char tempbuf[64]; rt_sem_take( &sem_dataflash, RT_TICK_PER_SECOND * FLASH_SEM_DELAY ); SPI_Configuration(); res = SD_Init(); if(0 == res) { rt_kprintf("\r\n SD CARD INIT OK!"); memset(tempbuf,0,sizeof(tempbuf)); SD_GetCID(tempbuf); rt_kprintf("\r\n CID="); printf_hex_data(tempbuf, 16); SD_GetCSD(tempbuf); rt_kprintf("\r\n SID="); printf_hex_data(tempbuf, 16); rt_kprintf("\r\n SD 容量=%d",SD_GetCapacity()); } else { rt_kprintf("\r\n SD CARD INIT ERR = %d",res); } if(0 == f_mount(MMC, &fs)) { rt_kprintf("\r\n f_mount SD OK!"); } rt_sem_release(&sem_dataflash); while( 1 ) { rt_thread_delay( RT_TICK_PER_SECOND / 20 ); } }
/********************************************************************************* *函数名称:void param_out_ex(char * sect, char * id ) *功能描述:将ini文件参数输出到标准输出设备,如果参数id为空则输出所有参数 *输 入: section :ini文件参数对应的的section id :要输出的参数名称,不包含前面的"id_" *输 出: 从标准输出输出参数 *返 回 值:none *--------------------------------------------------------------------------------- * @修改人 修改时间 修改内容 * 白养民 2015-06-08 创建 *********************************************************************************/ void param_out_ex(char * section, char * id ) { int i,i_sect; uint32_t u32data; uint8_t *p; char buffer[64]; //param_load_addr(&jt808_param,ADDR_DF_PARAM_MAIN); for( i_sect = 0; i_sect < sizeof( tbl_ini_lookup ) / sizeof( struct _st_tbl_ini_lookup ); i_sect++ ) { if((strlen(section) == 0)||(strncmp(section,tbl_ini_lookup[i_sect].section,strlen(tbl_ini_lookup[i_sect].section)) == 0)) { for( i = 0; i < tbl_ini_lookup[i_sect].param_size / sizeof( st_tbl_id_lookup ); i++ ) { //if(( id == tbl_id_lookup[i].id ) ||( 0 == id )) if((strncmp( id ,tbl_ini_lookup[i_sect].param[i].id, strlen(tbl_ini_lookup[i_sect].param[i].id) ) == 0) ||( 0 == strlen(id) )) { printf("\r\n %s.id_%s = ", tbl_ini_lookup[i_sect].section, tbl_ini_lookup[i_sect].param[i].id ); switch(tbl_ini_lookup[i_sect].param[i].type) { case TYPE_BYTE: case TYPE_WORD: case TYPE_DWORD: if(tbl_ini_lookup[i_sect].param[i].type == TYPE_BYTE) { u32data=*tbl_ini_lookup[i_sect].param[i].val; } else if(tbl_ini_lookup[i_sect].param[i].type == TYPE_WORD) { u32data=*(uint16_t *)tbl_ini_lookup[i_sect].param[i].val; } else { u32data=*(uint32_t *)tbl_ini_lookup[i_sect].param[i].val; } printf("%u;",u32data); break; case TYPE_CAN: p = tbl_ini_lookup[i_sect].param[i].val; printf_hex_data(p, 8); break; /* case TYPE_STR: memset(buffer,0,sizeof(buffer)); memcpy(buffer,tbl_id_lookup[i].val,32); rt_kprintf("\"%s\";",buffer); break; */ default : memset(buffer,0,sizeof(buffer)); memcpy(buffer,tbl_ini_lookup[i_sect].param[i].val,tbl_ini_lookup[i_sect].param[i].type); printf("\"%s\";",buffer); break; } } } } } printf("\r\n" ); }
/* 补报数据更新原先的并读取新纪录 每次收到中心应答后调用 每次重新拨号成功后都要从新确认一下 区分首次读还是上报中的读记录 使用0704上报,要拼包 */ uint8_t jt808_report_get( void ) { GPS_REPORT_HEAD head; uint8_t buf[1024]; /*单包上报的字节不大于256*/ uint32_t i; uint32_t addr; uint16_t get_size; /*获取记录的大小*/ uint16_t pos; uint8_t read_count; /*要读取的记录数*/ uint32_t *p_addr; if( report_count == 0 ) /*没有有未上报记录*/ { return 0; } if(( gsm_socket[0].state != CONNECTED )||(jt808_state != JT808_REPORT)) /*不在线*/ { return 0; } rt_sem_take( &sem_dataflash, RT_TICK_PER_SECOND * FLASH_SEM_DELAY ); /*批量查找记录*/ addr = report_get_addr; report_get_count = 0; get_size = 3; pos = 3; /*0x0704数据包,开始的偏移*/ read_count = report_count; /*还没有报的记录总数*/ if( report_count > sizeof(report_addr)/sizeof(uint32_t) ) /*最多1次上报10条记录 303字节*/ { read_count = sizeof(report_addr)/sizeof(uint32_t); } for( i = 0; i < ADDR_DF_POSTREPORT_SECT * 64; i++ ) /*每记录64字节,每sector(4096Byte)有64记录*/ { sst25_read( addr, (uint8_t*)&head, sizeof( GPS_REPORT_HEAD ) ); if( head.mn == 0x474E5353 ) /*有效记录*/ { if( head.attr >= ATTR_ONNET_NOREPORT ) /*还没有发送*/ { rt_kprintf("\r\njt808_report_get addr=%X",addr); rt_kprintf(" head="); printf_hex_data((const u8 *)&head,sizeof(head)); ///盲区补报数据用命令0x0704,但是只有公共货运平台支持该命令 //判断需要发送的总长度是否超过单包发送的最大长度 if( ( pos + head.len + 2 ) >= JT808_PACKAGE_MAX ) { break; } buf[pos++] = head.len >> 8; buf[pos++] = head.len; sst25_read( addr + 12, buf + pos, head.len ); pos += ( head.len ); report_addr[report_get_count] = addr; report_get_count++; if( report_get_count == read_count ) /*收到指定条数数据*/ { break; } #ifndef GPS_GGHYPT break; #endif if( report_trans_normal ) ///正常发送数据用命令0x0200 { break; } } addr += ( 12 + head.len + 63 ); //加63是为了取一个比较大的值 addr &= 0xFFFFFFC0; //指向下一个地址 } else {
/* 上报信息收到响应,通用应答 0x8001 */ static JT808_MSG_STATE jt808_report_response( JT808_TX_NODEDATA * nodedata, uint8_t *pmsg ) { uint8_t * msg = pmsg + 12; uint16_t ack_id; uint16_t ack_seq; uint8_t ack_res; uint32_t addr; GPS_REPORT_HEAD head; uint32_t i; ack_seq = ( msg[0] << 8 ) | msg[1]; ack_id = ( msg[2] << 8 ) | msg[3]; ack_res = *( msg + 4 ); rt_kprintf("\r\n JT808 TX 0x0200 RESPONSE_1"); if( ack_res == 0 ) { rt_kprintf("_2"); rt_sem_take( &sem_dataflash, RT_TICK_PER_SECOND * FLASH_SEM_DELAY ); if( ack_id == 0x0200 ) /*在线上报*/ { rt_kprintf("_3"); addr = *( (uint32_t*)( nodedata->user_para ) ); sst25_read( addr, (uint8_t*)&head, sizeof( GPS_REPORT_HEAD ) ); rt_kprintf(" write addr=%X",addr); rt_kprintf(" head="); printf_hex_data((const u8 *)&head,sizeof(head)); if(( head.mn == 0x474E5353 )&&(head.attr >= ATTR_ONNET_NOREPORT)) { head.attr &= 0x7F; /*最高位置0*/ sst25_write_through( addr, (uint8_t*)&head, sizeof( GPS_REPORT_HEAD ) ); report_get_addr = addr; if( report_count ) { report_count--; } } //nodedata->user_para = RT_NULL; /*传递进来只是指明flash地址,并不是要释放*/ } else if( ack_id == 0x0704 ) /*批量上报*/ { for( i = 0; i < report_get_count; i++ ) { sst25_read( report_addr[i], (uint8_t*)&head, sizeof( GPS_REPORT_HEAD ) ); if(( head.mn == 0x474E5353 )&&(head.attr >= ATTR_ONNET_NOREPORT)) { head.attr &= 0x7F; /*最高位置0*/ sst25_write_through( report_addr[i], (uint8_t*)&head, sizeof( GPS_REPORT_HEAD ) ); report_get_addr = report_addr[i]; if( report_count ) { report_count--; } } } } rt_sem_release( &sem_dataflash ); } return ACK_OK; }
/****************************************************************************** * function : main() * Description : video venc sample ******************************************************************************/ int disk_pro_test01(int argc, char *argv[]) { s32 s32Ret; int i, strt, ch_out; int cmd = 4; long long sector = 0; char buf[512]; int fd,size,len; char *buf_wr="Hello! I'm writing to this file!"; cmd = atoi(argv[1]); sector = atoi(argv[2]); printf("sector=%d",sector); sector *= 512; //getchar(); /*0:成功,-1:失败*/ //////////////////////////////////////// if(cmd&& (argc<4)) { printf("Please input param3( write string data. )!\n"); return FALSE; } fd = open("/dev/sda2", O_RDWR ); if(fd < 0) { printf("open: ERROR!"); return FALSE; } else printf("open file OK: %d\n",fd); /* while(sector) { if(sector>0xFFFFFFFF) { lseek64(fd,0xFFFFFFFF,SEEK_CUR); sector -= 0xFFFFFFFF; } else { lseek64(fd,sector,SEEK_CUR); sector = 0; } } */ lseek64(fd,sector,SEEK_SET); if(cmd) { size=write(fd,argv[3],strlen(argv[3])); if(size < 0) { printf("wtrite: ERROR!"); close(fd); return FALSE; } } else { memset(buf,0,sizeof(buf)); size=read(fd,buf,128); if(size < 0) { printf("read: ERROR!"); close(fd); return FALSE; } printf("Read OK\n"); printf_hex_data(buf,128); printf("STRING=%s",buf); } //len = strlen(buf_wr); //buf_wr[10] = '\0'; //if((size = write( fd, buf_wr, len)) < 0) //perror("write:"); //exit(1); close(fd); //////////////////////////////////////// return FALSE; }