1#ifndef _UAPI_MSM_AUDIO_CALIBRATION_H
2#define _UAPI_MSM_AUDIO_CALIBRATION_H
3
4#include <linux/types.h>
5#include <linux/ioctl.h>
6
7#define CAL_IOCTL_MAGIC 'a'
8
9#define AUDIO_ALLOCATE_CALIBRATION	_IOWR(CAL_IOCTL_MAGIC, \
10							200, void *)
11#define AUDIO_DEALLOCATE_CALIBRATION	_IOWR(CAL_IOCTL_MAGIC, \
12							201, void *)
13#define AUDIO_PREPARE_CALIBRATION	_IOWR(CAL_IOCTL_MAGIC, \
14							202, void *)
15#define AUDIO_SET_CALIBRATION		_IOWR(CAL_IOCTL_MAGIC, \
16							203, void *)
17#define AUDIO_GET_CALIBRATION		_IOWR(CAL_IOCTL_MAGIC, \
18							204, void *)
19#define AUDIO_POST_CALIBRATION		_IOWR(CAL_IOCTL_MAGIC, \
20							205, void *)
21
22/* For Real-Time Audio Calibration */
23#define AUDIO_GET_RTAC_ADM_INFO		_IOR(CAL_IOCTL_MAGIC, \
24							207, void *)
25#define AUDIO_GET_RTAC_VOICE_INFO	_IOR(CAL_IOCTL_MAGIC, \
26							208, void *)
27#define AUDIO_GET_RTAC_ADM_CAL		_IOWR(CAL_IOCTL_MAGIC, \
28							209, void *)
29#define AUDIO_SET_RTAC_ADM_CAL		_IOWR(CAL_IOCTL_MAGIC, \
30							210, void *)
31#define AUDIO_GET_RTAC_ASM_CAL		_IOWR(CAL_IOCTL_MAGIC, \
32							211, void *)
33#define AUDIO_SET_RTAC_ASM_CAL		_IOWR(CAL_IOCTL_MAGIC, \
34							212, void *)
35#define AUDIO_GET_RTAC_CVS_CAL		_IOWR(CAL_IOCTL_MAGIC, \
36							213, void *)
37#define AUDIO_SET_RTAC_CVS_CAL		_IOWR(CAL_IOCTL_MAGIC, \
38							214, void *)
39#define AUDIO_GET_RTAC_CVP_CAL		_IOWR(CAL_IOCTL_MAGIC, \
40							215, void *)
41#define AUDIO_SET_RTAC_CVP_CAL		_IOWR(CAL_IOCTL_MAGIC, \
42							216, void *)
43#define AUDIO_GET_RTAC_AFE_CAL		_IOWR(CAL_IOCTL_MAGIC, \
44							217, void *)
45#define AUDIO_SET_RTAC_AFE_CAL		_IOWR(CAL_IOCTL_MAGIC, \
46							218, void *)
47enum {
48	CVP_VOC_RX_TOPOLOGY_CAL_TYPE = 0,
49	CVP_VOC_TX_TOPOLOGY_CAL_TYPE,
50	CVP_VOCPROC_STATIC_CAL_TYPE,
51	CVP_VOCPROC_DYNAMIC_CAL_TYPE,
52	CVS_VOCSTRM_STATIC_CAL_TYPE,
53	CVP_VOCDEV_CFG_CAL_TYPE,
54	CVP_VOCPROC_STATIC_COL_CAL_TYPE,
55	CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE,
56	CVS_VOCSTRM_STATIC_COL_CAL_TYPE,
57
58	ADM_TOPOLOGY_CAL_TYPE,
59	ADM_CUST_TOPOLOGY_CAL_TYPE,
60	ADM_AUDPROC_CAL_TYPE,
61	ADM_AUDVOL_CAL_TYPE,
62
63	ASM_TOPOLOGY_CAL_TYPE,
64	ASM_CUST_TOPOLOGY_CAL_TYPE,
65	ASM_AUDSTRM_CAL_TYPE,
66
67	AFE_COMMON_RX_CAL_TYPE,
68	AFE_COMMON_TX_CAL_TYPE,
69	AFE_ANC_CAL_TYPE,
70	AFE_AANC_CAL_TYPE,
71	AFE_FB_SPKR_PROT_CAL_TYPE,
72	AFE_HW_DELAY_CAL_TYPE,
73	AFE_SIDETONE_CAL_TYPE,
74	AFE_TOPOLOGY_CAL_TYPE,
75	AFE_CUST_TOPOLOGY_CAL_TYPE,
76
77	LSM_CUST_TOPOLOGY_CAL_TYPE,
78	LSM_TOPOLOGY_CAL_TYPE,
79	LSM_CAL_TYPE,
80
81	ADM_RTAC_INFO_CAL_TYPE,
82	VOICE_RTAC_INFO_CAL_TYPE,
83	ADM_RTAC_APR_CAL_TYPE,
84	ASM_RTAC_APR_CAL_TYPE,
85	VOICE_RTAC_APR_CAL_TYPE,
86
87	MAD_CAL_TYPE,
88	ULP_AFE_CAL_TYPE,
89	ULP_LSM_CAL_TYPE,
90
91	DTS_EAGLE_CAL_TYPE,
92	AUDIO_CORE_METAINFO_CAL_TYPE,
93	SRS_TRUMEDIA_CAL_TYPE,
94
95	CORE_CUSTOM_TOPOLOGIES_CAL_TYPE,
96	ADM_RTAC_AUDVOL_CAL_TYPE,
97
98	ULP_LSM_TOPOLOGY_ID_CAL_TYPE,
99	AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE,
100	AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE,
101	MAX_CAL_TYPES,
102};
103
104#define AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE
105#define AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE
106
107enum {
108	VERSION_0_0,
109};
110
111enum {
112	PER_VOCODER_CAL_BIT_MASK = 0x10000,
113};
114
115#define MAX_IOCTL_CMD_SIZE	512
116
117/* common structures */
118
119struct audio_cal_header {
120	int32_t		data_size;
121	int32_t		version;
122	int32_t		cal_type;
123	int32_t		cal_type_size;
124};
125
126struct audio_cal_type_header {
127	int32_t		version;
128	int32_t		buffer_number;
129};
130
131struct audio_cal_data {
132	/* Size of cal data at mem_handle allocation or at vaddr */
133	int32_t		cal_size;
134	/* If mem_handle if shared memory is used*/
135	int32_t		mem_handle;
136	/* size of virtual memory if shared memory not used */
137};
138
139
140/* AUDIO_ALLOCATE_CALIBRATION */
141struct audio_cal_type_alloc {
142	struct audio_cal_type_header	cal_hdr;
143	struct audio_cal_data		cal_data;
144};
145
146struct audio_cal_alloc {
147	struct audio_cal_header		hdr;
148	struct audio_cal_type_alloc	cal_type;
149};
150
151
152/* AUDIO_DEALLOCATE_CALIBRATION */
153struct audio_cal_type_dealloc {
154	struct audio_cal_type_header	cal_hdr;
155	struct audio_cal_data		cal_data;
156};
157
158struct audio_cal_dealloc {
159	struct audio_cal_header		hdr;
160	struct audio_cal_type_dealloc	cal_type;
161};
162
163
164/* AUDIO_PREPARE_CALIBRATION */
165struct audio_cal_type_prepare {
166	struct audio_cal_type_header	cal_hdr;
167	struct audio_cal_data		cal_data;
168};
169
170struct audio_cal_prepare {
171	struct audio_cal_header		hdr;
172	struct audio_cal_type_prepare	cal_type;
173};
174
175
176/* AUDIO_POST_CALIBRATION */
177struct audio_cal_type_post {
178	struct audio_cal_type_header	cal_hdr;
179	struct audio_cal_data		cal_data;
180};
181
182struct audio_cal_post {
183	struct audio_cal_header		hdr;
184	struct audio_cal_type_post	cal_type;
185};
186
187/*AUDIO_CORE_META_INFO */
188
189struct audio_cal_info_metainfo {
190	uint32_t nKey;
191};
192
193/* Cal info types */
194enum {
195	RX_DEVICE,
196	TX_DEVICE,
197	MAX_PATH_TYPE
198};
199
200struct audio_cal_info_adm_top {
201	int32_t		topology;
202	int32_t		acdb_id;
203	/* RX_DEVICE or TX_DEVICE */
204	int32_t		path;
205	int32_t		app_type;
206	int32_t		sample_rate;
207};
208
209struct audio_cal_info_audproc {
210	int32_t		acdb_id;
211	/* RX_DEVICE or TX_DEVICE */
212	int32_t		path;
213	int32_t		app_type;
214	int32_t		sample_rate;
215};
216
217struct audio_cal_info_audvol {
218	int32_t		acdb_id;
219	/* RX_DEVICE or TX_DEVICE */
220	int32_t		path;
221	int32_t		app_type;
222	int32_t		vol_index;
223};
224
225struct audio_cal_info_afe {
226	int32_t		acdb_id;
227	/* RX_DEVICE or TX_DEVICE */
228	int32_t		path;
229	int32_t		sample_rate;
230};
231
232struct audio_cal_info_afe_top {
233	int32_t		topology;
234	int32_t		acdb_id;
235	/* RX_DEVICE or TX_DEVICE */
236	int32_t		path;
237	int32_t		sample_rate;
238};
239
240struct audio_cal_info_asm_top {
241	int32_t		topology;
242	int32_t		app_type;
243};
244
245struct audio_cal_info_audstrm {
246	int32_t		app_type;
247};
248
249struct audio_cal_info_aanc {
250	int32_t		acdb_id;
251};
252
253#define MAX_HW_DELAY_ENTRIES	25
254
255struct audio_cal_hw_delay_entry {
256	uint32_t sample_rate;
257	uint32_t delay_usec;
258};
259
260struct audio_cal_hw_delay_data {
261	uint32_t				num_entries;
262	struct audio_cal_hw_delay_entry		entry[MAX_HW_DELAY_ENTRIES];
263};
264
265struct audio_cal_info_hw_delay {
266	int32_t					acdb_id;
267	/* RX_DEVICE or TX_DEVICE */
268	int32_t					path;
269	int32_t					property_type;
270	struct audio_cal_hw_delay_data		data;
271};
272
273enum msm_spkr_prot_states {
274	MSM_SPKR_PROT_CALIBRATED,
275	MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS,
276	MSM_SPKR_PROT_DISABLED,
277	MSM_SPKR_PROT_NOT_CALIBRATED,
278	MSM_SPKR_PROT_PRE_CALIBRATED,
279	MSM_SPKR_PROT_IN_FTM_MODE
280};
281#define MSM_SPKR_PROT_IN_FTM_MODE MSM_SPKR_PROT_IN_FTM_MODE
282
283enum msm_spkr_count {
284	SP_V2_SPKR_1,
285	SP_V2_SPKR_2,
286	SP_V2_NUM_MAX_SPKRS
287};
288
289struct audio_cal_info_spk_prot_cfg {
290	int32_t		r0[SP_V2_NUM_MAX_SPKRS];
291	int32_t		t0[SP_V2_NUM_MAX_SPKRS];
292	uint32_t	quick_calib_flag;
293	uint32_t	mode;
294	/*
295	 * 0 - Start spk prot
296	 * 1 - Start calib
297	 * 2 - Disable spk prot
298	 */
299};
300
301struct audio_cal_info_sp_th_vi_ftm_cfg {
302	uint32_t	wait_time[SP_V2_NUM_MAX_SPKRS];
303	uint32_t	ftm_time[SP_V2_NUM_MAX_SPKRS];
304	uint32_t	mode;
305	/*
306	 * 0 - normal running mode
307	 * 1 - Calibration
308	 * 2 - FTM mode
309	 */
310};
311
312struct audio_cal_info_sp_ex_vi_ftm_cfg {
313	uint32_t	wait_time[SP_V2_NUM_MAX_SPKRS];
314	uint32_t	ftm_time[SP_V2_NUM_MAX_SPKRS];
315	uint32_t	mode;
316	/*
317	 * 0 - normal running mode
318	 * 2 - FTM mode
319	 */
320};
321
322struct audio_cal_info_sp_ex_vi_param {
323	int32_t		freq_q20[SP_V2_NUM_MAX_SPKRS];
324	int32_t		resis_q24[SP_V2_NUM_MAX_SPKRS];
325	int32_t		qmct_q24[SP_V2_NUM_MAX_SPKRS];
326	int32_t		status[SP_V2_NUM_MAX_SPKRS];
327};
328
329struct audio_cal_info_sp_th_vi_param {
330	int32_t		r_dc_q24[SP_V2_NUM_MAX_SPKRS];
331	int32_t		temp_q22[SP_V2_NUM_MAX_SPKRS];
332	int32_t		status[SP_V2_NUM_MAX_SPKRS];
333};
334
335struct audio_cal_info_msm_spk_prot_status {
336	int32_t		r0[SP_V2_NUM_MAX_SPKRS];
337	int32_t		status;
338};
339
340struct audio_cal_info_sidetone {
341	uint16_t	enable;
342	uint16_t	gain;
343	int32_t		tx_acdb_id;
344	int32_t		rx_acdb_id;
345	int32_t		mid;
346	int32_t		pid;
347};
348
349struct audio_cal_info_lsm_top {
350	int32_t		topology;
351	int32_t		acdb_id;
352	int32_t		app_type;
353};
354
355
356struct audio_cal_info_lsm {
357	int32_t		acdb_id;
358	/* RX_DEVICE or TX_DEVICE */
359	int32_t		path;
360	int32_t		app_type;
361};
362
363struct audio_cal_info_voc_top {
364	int32_t		topology;
365	int32_t		acdb_id;
366};
367
368struct audio_cal_info_vocproc {
369	int32_t		tx_acdb_id;
370	int32_t		rx_acdb_id;
371	int32_t		tx_sample_rate;
372	int32_t		rx_sample_rate;
373};
374
375enum {
376	DEFAULT_FEATURE_SET,
377	VOL_BOOST_FEATURE_SET,
378};
379
380struct audio_cal_info_vocvol {
381	int32_t		tx_acdb_id;
382	int32_t		rx_acdb_id;
383	/* DEFUALT_ or VOL_BOOST_FEATURE_SET */
384	int32_t		feature_set;
385};
386
387struct audio_cal_info_vocdev_cfg {
388	int32_t		tx_acdb_id;
389	int32_t		rx_acdb_id;
390};
391
392#define MAX_VOICE_COLUMNS	20
393
394union audio_cal_col_na {
395	uint8_t		val8;
396	uint16_t	val16;
397	uint32_t	val32;
398	uint64_t	val64;
399} __packed;
400
401struct audio_cal_col {
402	uint32_t		id;
403	uint32_t		type;
404	union audio_cal_col_na	na_value;
405} __packed;
406
407struct audio_cal_col_data {
408	uint32_t		num_columns;
409	struct audio_cal_col	column[MAX_VOICE_COLUMNS];
410} __packed;
411
412struct audio_cal_info_voc_col {
413	int32_t				table_id;
414	int32_t				tx_acdb_id;
415	int32_t				rx_acdb_id;
416	struct audio_cal_col_data	data;
417};
418
419/* AUDIO_SET_CALIBRATION & */
420struct audio_cal_type_basic {
421	struct audio_cal_type_header	cal_hdr;
422	struct audio_cal_data		cal_data;
423};
424
425struct audio_cal_basic {
426	struct audio_cal_header		hdr;
427	struct audio_cal_type_basic	cal_type;
428};
429
430struct audio_cal_type_adm_top {
431	struct audio_cal_type_header	cal_hdr;
432	struct audio_cal_data		cal_data;
433	struct audio_cal_info_adm_top	cal_info;
434};
435
436struct audio_cal_adm_top {
437	struct audio_cal_header		hdr;
438	struct audio_cal_type_adm_top	cal_type;
439};
440
441struct audio_cal_type_metainfo {
442	struct audio_cal_type_header	cal_hdr;
443	struct audio_cal_data		cal_data;
444	struct audio_cal_info_metainfo	cal_info;
445};
446
447struct audio_core_metainfo {
448	struct audio_cal_header	  hdr;
449	struct audio_cal_type_metainfo cal_type;
450};
451
452struct audio_cal_type_audproc {
453	struct audio_cal_type_header	cal_hdr;
454	struct audio_cal_data		cal_data;
455	struct audio_cal_info_audproc	cal_info;
456};
457
458struct audio_cal_audproc {
459	struct audio_cal_header		hdr;
460	struct audio_cal_type_audproc	cal_type;
461};
462
463struct audio_cal_type_audvol {
464	struct audio_cal_type_header	cal_hdr;
465	struct audio_cal_data		cal_data;
466	struct audio_cal_info_audvol	cal_info;
467};
468
469struct audio_cal_audvol {
470	struct audio_cal_header		hdr;
471	struct audio_cal_type_audvol	cal_type;
472};
473
474struct audio_cal_type_asm_top {
475	struct audio_cal_type_header	cal_hdr;
476	struct audio_cal_data		cal_data;
477	struct audio_cal_info_asm_top	cal_info;
478};
479
480struct audio_cal_asm_top {
481	struct audio_cal_header		hdr;
482	struct audio_cal_type_asm_top	cal_type;
483};
484
485struct audio_cal_type_audstrm {
486	struct audio_cal_type_header	cal_hdr;
487	struct audio_cal_data		cal_data;
488	struct audio_cal_info_audstrm	cal_info;
489};
490
491struct audio_cal_audstrm {
492	struct audio_cal_header		hdr;
493	struct audio_cal_type_audstrm	cal_type;
494};
495
496struct audio_cal_type_afe {
497	struct audio_cal_type_header	cal_hdr;
498	struct audio_cal_data		cal_data;
499	struct audio_cal_info_afe	cal_info;
500};
501
502struct audio_cal_afe {
503	struct audio_cal_header		hdr;
504	struct audio_cal_type_afe	cal_type;
505};
506
507struct audio_cal_type_afe_top {
508	struct audio_cal_type_header	cal_hdr;
509	struct audio_cal_data		cal_data;
510	struct audio_cal_info_afe_top	cal_info;
511};
512
513struct audio_cal_afe_top {
514	struct audio_cal_header		hdr;
515	struct audio_cal_type_afe_top	cal_type;
516};
517
518struct audio_cal_type_aanc {
519	struct audio_cal_type_header	cal_hdr;
520	struct audio_cal_data		cal_data;
521	struct audio_cal_info_aanc	cal_info;
522};
523
524struct audio_cal_aanc {
525	struct audio_cal_header		hdr;
526	struct audio_cal_type_aanc	cal_type;
527};
528
529struct audio_cal_type_fb_spk_prot_cfg {
530	struct audio_cal_type_header		cal_hdr;
531	struct audio_cal_data			cal_data;
532	struct audio_cal_info_spk_prot_cfg	cal_info;
533};
534
535struct audio_cal_fb_spk_prot_cfg {
536	struct audio_cal_header			hdr;
537	struct audio_cal_type_fb_spk_prot_cfg	cal_type;
538};
539
540struct audio_cal_type_sp_th_vi_ftm_cfg {
541	struct audio_cal_type_header		cal_hdr;
542	struct audio_cal_data			cal_data;
543	struct audio_cal_info_sp_th_vi_ftm_cfg	cal_info;
544};
545
546struct audio_cal_sp_th_vi_ftm_cfg {
547	struct audio_cal_header			hdr;
548	struct audio_cal_type_sp_th_vi_ftm_cfg	cal_type;
549};
550
551struct audio_cal_type_sp_ex_vi_ftm_cfg {
552	struct audio_cal_type_header		cal_hdr;
553	struct audio_cal_data			cal_data;
554	struct audio_cal_info_sp_ex_vi_ftm_cfg	cal_info;
555};
556
557struct audio_cal_sp_ex_vi_ftm_cfg {
558	struct audio_cal_header			hdr;
559	struct audio_cal_type_sp_ex_vi_ftm_cfg	cal_type;
560};
561struct audio_cal_type_hw_delay {
562	struct audio_cal_type_header	cal_hdr;
563	struct audio_cal_data		cal_data;
564	struct audio_cal_info_hw_delay	cal_info;
565};
566
567struct audio_cal_hw_delay {
568	struct audio_cal_header		hdr;
569	struct audio_cal_type_hw_delay	cal_type;
570};
571
572struct audio_cal_type_sidetone {
573	struct audio_cal_type_header		cal_hdr;
574	struct audio_cal_data			cal_data;
575	struct audio_cal_info_sidetone		cal_info;
576};
577
578struct audio_cal_sidetone {
579	struct audio_cal_header			hdr;
580	struct audio_cal_type_sidetone		cal_type;
581};
582
583struct audio_cal_type_lsm_top {
584	struct audio_cal_type_header	cal_hdr;
585	struct audio_cal_data		cal_data;
586	struct audio_cal_info_lsm_top	cal_info;
587};
588
589struct audio_cal_lsm_top {
590	struct audio_cal_header		hdr;
591	struct audio_cal_type_lsm_top	cal_type;
592};
593
594struct audio_cal_type_lsm {
595	struct audio_cal_type_header	cal_hdr;
596	struct audio_cal_data		cal_data;
597	struct audio_cal_info_lsm	cal_info;
598};
599
600struct audio_cal_lsm {
601	struct audio_cal_header		hdr;
602	struct audio_cal_type_lsm	cal_type;
603};
604
605struct audio_cal_type_voc_top {
606	struct audio_cal_type_header	cal_hdr;
607	struct audio_cal_data		cal_data;
608	struct audio_cal_info_voc_top	cal_info;
609};
610
611struct audio_cal_voc_top {
612	struct audio_cal_header		hdr;
613	struct audio_cal_type_voc_top	cal_type;
614};
615
616struct audio_cal_type_vocproc {
617	struct audio_cal_type_header	cal_hdr;
618	struct audio_cal_data		cal_data;
619	struct audio_cal_info_vocproc	cal_info;
620};
621
622struct audio_cal_vocproc {
623	struct audio_cal_header		hdr;
624	struct audio_cal_type_vocproc	cal_type;
625};
626
627struct audio_cal_type_vocvol {
628	struct audio_cal_type_header	cal_hdr;
629	struct audio_cal_data		cal_data;
630	struct audio_cal_info_vocvol	cal_info;
631};
632
633struct audio_cal_vocvol {
634	struct audio_cal_header		hdr;
635	struct audio_cal_type_vocvol	cal_type;
636};
637
638struct audio_cal_type_vocdev_cfg {
639	struct audio_cal_type_header		cal_hdr;
640	struct audio_cal_data			cal_data;
641	struct audio_cal_info_vocdev_cfg	cal_info;
642};
643
644struct audio_cal_vocdev_cfg {
645	struct audio_cal_header			hdr;
646	struct audio_cal_type_vocdev_cfg	cal_type;
647};
648
649struct audio_cal_type_voc_col {
650	struct audio_cal_type_header	cal_hdr;
651	struct audio_cal_data		cal_data;
652	struct audio_cal_info_voc_col	cal_info;
653};
654
655struct audio_cal_voc_col {
656	struct audio_cal_header		hdr;
657	struct audio_cal_type_voc_col	cal_type;
658};
659
660/* AUDIO_GET_CALIBRATION */
661struct audio_cal_type_fb_spk_prot_status {
662	struct audio_cal_type_header			cal_hdr;
663	struct audio_cal_data				cal_data;
664	struct audio_cal_info_msm_spk_prot_status	cal_info;
665};
666
667struct audio_cal_fb_spk_prot_status {
668	struct audio_cal_header				hdr;
669	struct audio_cal_type_fb_spk_prot_status	cal_type;
670};
671
672struct audio_cal_type_sp_th_vi_param {
673	struct audio_cal_type_header			cal_hdr;
674	struct audio_cal_data				cal_data;
675	struct audio_cal_info_sp_th_vi_param		cal_info;
676};
677
678struct audio_cal_sp_th_vi_param {
679	struct audio_cal_header				hdr;
680	struct audio_cal_type_sp_th_vi_param		cal_type;
681};
682struct audio_cal_type_sp_ex_vi_param {
683	struct audio_cal_type_header			cal_hdr;
684	struct audio_cal_data				cal_data;
685	struct audio_cal_info_sp_ex_vi_param		cal_info;
686};
687
688struct audio_cal_sp_ex_vi_param {
689	struct audio_cal_header				hdr;
690	struct audio_cal_type_sp_ex_vi_param		cal_type;
691};
692#endif /* _UAPI_MSM_AUDIO_CALIBRATION_H */
693