@@ -41,15 +41,65 @@ struct fifo_header {
4141#define ICM42688_FIFO_BUF_LEN 2051
4242static uint8_t icm42688_fifo_bufs [N_BUFS ][ICM42688_FIFO_BUF_LEN ];
4343
44+ const struct device * icm42688 = DEVICE_DT_GET_ONE (invensense_icm42688 );
45+ const struct device * akm09918 = DEVICE_DT_GET_ONE (asahi_kasei_akm09918c );
4446
45- void fifo_stream (const struct device * icm42688 , struct rtio * r , uint32_t n_bufs )
47+ void poll_imu (void )
48+ {
49+ uint32_t cycle_start , cycle_end ;
50+ struct sensor_value accel [3 ];
51+ struct sensor_value gyro [3 ];
52+ struct sensor_value imu_temp ;
53+
54+ /* Fetch everything */
55+ cycle_start = k_cycle_get_32 ();
56+ sensor_sample_fetch_chan (icm42688 , SENSOR_CHAN_ALL );
57+ cycle_end = k_cycle_get_32 ();
58+
59+ sensor_channel_get (icm42688 , SENSOR_CHAN_ACCEL_XYZ , accel );
60+ sensor_channel_get (icm42688 , SENSOR_CHAN_GYRO_XYZ , gyro );
61+ sensor_channel_get (icm42688 , SENSOR_CHAN_DIE_TEMP , & imu_temp );
62+
63+ LOG_INF ("ICM42688: Fetch took %u cycles" , cycle_end - cycle_start );
64+ LOG_INF ("ICM42688: Accel (m/s^2): x: %d.%06d, y: %d.%06d, z: %d.%06d" ,
65+ accel [0 ].val1 , accel [0 ].val2 ,
66+ accel [1 ].val1 , accel [1 ].val2 ,
67+ accel [2 ].val1 , accel [2 ].val2 );
68+ LOG_INF ("ICM42688: Gyro (rad/s): x: %d.%06d, y: %d.%06d, z: %d.%06d" ,
69+ gyro [0 ].val1 , gyro [0 ].val2 ,
70+ gyro [1 ].val1 , gyro [1 ].val2 ,
71+ gyro [2 ].val1 , gyro [2 ].val2 );
72+ LOG_INF ("ICM42688: Temp (C): %d.%06d" ,
73+ imu_temp .val1 , imu_temp .val2 );
74+ }
75+
76+ void poll_mag (void )
77+ {
78+ uint32_t cycle_start , cycle_end ;
79+ struct sensor_value magn [3 ];
80+
81+ /* Fetch everything */
82+ cycle_start = k_cycle_get_32 ();
83+ sensor_sample_fetch_chan (akm09918 , SENSOR_CHAN_ALL );
84+ cycle_end = k_cycle_get_32 ();
85+
86+ sensor_channel_get (akm09918 , SENSOR_CHAN_MAGN_XYZ , magn );
87+
88+ LOG_INF ("AKM09918: Fetch took %u cycles" , cycle_end - cycle_start );
89+ LOG_INF ("AKM09918: Mag (Gauss): x: %d.%06d, y: %d.%06d, z: %d.%06d" ,
90+ magn [0 ].val1 , magn [0 ].val2 ,
91+ magn [1 ].val1 , magn [1 ].val2 ,
92+ magn [2 ].val1 , magn [2 ].val2 );
93+ }
94+
95+ void fifo_stream (struct rtio * r , uint32_t n_bufs )
4696{
4797 struct rtio_iodev * iodev ;
4898 struct rtio_sqe * sqe ;
4999
50100 LOG_INF ("FIFO with RTIO context %p, context size %u" , r , sizeof (* r ));
51101
52- /* obtain reference the stream */
102+ /* obtain reference to the stream */
53103 (void )sensor_fifo_iodev (icm42688 , & iodev );
54104
55105 LOG_INF ("Setting up RX requests" );
@@ -107,11 +157,12 @@ void fifo_stream(const struct device *icm42688, struct rtio *r, uint32_t n_bufs)
107157 }
108158
109159
110- if (i % 128 == 0 ) {
111- printk ( "Slow mode on iteration %d, underflows (sensor overflows) %u, buf "
112- "%lu, data int status %x, result %d\n" ,
160+ if (i % 64 == 0 ) {
161+ LOG_INF ( "Poll Mag: Iteration %d, Underflows (sensor overflows) %u, Buf "
162+ "%lu, int status %x, result %d\n" ,
113163 i , overflows , buf_idx , buf [0 ], result );
114- k_busy_wait (4000 );
164+ poll_mag ();
165+ k_busy_wait (1000 );
115166 }
116167
117168 /* Now to recycle the buffer by putting it back in the queue */
@@ -134,53 +185,40 @@ void fifo_stream(const struct device *icm42688, struct rtio *r, uint32_t n_bufs)
134185 LOG_INF ("DONE! FIFO should be DISABLED" );
135186}
136187
188+
137189void main (void )
138190{
139- const struct device * icm42688 = DEVICE_DT_GET_ONE (invensense_icm42688 );
140- struct sensor_value accel [3 ];
141- struct sensor_value gyro [3 ];
142- struct sensor_value temp ;
143-
144-
145191 LOG_INF ("TDK RoboKit1 Sample" );
146192
147-
148193 if (!device_is_ready (icm42688 )) {
149194 LOG_INF ("%s: device not ready." , icm42688 -> name );
150195 return ;
151196 }
152197
153- LOG_INF ( "Fetch + Read" );
154-
155- /* A few polling readings */
156- for ( int i = 0 ; i < 10 ; i ++ ) {
198+ if (! device_is_ready ( akm09918 )) {
199+ LOG_INF ( "%s: device not ready." , akm09918 -> name );
200+ return ;
201+ }
157202
158- /* Fetch everything */
159- sensor_sample_fetch_chan (icm42688 , SENSOR_CHAN_ALL );
203+ struct sensor_value sample_freq = { .val1 = 10 , .val2 = 0 };
160204
161- sensor_channel_get (icm42688 , SENSOR_CHAN_ACCEL_XYZ , accel );
162- sensor_channel_get (icm42688 , SENSOR_CHAN_GYRO_XYZ , gyro );
163- sensor_channel_get (icm42688 , SENSOR_CHAN_DIE_TEMP , & temp );
205+ sensor_attr_set (akm09918 , SENSOR_CHAN_MAGN_XYZ , SENSOR_ATTR_SAMPLING_FREQUENCY ,
206+ & sample_freq );
164207
165- LOG_INF ("ICM42688: Accel (m/s^2): x: %d.%06d, y: %d.%06d, z: %d.%06d" ,
166- accel [0 ].val1 , accel [0 ].val2 ,
167- accel [1 ].val1 , accel [1 ].val2 ,
168- accel [2 ].val1 , accel [2 ].val2 );
169- LOG_INF ("ICM42688: Gyro (rad/s): x: %d.%06d, y: %d.%06d, z: %d.%06di" ,
170- gyro [0 ].val1 , gyro [0 ].val2 ,
171- gyro [1 ].val1 , gyro [1 ].val2 ,
172- gyro [2 ].val1 , gyro [2 ].val2 );
173- LOG_INF ("ICM42688: Temp (C): %d.%06d\n" ,
174- temp .val1 , temp .val2 );
208+ LOG_INF ("Fetch + Read" );
175209
210+ /* A few polling readings */
211+ for (int i = 0 ; i < 10 ; i ++ ) {
212+ poll_imu ();
213+ poll_mag ();
176214 k_sleep (K_MSEC (100 ));
177215 }
178216
179217 LOG_INF ("Showing under/over flows with 1 buffer queue" );
180- fifo_stream (icm42688 , & r1 , 1 );
218+ fifo_stream (& r1 , 1 );
181219
182220 LOG_INF ("Showing no under/over flows with 4 buffer queue" );
183- fifo_stream (icm42688 , & r4 , 4 );
221+ fifo_stream (& r4 , 4 );
184222
185223 LOG_INF ("Done!" );
186224
0 commit comments