fingerprint.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. /*
  2. * @Author: Aurora-zk
  3. * @Date: 2021-03-14 12:39:09
  4. * @LastEditors: Aurora-zk
  5. * @LastEditTime: 2021-10-05 20:39:39
  6. * @contact: pk-ing@nyist.edu.cn
  7. * @FilePath: \fingerprint\fingerprint.c
  8. */
  9. #include <fingerprint.h>
  10. #define DBG_TAG "fp.dev"
  11. #define DBG_LVL DBG_INFO
  12. //#define DBG_LVL DBG_LOG
  13. #include <rtdbg.h>
  14. #define EVENT_RX (1 << 0)
  15. #define EVENT_TOUCH (1 << 1)
  16. static struct rt_event event_fp;
  17. static rt_device_t fp_dev;
  18. static rt_uint8_t flag_vfy = 0; /* 握手成功标志 */
  19. static rt_uint8_t flag_init = 0;
  20. #if DBG_LVL == DBG_LOG
  21. static void print_buf(rt_uint8_t *buf, rt_size_t size)
  22. {
  23. for (int i = 0; i < size; i++)
  24. {
  25. rt_kprintf("%x ", buf[i]);
  26. }
  27. rt_kprintf("\r\n");
  28. }
  29. #endif
  30. #define BUF_SIZE 50U
  31. #define RETRY_CNT 20U
  32. static rt_uint8_t tx_buf[BUF_SIZE] = {FP_HEAD_H, FP_HEAD_L, FP_ADDR_0,
  33. FP_ADDR_1, FP_ADDR_2, FP_ADDR_3};
  34. static rt_uint8_t rx_buf[BUF_SIZE];
  35. /*
  36. * 发送缓存加校验和
  37. * @note 包长度 = 包长度至校验和(指令、参数或数据)的总字节数,包含校验和,但不包含包长度本身的字节数
  38. * 校验和是从包标识至校验和之间所有字节之和
  39. */
  40. static void tx_buf_add_checksum(rt_uint8_t *buf)
  41. {
  42. rt_uint16_t i = 0;
  43. rt_uint16_t checksum = 0; /* 超出两字节的进位不理会 */
  44. rt_uint16_t pkg_len = (buf[FP_LEN_BIT] << 8) + buf[FP_LEN_BIT+1];
  45. for (i = 0; i < pkg_len; i++)
  46. {
  47. checksum += buf[i+FP_LEN_BIT];
  48. }
  49. checksum += buf[FP_TOK_BIT];
  50. *(buf+PREFIX_SIZE+pkg_len-2) = (checksum&0xff00)>>8;
  51. *(buf+PREFIX_SIZE+pkg_len-1) = checksum&0x00ff;
  52. }
  53. /*
  54. * 接收验证校验和
  55. */
  56. static rt_uint8_t cnt_checksum(rt_uint8_t *buf)
  57. {
  58. rt_uint8_t checksum_is_ok = 0;
  59. rt_uint16_t i = 0;
  60. rt_uint16_t checksum = 0; /* 超出两字节的进位不理会 */
  61. rt_uint16_t pkg_len = (buf[FP_LEN_BIT] << 8) + buf[FP_LEN_BIT+1];
  62. if (!((rx_buf[FP_HEAD_BIT] == FP_HEAD_H) && (rx_buf[FP_HEAD_BIT+1] == FP_HEAD_L)))
  63. return checksum_is_ok;
  64. for (i = 0; i < pkg_len; i++)
  65. {
  66. checksum += buf[i+FP_LEN_BIT];
  67. }
  68. checksum += buf[FP_TOK_BIT];
  69. if ((*(buf+PREFIX_SIZE+pkg_len-2) == ((checksum&0xff00)>>8))
  70. && (*(buf+PREFIX_SIZE+pkg_len-1) == (checksum&0x00ff)))
  71. {
  72. checksum_is_ok = 1;
  73. }
  74. else
  75. {
  76. LOG_E("checksum_1:%x,checksum_2:%x,sum_1:%x,sum_2:%x", checksum&0xff00,checksum&0x00ff,*(buf+PREFIX_SIZE+pkg_len-2),*(buf+PREFIX_SIZE+pkg_len-1));
  77. }
  78. return checksum_is_ok;
  79. }
  80. /*
  81. * 发送包大小
  82. */
  83. static rt_size_t cnt_tx_pkg_size(void)
  84. {
  85. rt_size_t result = 0;
  86. rt_enter_critical();
  87. rt_uint8_t size_tmp = tx_buf[FP_LEN_BIT] << 8;
  88. result = size_tmp + tx_buf[FP_LEN_BIT+1] + PREFIX_SIZE;
  89. rt_exit_critical();
  90. return result;
  91. }
  92. /*
  93. * 接收包大小
  94. */
  95. static rt_size_t cnt_rx_pkg_size(void)
  96. {
  97. rt_size_t result = 0;
  98. rt_enter_critical();
  99. rt_uint8_t size_tmp = rx_buf[FP_LEN_BIT] << 8;
  100. result = size_tmp + rx_buf[FP_LEN_BIT+1];
  101. rt_exit_critical();
  102. if (result > BUF_SIZE)
  103. {
  104. result = (rt_size_t)(BUF_SIZE - PREFIX_SIZE);
  105. LOG_W("Next packet is out of buf size!");
  106. }
  107. return result;
  108. }
  109. /*
  110. * 获取接收包
  111. */
  112. static rt_err_t master_get_rx(void)
  113. {
  114. rt_err_t ret = RT_EOK;
  115. rt_uint32_t rec = 0;
  116. rt_size_t size = 0;
  117. rt_uint8_t rx_cnt = 0;
  118. ret = rt_event_recv(&event_fp, EVENT_RX, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 1000, &rec);
  119. if (ret != RT_EOK)
  120. {
  121. return ret;
  122. }
  123. memset(rx_buf, 0x00, BUF_SIZE);
  124. LOG_D("after clear rx_buf[0]=%x",rx_buf[0]);
  125. rt_thread_mdelay(10);
  126. do
  127. {
  128. rt_device_read(fp_dev, -1, rx_buf, (rt_size_t)1);
  129. rx_cnt++;
  130. } while ((rx_buf[0] != 0xEF)&&(rx_cnt < RETRY_CNT)); /* 清除串口缓冲中的脏数据 */
  131. if (rx_cnt >= RETRY_CNT)
  132. {
  133. ret = -RT_ETIMEOUT;
  134. return ret;
  135. }
  136. rt_device_read(fp_dev, -1, rx_buf+1, (rt_size_t)PREFIX_SIZE-1); /* 获取包头 */
  137. LOG_D("after first read rx_buf[0]=%x",rx_buf[0]);
  138. LOG_D("after first read rx_buf[FP_LEN_BIT+1]=%x",rx_buf[FP_LEN_BIT+1]);
  139. rt_event_recv(&event_fp, EVENT_RX, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 0, &rec);
  140. size = cnt_rx_pkg_size(); /* 计算包长度 */
  141. rt_device_read(fp_dev, -1, rx_buf+PREFIX_SIZE, size); /* 获取包剩下数据 */
  142. rt_event_recv(&event_fp, EVENT_RX, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 0, &rec);
  143. #if DBG_LVL == DBG_LOG
  144. rt_kprintf("rx_size:%d rx: ", size+PREFIX_SIZE);
  145. print_buf(rx_buf, size+PREFIX_SIZE);
  146. #endif
  147. return ret;
  148. }
  149. /*
  150. * 发送指令并接收应答
  151. */
  152. static rt_err_t make_prefix(const char *func)
  153. {
  154. rt_err_t ret = -1;
  155. rt_size_t size = 0;
  156. tx_buf_add_checksum(tx_buf);
  157. size = cnt_tx_pkg_size();
  158. #if DBG_LVL == DBG_LOG
  159. rt_kprintf("func:%s tx_size:%d tx: ", func, size);
  160. print_buf(tx_buf, size);
  161. #endif
  162. rt_device_write(fp_dev, 0, tx_buf, size);
  163. ret = master_get_rx();
  164. return ret;
  165. }
  166. /**
  167. * @brief Get the image object
  168. * 获取传感器图像
  169. *
  170. * @return fp_ack_type_t 模块确认码
  171. */
  172. fp_ack_type_t fp_get_image(void)
  173. {
  174. fp_ack_type_t code;
  175. code = CMD_OK;
  176. if (flag_vfy != 1)
  177. {
  178. LOG_E("Please verify the password before using the fingerprint module!");
  179. code = UNDEF_ERR;
  180. return code;
  181. }
  182. tx_buf[FP_TOK_BIT] = 0x01;
  183. tx_buf[FP_LEN_BIT] = 0x00;
  184. tx_buf[FP_LEN_BIT+1] = 0x03;
  185. tx_buf[FP_INS_CMD_BIT] = FP_CMD_GET_IMG;
  186. rt_err_t ret = make_prefix(__func__);
  187. if (-RT_ETIMEOUT == ret)
  188. {
  189. LOG_E("Function fp_get_image timeout!");
  190. code = UNDEF_ERR;
  191. return code;
  192. }
  193. if (cnt_checksum(rx_buf) == 1)
  194. {
  195. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  196. }
  197. else
  198. {
  199. code = DAT_ERR;
  200. }
  201. return code;
  202. }
  203. /****************************************************************
  204. * 输入参数: BufferID(特征缓冲区号)
  205. * 返回参数: 确认字
  206. * ****************************************************************/
  207. fp_ack_type_t fp_gen_char(rt_uint8_t buff_id)
  208. {
  209. fp_ack_type_t code;
  210. code = CMD_OK;
  211. if (flag_vfy != 1)
  212. {
  213. LOG_E("Please verify the password before using the fingerprint module!");
  214. code = UNDEF_ERR;
  215. return code;
  216. }
  217. tx_buf[FP_TOK_BIT] = 0x01;
  218. tx_buf[FP_LEN_BIT] = 0x00;
  219. tx_buf[FP_LEN_BIT+1] = 0x04;
  220. tx_buf[FP_INS_CMD_BIT] = FP_CMD_GEN_CHR;
  221. tx_buf[FP_INS_PAR_BIT(0)] = buff_id;
  222. rt_err_t ret = make_prefix(__func__);
  223. if (-RT_ETIMEOUT == ret)
  224. {
  225. LOG_E("Function fp_gen_char timeout!");
  226. code = UNDEF_ERR;
  227. return code;
  228. }
  229. if (cnt_checksum(rx_buf) == 1)
  230. {
  231. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  232. }
  233. else
  234. {
  235. code = DAT_ERR;
  236. }
  237. return code;
  238. }
  239. /*
  240. * 功能说明: 以 CharBuffer1 或 CharBuffer2 中的特征文件搜索整个或部分指纹库。若搜索到,则返回页码。
  241. * 输入参数: BufferID, StartPage(起始页),PageNum(页数)
  242. * page_id : 页码(相配指纹模板)
  243. * mat_score : 比对得分
  244. * 返回参数: 确认字
  245. */
  246. fp_ack_type_t fp_search(uint8_t buffer_id, uint16_t startpage, uint16_t page_num, SearchResult *p)
  247. {
  248. fp_ack_type_t code;
  249. code = CMD_OK;
  250. if (flag_vfy != 1)
  251. {
  252. LOG_E("Please verify the password before using the fingerprint module!");
  253. code = UNDEF_ERR;
  254. return code;
  255. }
  256. tx_buf[FP_TOK_BIT] = 0x01;
  257. tx_buf[FP_LEN_BIT] = 0x00;
  258. tx_buf[FP_LEN_BIT+1] = 0x08;
  259. tx_buf[FP_INS_CMD_BIT] = FP_CMD_SEARCH;
  260. tx_buf[FP_INS_PAR_BIT(0)] = buffer_id;
  261. tx_buf[FP_INS_PAR_BIT(1)] = (startpage & 0xff00) >> 8;
  262. tx_buf[FP_INS_PAR_BIT(2)] = startpage & 0x00ff;
  263. tx_buf[FP_INS_PAR_BIT(3)] = (page_num & 0xff00) >> 8;
  264. tx_buf[FP_INS_PAR_BIT(4)] = page_num & 0x00ff;
  265. rt_err_t ret = make_prefix(__func__);
  266. if (-RT_ETIMEOUT == ret)
  267. {
  268. LOG_E("Function fp_search timeout!");
  269. code = UNDEF_ERR;
  270. return code;
  271. }
  272. if (cnt_checksum(rx_buf) == 1)
  273. {
  274. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  275. p->pageID = (rx_buf[FP_REP_ACK_BIT(1)] << 8) + rx_buf[FP_REP_ACK_BIT(2)];
  276. p->mathscore = (rx_buf[FP_REP_ACK_BIT(3)] << 8) + rx_buf[FP_REP_ACK_BIT(4)];
  277. LOG_D("p->pageID=%lx, p->mathscore=%lx", p->pageID, p->mathscore);
  278. }
  279. else
  280. {
  281. code = DAT_ERR;
  282. return code;
  283. }
  284. return code;
  285. }
  286. /*
  287. * 功能说明: 将 CharBuffer1 与 CharBuffer2 中的特征文件合并生成模板,结果存于 CharBuffer1 与 CharBuffer2。
  288. * 输入参数: none
  289. * 返回参数: 确认字
  290. */
  291. fp_ack_type_t fp_reg_model(void)
  292. {
  293. fp_ack_type_t code;
  294. code = CMD_OK;
  295. if (flag_vfy != 1)
  296. {
  297. LOG_E("Please verify the password before using the fingerprint module!");
  298. code = UNDEF_ERR;
  299. return code;
  300. }
  301. tx_buf[FP_TOK_BIT] = 0x01;
  302. tx_buf[FP_LEN_BIT] = 0x00;
  303. tx_buf[FP_LEN_BIT+1] = 0x03;
  304. tx_buf[FP_INS_CMD_BIT] = FP_CMD_REG_MODEL;
  305. rt_err_t ret = make_prefix(__func__);
  306. if (-RT_ETIMEOUT == ret)
  307. {
  308. LOG_E("Function fp_gen_char timeout!");
  309. code = UNDEF_ERR;
  310. return code;
  311. }
  312. if (cnt_checksum(rx_buf) == 1)
  313. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  314. else
  315. code = DAT_ERR;
  316. return code;
  317. }
  318. /*
  319. * 功能说明: 将 CharBuffer1 或 CharBuffer2 中的模板文件存到 PageID 号flash 数据库位置。
  320. * 输入参数: BufferID(缓冲区号),PageID(指纹库位置号)
  321. * 返回参数: 确认字
  322. */
  323. fp_ack_type_t fp_store_char(uint8_t buff_id, uint16_t page_id)
  324. {
  325. fp_ack_type_t code;
  326. code = CMD_OK;
  327. if (flag_vfy != 1)
  328. {
  329. LOG_E("Please verify the password before using the fingerprint module!");
  330. code = UNDEF_ERR;
  331. return code;
  332. }
  333. tx_buf[FP_TOK_BIT] = 0x01;
  334. tx_buf[FP_LEN_BIT] = 0x00;
  335. tx_buf[FP_LEN_BIT+1] = 0x06;
  336. tx_buf[FP_INS_CMD_BIT] = FP_CMD_STR_CHR;
  337. tx_buf[FP_INS_PAR_BIT(0)] = buff_id;
  338. tx_buf[FP_INS_PAR_BIT(1)] = (uint8_t)((page_id&0xff00)>>8);
  339. tx_buf[FP_INS_PAR_BIT(2)] = (uint8_t)(page_id&0x00ff);
  340. rt_err_t ret = make_prefix(__func__);
  341. if (-RT_ETIMEOUT == ret)
  342. {
  343. LOG_E("Function fp_search timeout!");
  344. code = UNDEF_ERR;
  345. return code;
  346. }
  347. if (cnt_checksum(rx_buf) == 1)
  348. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  349. else
  350. code = DAT_ERR;
  351. return code;
  352. }
  353. /*
  354. * 功能说明: 删除 flash 数据库中指定 ID 号开始的 N 个指纹模板
  355. * 输入参数: PageID(指纹库模板号),N 删除的模板个数。
  356. * 返回参数: 确认字
  357. */
  358. fp_ack_type_t fp_delet_char(uint16_t page_id, uint16_t n)
  359. {
  360. fp_ack_type_t code;
  361. code = CMD_OK;
  362. if (flag_vfy != 1)
  363. {
  364. LOG_E("Please verify the password before using the fingerprint module!");
  365. code = UNDEF_ERR;
  366. return code;
  367. }
  368. tx_buf[FP_TOK_BIT] = 0x01;
  369. tx_buf[FP_LEN_BIT] = 0x00;
  370. tx_buf[FP_LEN_BIT+1] = 0x07;
  371. tx_buf[FP_INS_CMD_BIT] = FP_CMD_DEL_CHR;
  372. tx_buf[FP_INS_PAR_BIT(0)] = (rt_uint8_t)((page_id&0xff00)>>8);
  373. tx_buf[FP_INS_PAR_BIT(1)] = (rt_uint8_t)(page_id&0x00ff);
  374. tx_buf[FP_INS_PAR_BIT(2)] = (rt_uint8_t)((n&0xff00)>>8);
  375. tx_buf[FP_INS_PAR_BIT(3)] = (rt_uint8_t)(n&0x00ff);
  376. rt_err_t ret = make_prefix(__func__);
  377. if (-RT_ETIMEOUT == ret)
  378. {
  379. LOG_E("Function fp_search timeout!");
  380. code = UNDEF_ERR;
  381. return code;
  382. }
  383. if (cnt_checksum(rx_buf) == 1)
  384. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  385. else
  386. code = DAT_ERR;
  387. return code;
  388. }
  389. /*
  390. * 功能说明: 删除 flash 数据库中所有指纹模板
  391. * 输入参数: none
  392. * 返回参数: 确认字
  393. */
  394. fp_ack_type_t fp_empty(void)
  395. {
  396. fp_ack_type_t code;
  397. code = CMD_OK;
  398. if (flag_vfy != 1)
  399. {
  400. LOG_E("Please verify the password before using the fingerprint module!");
  401. code = UNDEF_ERR;
  402. return code;
  403. }
  404. tx_buf[FP_TOK_BIT] = 0x01;
  405. tx_buf[FP_LEN_BIT] = 0x00;
  406. tx_buf[FP_LEN_BIT+1] = 0x03;
  407. tx_buf[FP_INS_CMD_BIT] = FP_CMD_EMPTY;
  408. rt_err_t ret = make_prefix(__func__);
  409. if (-RT_ETIMEOUT == ret)
  410. {
  411. LOG_E("Function fp_search timeout!");
  412. code = UNDEF_ERR;
  413. return code;
  414. }
  415. if (cnt_checksum(rx_buf) == 1)
  416. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  417. else
  418. code = DAT_ERR;
  419. return code;
  420. }
  421. /*
  422. * 功能说明: 写模块寄存器
  423. * 输入参数: 寄存器序号 写入内容
  424. * 返回参数: 确认字
  425. */
  426. fp_ack_type_t fp_set_reg(rt_uint8_t register_number, rt_uint8_t content)
  427. {
  428. fp_ack_type_t code;
  429. code = CMD_OK;
  430. if (flag_vfy != 1)
  431. {
  432. LOG_E("Please verify the password before using the fingerprint module!");
  433. code = UNDEF_ERR;
  434. return code;
  435. }
  436. tx_buf[FP_TOK_BIT] = 0x01;
  437. tx_buf[FP_LEN_BIT] = 0x00;
  438. tx_buf[FP_LEN_BIT+1] = 0x05;
  439. tx_buf[FP_INS_CMD_BIT] = FP_CMD_FINGER_MOUDLE_SET;
  440. tx_buf[FP_INS_PAR_BIT(0)] = register_number;
  441. tx_buf[FP_INS_PAR_BIT(1)] = content;
  442. rt_err_t ret = make_prefix(__func__);
  443. if (-RT_ETIMEOUT == ret)
  444. {
  445. LOG_E("Function fp_search timeout!");
  446. code = UNDEF_ERR;
  447. return code;
  448. }
  449. if (cnt_checksum(rx_buf) == 1)
  450. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  451. else
  452. code = DAT_ERR;
  453. return code;
  454. }
  455. /*
  456. * 功能说明: 读取模块的基本参数(波特率,包大小等)。
  457. * 输入参数:
  458. * 返回参数: 确认字
  459. */
  460. fp_ack_type_t fp_read_sys_para(SysPara *p)
  461. {
  462. fp_ack_type_t code;
  463. code = CMD_OK;
  464. if (flag_vfy != 1)
  465. {
  466. LOG_E("Please verify the password before using the fingerprint module!");
  467. code = UNDEF_ERR;
  468. return code;
  469. }
  470. tx_buf[FP_TOK_BIT] = 0x01;
  471. tx_buf[FP_LEN_BIT] = 0x00;
  472. tx_buf[FP_LEN_BIT+1] = 0x03;
  473. tx_buf[FP_INS_CMD_BIT] = FP_CMD_RD_PARAM;
  474. rt_err_t ret = make_prefix(__func__);
  475. if (-RT_ETIMEOUT == ret)
  476. {
  477. LOG_E("Function fp_search timeout!");
  478. code = UNDEF_ERR;
  479. return code;
  480. }
  481. if (cnt_checksum(rx_buf) == 1)
  482. {
  483. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  484. p->state = (rx_buf[FP_REP_ACK_BIT(2)] << 8) + rx_buf[FP_REP_ACK_BIT(1)];
  485. p->sensor = (rx_buf[FP_REP_ACK_BIT(4)] << 8) + rx_buf[FP_REP_ACK_BIT(3)];
  486. p->capacity = (rx_buf[FP_REP_ACK_BIT(6)] << 8) + rx_buf[FP_REP_ACK_BIT(5)];
  487. p->grade = (rx_buf[FP_REP_ACK_BIT(8)] << 8) + rx_buf[FP_REP_ACK_BIT(7)];
  488. p->addr = (rx_buf[FP_REP_ACK_BIT(12)] << 24) + (rx_buf[FP_REP_ACK_BIT(11)] << 16) + (rx_buf[FP_REP_ACK_BIT(10)] << 8) + rx_buf[FP_REP_ACK_BIT(9)];
  489. p->size = (rx_buf[FP_REP_ACK_BIT(14)] << 8) + rx_buf[FP_REP_ACK_BIT(13)];
  490. p->baud = (rx_buf[FP_REP_ACK_BIT(16)] << 8) + rx_buf[FP_REP_ACK_BIT(15)];
  491. }
  492. else
  493. code = DAT_ERR;
  494. return code;
  495. }
  496. /********************************
  497. * 功能说明: 验证模块握手口令
  498. * 输入参数: PassWord
  499. * 返回参数: 确认字
  500. * 指令代码: 13H
  501. * ***************************************************/
  502. rt_err_t fp_vfy_pwd(void)
  503. {
  504. fp_ack_type_t code;
  505. code = CMD_OK;
  506. tx_buf[FP_TOK_BIT] = 0x01;
  507. tx_buf[FP_LEN_BIT] = 0x00;
  508. tx_buf[FP_LEN_BIT+1] = 0x07;
  509. tx_buf[FP_INS_CMD_BIT] = 0x13;
  510. tx_buf[FP_INS_PAR_BIT(0)] = 0x00;
  511. tx_buf[FP_INS_PAR_BIT(1)] = 0x00;
  512. tx_buf[FP_INS_PAR_BIT(2)] = 0x00;
  513. tx_buf[FP_INS_PAR_BIT(3)] = 0x00;
  514. rt_err_t ret = make_prefix(__func__);
  515. if (-RT_ETIMEOUT == ret)
  516. {
  517. LOG_E("Function fp_search timeout!");
  518. code = UNDEF_ERR;
  519. return code;
  520. }
  521. if (cnt_checksum(rx_buf) == 1)
  522. {
  523. //if ((rx_buf[FP_REP_ACK_BIT(0)] == 0x00) && (rx_buf[FP_REP_ACK_BIT(1)] == 0x00))
  524. if ((rx_buf[FP_REP_ACK_BIT(0)] == 0x00))// && (rx_buf[FP_REP_ACK_BIT(1)] == 0x00))
  525. {
  526. flag_vfy = 1;
  527. ret = RT_EOK;
  528. }
  529. }
  530. else
  531. ret = -RT_EINVAL;
  532. return ret;
  533. }
  534. /*
  535. * 功能说明:验证指纹
  536. * 输入参数:
  537. * 返回参数:
  538. */
  539. fp_ack_type_t fp_auto_identify(SearchResult *p)
  540. {
  541. #define SEC_LEVEL 0X03 //安全等级
  542. #define S_ID 0XFFFF //ID号,0XFFFF表示搜索整个库
  543. #define S_PARAM 0X0007 //参数 bit0 LED亮灭 bit1 图像预处理 bit2 中途是否应答
  544. fp_ack_type_t code;
  545. code = CMD_OK;
  546. if (flag_vfy != 1)
  547. {
  548. LOG_E("Please verify the password before using the fingerprint module!");
  549. code = UNDEF_ERR;
  550. return code;
  551. }
  552. tx_buf[FP_TOK_BIT] = 0x01;
  553. tx_buf[FP_LEN_BIT] = 0x00;
  554. tx_buf[FP_LEN_BIT+1] = 0x08;
  555. tx_buf[FP_INS_CMD_BIT] = FP_CMD_AUTO_IDENTIFY;
  556. tx_buf[FP_INS_PAR_BIT(0)] = (rt_uint8_t)(SEC_LEVEL);
  557. tx_buf[FP_INS_PAR_BIT(1)] = (rt_uint8_t)((S_ID&0xff00)>>8);
  558. tx_buf[FP_INS_PAR_BIT(2)] = (rt_uint8_t)(S_ID&0x00ff);
  559. tx_buf[FP_INS_PAR_BIT(3)] = (rt_uint8_t)((S_PARAM&0xff00)>>8);
  560. tx_buf[FP_INS_PAR_BIT(4)] = (rt_uint8_t)(S_PARAM&0x00ff);
  561. rt_err_t ret = make_prefix(__func__);
  562. if (-RT_ETIMEOUT == ret)
  563. {
  564. LOG_E("Function fp_search timeout!");
  565. code = UNDEF_ERR;
  566. return code;
  567. }
  568. if (cnt_checksum(rx_buf) == 1)
  569. {
  570. code=rx_buf[9];
  571. p->pageID = (rx_buf[11]<<8) +rx_buf[12];
  572. p->mathscore = (rx_buf[13]<<8) +rx_buf[14];
  573. }
  574. else
  575. code = DAT_ERR;
  576. return code;
  577. }
  578. /*
  579. * 功能说明: 读有效模板个数
  580. * 输入参数: none
  581. * 返回参数: 确认字
  582. */
  583. fp_ack_type_t fp_valid_templete_num(rt_uint16_t *valid_n)
  584. {
  585. fp_ack_type_t code;
  586. code = CMD_OK;
  587. if (flag_vfy != 1)
  588. {
  589. LOG_E("Please verify the password before using the fingerprint module!");
  590. code = UNDEF_ERR;
  591. return code;
  592. }
  593. tx_buf[FP_TOK_BIT] = 0x01;
  594. tx_buf[FP_LEN_BIT] = 0x00;
  595. tx_buf[FP_LEN_BIT+1] = 0x03;
  596. tx_buf[FP_INS_CMD_BIT] = FP_CMD_VALID_TEMPLETE_NUM;
  597. rt_err_t ret = make_prefix(__func__);
  598. if (-RT_ETIMEOUT == ret)
  599. {
  600. LOG_E("Function fp_search timeout!");
  601. code = UNDEF_ERR;
  602. return code;
  603. }
  604. if (cnt_checksum(rx_buf) == 1)
  605. {
  606. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  607. *valid_n = (rx_buf[FP_REP_ACK_BIT(1)] << 8) + rx_buf[FP_REP_ACK_BIT(2)];
  608. }
  609. else
  610. code = DAT_ERR;
  611. return code;
  612. }
  613. /*
  614. * 功能说明: 读索引表
  615. * 输入参数: none
  616. * 返回参数: 确认字
  617. */
  618. fp_ack_type_t fp_read_index_table(uint8_t Page, IndexTable *p)
  619. {
  620. fp_ack_type_t code;
  621. code = CMD_OK;
  622. if (flag_vfy != 1)
  623. {
  624. LOG_E("Please verify the password before using the fingerprint module!");
  625. code = UNDEF_ERR;
  626. return code;
  627. }
  628. tx_buf[FP_TOK_BIT] = 0x01;
  629. tx_buf[FP_LEN_BIT] = 0x00;
  630. tx_buf[FP_LEN_BIT+1] = 0x04;
  631. tx_buf[FP_INS_CMD_BIT] = FP_CMD_READ_INDEX_TABLE;
  632. tx_buf[FP_INS_PAR_BIT(0)] = Page;
  633. rt_err_t ret = make_prefix(__func__);
  634. if (-RT_ETIMEOUT == ret)
  635. {
  636. LOG_E("Function fp_search timeout!");
  637. code = UNDEF_ERR;
  638. return code;
  639. }
  640. if (cnt_checksum(rx_buf) == 1)
  641. {
  642. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  643. for (int var = 0; var < 32; ++var) {
  644. p->table[var] = rx_buf[FP_REP_ACK_BIT(1 + var)];
  645. }
  646. }
  647. else
  648. code = DAT_ERR;
  649. return code;
  650. }
  651. /*
  652. * 暂时没有测试通过
  653. */
  654. fp_ack_type_t fp_auto_enroll(void)
  655. {
  656. fp_ack_type_t code;
  657. code = CMD_OK;
  658. if (flag_vfy != 1)
  659. {
  660. LOG_E("Please verify the password before using the fingerprint module!");
  661. code = UNDEF_ERR;
  662. return code;
  663. }
  664. uint16_t ID = 0x0002;
  665. uint16_t can = 0x003B;
  666. tx_buf[FP_TOK_BIT] = 0x01;
  667. tx_buf[FP_LEN_BIT] = 0x00;
  668. tx_buf[FP_LEN_BIT+1] = 0x08;
  669. tx_buf[FP_INS_CMD_BIT] = FP_CMD_AUTO_ENROLL;
  670. tx_buf[FP_INS_PAR_BIT(0)] = (rt_uint8_t)((ID&0xff00)>>8);
  671. tx_buf[FP_INS_PAR_BIT(1)] = (rt_uint8_t)(ID&0x00ff);
  672. tx_buf[FP_INS_PAR_BIT(2)] = (rt_uint8_t)(4);
  673. tx_buf[FP_INS_PAR_BIT(3)] = (rt_uint8_t)((can&0xff00)>>8);
  674. tx_buf[FP_INS_PAR_BIT(4)] = (rt_uint8_t)(can&0x00ff);
  675. rt_err_t ret = make_prefix(__func__);
  676. if (-RT_ETIMEOUT == ret)
  677. {
  678. LOG_E("Function fp_search timeout!");
  679. code = UNDEF_ERR;
  680. return code;
  681. }
  682. if (cnt_checksum(rx_buf) == 1)
  683. {
  684. code = (fp_ack_type_t)rx_buf[FP_REP_ACK_BIT(0)]; /* 校验和正确则返回模块确认码 */
  685. rt_kprintf("code = %d, can1 = %d,can2 = %d \n",code,rx_buf[FP_REP_ACK_BIT(1)],rx_buf[FP_REP_ACK_BIT(2)]);
  686. }
  687. else
  688. code = DAT_ERR;
  689. return code;
  690. }
  691. //MSH_CMD_EXPORT(fp_auto_enroll, "fp_auto_enroll");
  692. static rt_err_t fp_rx_handle(rt_device_t dev, rt_size_t size)
  693. {
  694. /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
  695. rt_event_send(&event_fp, EVENT_RX);
  696. return RT_EOK;
  697. }
  698. /*
  699. * 打开指纹的串口设备配置并验证握手
  700. */
  701. static rt_err_t fp_hand_shake(void)
  702. {
  703. rt_uint8_t i;
  704. rt_err_t ret = RT_EOK;
  705. struct serial_configure fp_cfg = RT_SERIAL_CONFIG_DEFAULT;
  706. fp_cfg.bufsz = 128;
  707. ret = rt_device_control(fp_dev, RT_DEVICE_CTRL_CONFIG, &fp_cfg);
  708. ret = rt_device_open(fp_dev, RT_DEVICE_FLAG_INT_RX);
  709. ret = rt_device_set_rx_indicate(fp_dev, fp_rx_handle);
  710. for (i = 1; i < 2; i++) /* 使用 N*9600 的波特率进行握手测试 */
  711. {
  712. fp_cfg.baud_rate = BAUD_RATE_9600 * i;
  713. ret = rt_device_control(fp_dev, RT_DEVICE_CTRL_CONFIG, &fp_cfg);
  714. ret = fp_vfy_pwd();
  715. if (ret == -RT_ETIMEOUT)
  716. {
  717. LOG_I("Hand shake in %d timeout.", fp_cfg.baud_rate);
  718. }
  719. else if (ret == -RT_EINVAL)
  720. {
  721. LOG_I("Recived PKG no vaild!");
  722. }
  723. else if (ret == -RT_ERROR)
  724. {
  725. LOG_E("Hand shake error!");
  726. }
  727. else if (ret == RT_EOK)
  728. {
  729. LOG_I("Establish connection in %d successfully!", fp_cfg.baud_rate);
  730. return RT_EOK;
  731. }
  732. }
  733. LOG_I("Failed to establish contact!");
  734. rt_device_close(fp_dev);
  735. ret = -RT_ERROR;
  736. return ret;
  737. }
  738. void fp_init(void *name)
  739. {
  740. const char *name_c = name;
  741. rt_err_t ret = RT_EOK;
  742. while(!flag_init)
  743. {
  744. /* 查找系统中的串口设备 */
  745. fp_dev = rt_device_find(name_c);
  746. if (!fp_dev)
  747. {
  748. LOG_E("find %s failed!\n", name_c);
  749. }
  750. ret = rt_event_init(&event_fp, "ent-fp", RT_IPC_FLAG_FIFO);
  751. if (ret != RT_EOK)
  752. LOG_E("event fp creat error!");
  753. fp_hand_shake();
  754. flag_init = 1;
  755. }
  756. }