1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  */
9 
10 #include <rtthread.h>
11 #include <rtdevice.h>
12 #include "board.h"
13 
14 #define LED_PIN GET_PIN(C,6)
15 
main(void)16 int main(void)
17 {
18     int count = 1;
19 
20     rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
21     while (count++)
22     {
23         rt_pin_write(LED_PIN, PIN_HIGH);
24         rt_thread_mdelay(500);
25         rt_pin_write(LED_PIN, PIN_LOW);
26         rt_thread_mdelay(500);
27     }
28 
29     return RT_EOK;
30 }
31 
32 #ifdef BSP_USING_GPIO
33 #define KEY1_PIN GET_PIN(C,5)
key1_cb(void * args)34 void key1_cb(void *args)
35 {
36     rt_kprintf("key1 irq!\n");
37 }
pin_sample(int argc,char * argv[])38 static int pin_sample(int argc, char *argv[])
39 {
40     rt_pin_mode(KEY1_PIN, PIN_IRQ_MODE_FALLING);
41     rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, key1_cb, RT_NULL);
42     rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE);
43 
44     return RT_EOK;
45 }
46 MSH_CMD_EXPORT(pin_sample, pin sample);
47 #endif
48 
49 #ifdef BSP_USING_ADC
50 #define ADC_DEV_NAME "adc1"
51 #define ADC_DEV_CHANNEL 0
52 #define REFER_VOLTAGE 330
53 #define CONVERT_BITS (1 << 12)
54 
adc_vol_sample(int argc,char * argv[])55 static int adc_vol_sample(int argc, char *argv[])
56 {
57     rt_adc_device_t adc_dev;
58     rt_uint32_t value, vol;
59     rt_err_t ret = RT_EOK;
60 
61     adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
62     if (adc_dev == RT_NULL)
63     {
64         rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);
65         return -RT_ERROR;
66     }
67 
68     ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
69 
70     value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
71     rt_kprintf("the value is :%d,", value);
72 
73     vol = value * REFER_VOLTAGE / CONVERT_BITS;
74     rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
75 
76     ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
77 
78     return ret;
79 }
80 MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);
81 #endif
82 
83 #ifdef BSP_USING_TIM
84 #define HWTIMER_DEV_NAME "timer0"
85 
timeout_cb(rt_device_t dev,rt_size_t size)86 static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
87 {
88     rt_kprintf("this is hwtimer timeout callback fucntion!\n");
89     rt_kprintf("tick is :%d !\n", rt_tick_get());
90 
91     return 0;
92 }
93 
hwtimer_sample(int argc,char * argv[])94 static int hwtimer_sample(int argc, char *argv[])
95 {
96     rt_err_t ret = RT_EOK;
97     rt_hwtimerval_t timeout_s;
98     rt_device_t hw_dev = RT_NULL;
99     rt_hwtimer_mode_t mode;
100 
101     hw_dev = rt_device_find(HWTIMER_DEV_NAME);
102     if (hw_dev == RT_NULL)
103     {
104         rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME);
105         return -RT_ERROR;
106     }
107 
108     ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
109     if (ret != RT_EOK)
110     {
111         rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME);
112         return ret;
113     }
114 
115     rt_device_set_rx_indicate(hw_dev, timeout_cb);
116 
117     mode = HWTIMER_MODE_PERIOD;
118     //mode = HWTIMER_MODE_ONESHOT;
119     ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
120     if (ret != RT_EOK)
121     {
122         rt_kprintf("set mode failed! ret is :%d\n", ret);
123         return ret;
124     }
125 
126     timeout_s.sec = 2;
127     timeout_s.usec = 0;
128 
129     if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
130     {
131         rt_kprintf("set timeout value failed\n");
132         return -RT_ERROR;
133     }
134 
135     rt_thread_mdelay(3500);
136 
137     rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
138     rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);
139 
140     return ret;
141 }
142 MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample);
143 #endif
144 
145 #ifdef BSP_USING_PWM
146 #define PWM_DEV_NAME "pwm0" /* PWM设备名称 */
147 #define PWM_DEV_CHANNEL 0   /* PWM通道 */
148 
149 struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
150 
pwm_sample(int argc,char * argv[])151 static int pwm_sample(int argc, char *argv[])
152 {
153     rt_uint32_t period, pulse;
154 
155     period = 500000; /* 周期为0.5ms,单位为纳秒ns */
156     pulse = 250000;  /* PWM脉冲宽度值,单位为纳秒ns */
157 
158     pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
159     if (pwm_dev == RT_NULL)
160     {
161         rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
162         return -RT_ERROR;
163     }
164 
165     rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
166     rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
167     return RT_EOK;
168 }
169 MSH_CMD_EXPORT(pwm_sample, pwm sample);
170 #endif
171 
172 #ifdef BSP_USING_RTC
173 #include <sys/time.h>
rtc_sample(int argc,char * argv[])174 static int rtc_sample(int argc, char *argv[])
175 {
176     rt_err_t ret = RT_EOK;
177     time_t now;
178 
179     ret = set_date(2020, 2, 28);
180     if (ret != RT_EOK)
181     {
182         rt_kprintf("set RTC date failed\n");
183         return ret;
184     }
185 
186     ret = set_time(23, 59, 55);
187     if (ret != RT_EOK)
188     {
189         rt_kprintf("set RTC time failed\n");
190         return ret;
191     }
192 
193     //rt_thread_mdelay(3000);
194     now = time(RT_NULL);
195     rt_kprintf("%s\n", ctime(&now));
196 
197     return ret;
198 }
199 MSH_CMD_EXPORT(rtc_sample, rtc sample);
200 #endif
201 
202 #ifdef BSP_USING_WDT
203 #define WDT_DEVICE_NAME "wdt"
204 
205 static rt_device_t wdg_dev;
206 
idle_hook(void)207 static void idle_hook(void)
208 {
209     rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL);
210     rt_kprintf("feed the dog!\n ");
211 }
212 
wdt_sample(int argc,char * argv[])213 static int wdt_sample(int argc, char *argv[])
214 {
215     rt_err_t ret = RT_EOK;
216     rt_uint32_t timeout = 2;
217     char device_name[RT_NAME_MAX];
218 
219     if (argc == 2)
220     {
221         rt_strncpy(device_name, argv[1], RT_NAME_MAX);
222     }
223     else
224     {
225         rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
226     }
227     wdg_dev = rt_device_find(device_name);
228     if (!wdg_dev)
229     {
230         rt_kprintf("find %s failed!\n", device_name);
231         return -RT_ERROR;
232     }
233     ret = rt_device_init(wdg_dev);
234     if (ret != RT_EOK)
235     {
236         rt_kprintf("initialize %s failed!\n", device_name);
237         return -RT_ERROR;
238     }
239     ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
240     if (ret != RT_EOK)
241     {
242         rt_kprintf("set %s timeout failed!\n", device_name);
243         return -RT_ERROR;
244     }
245     ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
246     if (ret != RT_EOK)
247     {
248         rt_kprintf("start %s failed!\n", device_name);
249         return -RT_ERROR;
250     }
251     rt_thread_idle_sethook(idle_hook);
252 
253     return ret;
254 }
255 MSH_CMD_EXPORT(wdt_sample, wdt sample);
256 #endif
257 
258 #ifdef BSP_USING_SPI
259 #define W25Q_SPI_DEVICE_NAME "spi00"
260 #define W25Q_FLASH_NAME "norflash0"
261 
262 #include "drv_spi.h"
263 #ifdef RT_USING_SFUD
264 #include "dev_spi_flash_sfud.h"
265 
rt_hw_spi_flash_init(void)266 static int rt_hw_spi_flash_init(void)
267 {
268     rt_hw_spi_device_attach("spi0", W25Q_SPI_DEVICE_NAME, GPIOP, PIN22);
269 
270     if (RT_NULL == rt_sfud_flash_probe(W25Q_FLASH_NAME, W25Q_SPI_DEVICE_NAME))
271     {
272         return -RT_ERROR;
273     };
274 
275     return RT_EOK;
276 }
277 INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
278 
spi_w25q_sample(int argc,char * argv[])279 static void spi_w25q_sample(int argc, char *argv[])
280 {
281     struct rt_spi_device *spi_dev_w25q;
282     char name[RT_NAME_MAX];
283     rt_uint8_t w25x_read_id = 0x90;
284     rt_uint8_t id[5] = {0};
285 
286     if (argc == 2)
287     {
288         rt_strncpy(name, argv[1], RT_NAME_MAX);
289     }
290     else
291     {
292         rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX);
293     }
294 
295     /* 查找 spi 设备获取设备句柄 */
296     spi_dev_w25q = (struct rt_spi_device *)rt_device_find(name);
297     struct rt_spi_configuration cfg;
298     cfg.data_width = 8;
299     cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
300     cfg.max_hz = 30 * 1000 * 1000; /* 20M */
301 
302     rt_spi_configure(spi_dev_w25q, &cfg);
303     if (!spi_dev_w25q)
304     {
305         rt_kprintf("spi sample run failed! can't find %s device!\n", name);
306     }
307     else
308     {
309         /* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */
310         rt_spi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id, 5);
311         rt_kprintf("use rt_spi_send_then_recv() read w25q ID is:%x%x\n", id[3], id[4]);
312 
313         /* 方式2:使用 rt_spi_transfer_message()发送命令读取ID */
314         struct rt_spi_message msg1, msg2;
315 
316         msg1.send_buf = &w25x_read_id;
317         msg1.recv_buf = RT_NULL;
318         msg1.length = 1;
319         msg1.cs_take = 1;
320         msg1.cs_release = 0;
321         msg1.next = &msg2;
322 
323         msg2.send_buf = RT_NULL;
324         msg2.recv_buf = id;
325         msg2.length = 5;
326         msg2.cs_take = 0;
327         msg2.cs_release = 1;
328         msg2.next = RT_NULL;
329 
330         rt_spi_transfer_message(spi_dev_w25q, &msg1);
331         rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x\n", id[3], id[4]);
332     }
333 }
334 MSH_CMD_EXPORT(spi_w25q_sample, spi w25q sample);
335 
336 #ifdef RT_USING_DFS_ELMFAT
337 #include <dfs_file.h>
338 #include <unistd.h>
spi_flash_elmfat_sample(void)339 static void spi_flash_elmfat_sample(void)
340 {
341     int fd, size;
342     struct statfs elm_stat;
343     char str[] = "elmfat mount to W25Q flash.\r\n", buf[80];
344 
345     if (dfs_mkfs("elm", W25Q_FLASH_NAME) == 0)
346         rt_kprintf("make elmfat filesystem success.\n");
347 
348     if (dfs_mount(W25Q_FLASH_NAME, "/", "elm", 0, 0) == 0)
349         rt_kprintf("elmfat filesystem mount success.\n");
350 
351     if (statfs("/", &elm_stat) == 0)
352         rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
353                    elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
354 
355     if (mkdir("/user", 0x777) == 0)
356         rt_kprintf("make a directory: '/user'.\n");
357 
358     rt_kprintf("Write string '%s' to /user/test.txt.\n", str);
359 
360     fd = open("/user/test.txt", O_WRONLY | O_CREAT);
361     if (fd >= 0)
362     {
363         if (write(fd, str, sizeof(str)) == sizeof(str))
364             rt_kprintf("Write data done.\n");
365 
366         close(fd);
367     }
368 
369     fd = open("/user/test.txt", O_RDONLY);
370     if (fd >= 0)
371     {
372         size = read(fd, buf, sizeof(buf));
373 
374         close(fd);
375 
376         if (size == sizeof(str))
377             rt_kprintf("Read data from file test.txt(size: %d): %s \n", size, buf);
378     }
379 }
380 MSH_CMD_EXPORT(spi_flash_elmfat_sample, spi flash elmfat sample);
381 #endif
382 #endif
383 #endif
384 
385 #ifdef BSP_USING_SPI
386 #ifdef RT_USING_SPI_MSD
387 #define SD_SPI_DEVICE_NAME "spi10"
388 #define SDCARD_NAME "sd0"
389 
390 #include "drv_spi.h"
391 #include "dev_spi_msd.h"
392 #include <dfs_file.h>
393 #include <unistd.h>
394 
rt_hw_spi1_tfcard(void)395 static int rt_hw_spi1_tfcard(void)
396 {
397    rt_hw_spi_device_attach("spi1", SD_SPI_DEVICE_NAME, GPIOB, PIN6);
398    return msd_init(SDCARD_NAME, SD_SPI_DEVICE_NAME);
399 }
400 INIT_DEVICE_EXPORT(rt_hw_spi1_tfcard);
401 
elmfat_sample(void)402 static void elmfat_sample(void)
403 {
404    int fd, size;
405    struct statfs elm_stat;
406    char str[] = "elmfat mount to sdcard.", buf[80];
407 
408    if (dfs_mkfs("elm", SDCARD_NAME) == 0)
409        rt_kprintf("make elmfat filesystem success.\n");
410 
411    if (dfs_mount(SDCARD_NAME, "/", "elm", 0, 0) == 0)
412        rt_kprintf("elmfat filesystem mount success.\n");
413 
414    if (statfs("/", &elm_stat) == 0)
415        rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
416                   elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
417 
418    if (mkdir("/user", 0x777) == 0)
419        rt_kprintf("make a directory: '/user'.\n");
420 
421    rt_kprintf("Write string '%s' to /user/test.txt.\n", str);
422 
423    fd = open("/user/test.txt", O_WRONLY | O_CREAT);
424    if (fd >= 0)
425    {
426        if (write(fd, str, sizeof(str)) == sizeof(str))
427            rt_kprintf("Write data done.\n");
428 
429        close(fd);
430    }
431 
432    fd = open("/user/test.txt", O_RDONLY);
433    if (fd >= 0)
434    {
435        size = read(fd, buf, sizeof(buf));
436 
437        close(fd);
438 
439        if (size == sizeof(str))
440            rt_kprintf("Read data from file test.txt(size: %d): %s \n", size, buf);
441    }
442 }
443 MSH_CMD_EXPORT(elmfat_sample, elmfat sample);
444 #endif
445 #endif
446 
447 #ifdef BSP_USING_SDIO
448 #define SDCARD_NAME "sd0"
449 
450 #include <dfs_file.h>
451 #include <unistd.h>
452 
sdio_elmfat_sample(void)453 static void sdio_elmfat_sample(void)
454 {
455     int fd, size;
456     struct statfs elm_stat;
457     char str[] = "elmfat mount to sdcard.\n", buf[80];
458 
459     if (dfs_mkfs("elm", SDCARD_NAME) == 0)
460         rt_kprintf("make elmfat filesystem success.\n");
461 
462     if (dfs_mount(SDCARD_NAME, "/", "elm", 0, 0) == 0)
463         rt_kprintf("elmfat filesystem mount success.\n");
464 
465     if (statfs("/", &elm_stat) == 0)
466         rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
467                    elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
468 
469     if (mkdir("/user", 0x777) == 0)
470         rt_kprintf("make a directory: '/user'.\n");
471 
472     rt_kprintf("Write string '%s' to /user/test.txt.\n", str);
473 
474     fd = open("/user/test.txt", O_WRONLY | O_CREAT);
475     if (fd >= 0)
476     {
477         if (write(fd, str, sizeof(str)) == sizeof(str))
478             rt_kprintf("Write data done.\n");
479 
480         close(fd);
481     }
482 
483     fd = open("/user/test.txt", O_RDONLY);
484     if (fd >= 0)
485     {
486         size = read(fd, buf, sizeof(buf));
487 
488         close(fd);
489 
490         if (size == sizeof(str))
491             rt_kprintf("Read data from file test.txt(size: %d): %s \n", size, buf);
492     }
493 }
494 MSH_CMD_EXPORT(sdio_elmfat_sample, sdio elmfat sample);
495 #endif
496 
497 #ifdef RT_USING_HWCRYPTO
crypto_sample(void)498 static void crypto_sample(void)
499 {
500     rt_uint8_t temp[] = {0, 1, 2, 3, 4, 5, 6, 7};
501     struct rt_hwcrypto_ctx *ctx;
502     rt_uint32_t result = 0;
503     struct hwcrypto_crc_cfg cfg =
504         {
505             .last_val = 0x0,
506             .poly = 0x04C11DB7,
507             .width = 8,
508             .xorout = 0x00000000,
509             .flags = 0,
510         };
511 
512     ctx = rt_hwcrypto_crc_create(rt_hwcrypto_dev_default(), HWCRYPTO_CRC_CRC32);
513     rt_hwcrypto_crc_cfg(ctx, &cfg);
514     result = rt_hwcrypto_crc_update(ctx, temp, sizeof(temp));
515     rt_kprintf("result: 0x%08x \n", result);
516     rt_hwcrypto_crc_destroy(ctx);
517 }
518 MSH_CMD_EXPORT(crypto_sample, crypto sample);
519 #endif
520 
521 #ifdef BSP_USING_NOR_FLASH
522 #define NORFLASH_DEV_NAME "nor"
norflash_sample(int argc,char * argv[])523 static int norflash_sample(int argc, char *argv[])
524 {
525     rt_err_t ret = RT_EOK;
526     rt_device_t hw_dev = RT_NULL;
527 
528     hw_dev = rt_device_find(NORFLASH_DEV_NAME);
529     if (hw_dev == RT_NULL)
530     {
531         rt_kprintf("norflash sample run failed! can't find %s device!\n", NORFLASH_DEV_NAME);
532         return -RT_ERROR;
533     }
534     else
535     {
536         rt_kprintf("norflash sample run success! find %s device!\n", NORFLASH_DEV_NAME);
537     }
538 
539     ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
540     if (ret != RT_EOK)
541     {
542         rt_kprintf("open %s device failed!\n", NORFLASH_DEV_NAME);
543         return ret;
544     }
545     else
546     {
547         rt_kprintf("open %s device success!\n", NORFLASH_DEV_NAME);
548     }
549 
550     struct rt_mtd_nor_device *hw_nor;
551     hw_nor = RT_MTD_NOR_DEVICE(hw_dev);
552     long id = hw_nor->ops->read_id(hw_nor);
553     rt_kprintf("id = %08x!\n", id);
554     // rt_device_set_rx_indicate(hw_dev, timeout_cb);
555 
556     // mode = HWTIMER_MODE_PERIOD;
557     // //mode = HWTIMER_MODE_ONESHOT;
558     // ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
559     // if (ret != RT_EOK)
560     // {
561     //     rt_kprintf("set mode failed! ret is :%d\n", ret);
562     //     return ret;
563     // }
564 
565     // timeout_s.sec = 2;
566     // timeout_s.usec = 0;
567 
568     // if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
569     // {
570     //     rt_kprintf("set timeout value failed\n");
571     //     return -RT_ERROR;
572     // }
573 
574     // rt_thread_mdelay(3500);
575 
576     // rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
577     // rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);
578 
579     return ret;
580 }
581 MSH_CMD_EXPORT(norflash_sample, norflash sample);
582 #endif
583