|
1. 上一帖虽然基本完成了设计界面展示的任务,但是作为一个开发平台来说,这个工作是不完整的。因为只有底层的开发才是设计最终需要的内容,HMI简化的是界面开发,底层开发还是要靠大家。
2. 在myir提供的代码中,也包含了对于硬件GPIO,I2C,SPI等的访问,可以直接使用。原来从核心板上的资料上,有ADC的2路,希望能直接采样电压电流信号,不过在开发板上只引出了GPIO接口,需要自己定制其他的开发工作。这里简单说明一下范例代码的分析。
如下是GPIO_LED的代码,
- #include <stdio.h>
- #include <unistd.h>
- #include <linux/input.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <string.h>
- //#define DEBUG 1
- #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
- #define LED_DELAY_US (1000*1000) /* 200 ms */
- #ifdef DEBUG
- #define dbg_info(fmt, args...) printf(fmt, #args)
- #else
- #define dbg_info(fmt, args...)
- #endif
- #define dbg_err(fmt, args...) printf(fmt, #args)
- typedef struct gpio_s {
- int gpio;
- char value_path[64];
- char dir_path[64];
- int value;
- }gpio_t;
- void leds_ctrl(const char **leds, int count, unsigned int status)
- {
- int i = 0;
- char cmd[128] = {0};
- static unsigned int pre_status = 0;/* It was on by default */
- for (i = 0; i < count; i++, leds++) {
- if ((pre_status ^ status) & (1 << i)) {
- sprintf(cmd, "echo %d > %s", !!(status&(1 << i)), *leds);
- if (system(cmd)) {
- dbg_info("run cmd [%s] failed!\n", cmd);
- }
- }
- }
- pre_status = status;
- }
- int main (int argc, char *argv[])
- {
- int keys_fd;
- char ret[2];
- struct input_event t[2];
- fd_set fds;
- struct timeval tv;
- const char* leds[]={argv[1]};
- keys_fd = open (argv[1], O_RDONLY);
- if (keys_fd <= 0) {
- dbg_err ("open %s device error!\n", argv[1]);
- return 0;
- }
- /* Set all LEDs to ON to info user for key pressing */
- while(1){
- leds_ctrl(leds, ARRAY_SIZE(leds), 0xF);
- usleep(LED_DELAY_US);
- leds_ctrl(leds, ARRAY_SIZE(leds), 0);
- usleep(LED_DELAY_US);
- }
- return 0;
- }
复制代码 这里面,调用了linux的input库函数,对于led控制就实现了下面的主要语句,
leds_ctrl(leds, ARRAY_SIZE(leds), 0xF);
3. 这个代码编译后可以直接在开发板上执行。在QT开发环境中,如果控制实现GPIO的功能,需要把这样的程序作为一个函数库程序,导入,就可以一起编译执行了。
|
|