阅读:2889回复:0
NEC码的一些说明
NEC码由引导码,地址码,地址反码,命令码以及命令反码组成
每个的名字又有很多种叫法: 引导码:码头 地址码:用户码 命令:指令码、数据码... 光名字还没看完就头晕 引导码:9ms高电平+4.5ms低电平 地址码和命令码由0和1二进制组成的1位16进制数字,0由560us高电平+560低电平 组成,1由560us高电平+1690us低电平组成 有的场景以上的高低电平会反过来 android上的红外输入不多解释,遥控一按,getevent看得明明白白 amlogic在bootloader和kernel里都集成了红外输出,bootloader里的调试方法:在串口下输入irblaster就可以查看帮助 irblaster openirblaster send yourCode irblaster close 标准的三步曲 不过还是有些细节需要注意,比如地址码为08,命令码为1E,如果需要在串口下输出这个IR码,要按下面的计算: 08补码:7F, 1E补码:E1,按格式:地址码-地址反码-命令码-命令反码从低位到高位拼接: 0001(8) 0000(0) 1110(7) 1111(F)0111(E) 1000 (1) 1000(1) 0111 (E) 但如果直接把这个数字send,肯定是不行的 get_nec_data函数对send传进来的数值进行了转换: for (index = 0; index < 32; index++) { if (value & (0x01 << index)) { pdata[num++] = NEC_ONE[0]; pdata[num++] = NEC_ONE[1]; } else { pdata[num++] = NEC_ZERO[0]; pdata[num++] = NEC_ZERO[1]; } } 把参数按从低到高把码值 转成实际要操作的高低电平pdata数组 然后在send_frame里进行发射 static void get_nec_data(unsigned int value) { struct aml_irblaster_drv_s *drv = aml_irblaster_get_driver(); unsigned int num = 0; int index; unsigned int *pdata = drv->windows; pdata[num++] = NEC_HEADER; pdata[num++] = NEC_IDLE; /*low bit first*/ for (index = 0; index < 32; index++) { if (value & (0x01 << index)) { pdata[num++] = NEC_ONE[0]; pdata[num++] = NEC_ONE[1]; } else { pdata[num++] = NEC_ZERO[0]; pdata[num++] = NEC_ZERO[1]; } } .... 关键点就在注释这里,低位先发~! 所以再把上面拼接的数值调过头来, 0001(8) 0000(0) 1110(7) 1111(F)0111(E) 1000 (1) 1000(1) 0111 (E) 从低位到高位重排一下: 1110 0001 0001 1110 1111 0111 0000 0001 转换成10进制:2857717425 所以实际操作如下,发送用户码08、指令码1E的码值 irblaster open irblaster send 2857717425 irblaster close RTFSC! |
|