请问这个嵌入式的代码如何理解呢?我看得不是很懂,希望大家帮忙逐行帮注释一下和分析一下,非常感谢大家!
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<syslog.h>
#include<errno.h>
#include<linux/input.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/mman.h>
#include<stdbool.h>
#include<linux/fb.h>
#include<sys/mman.h>
#include<sys/ioctl.h>
#define TEST_MAGIC 'x'
#define TEST_MAX_NR 4
#define LED1 _IO(TEST_MAGIC,0)
#define LED2 _IO(TEST_MAGIC,1)
#define LED3 _IO(TEST_MAGIC,2)
#define LED4 _IO(TEST_MAGIC,3)
#define LED(i) _IO(TEST_MAGIC,i)//做循环用
//控制开关
int openorcloseLed();//控制灯全开或全关,正常返回1,错误返回-1
int openorcloseLed(int arg) {
int fd;
fd = open("/dev/Led", O_RDWR)
if (fd < 0)
{
printf("打开驱动文件失败,请检查是否有该驱动或者路径是否正确\n");
return -1;
}
for (int i = 0; i < 4; i++) {
ioctl(fd, LED(i), arg);
}
return 1;
}
void loadbmp();
void loadbmp(int bmp_begin) {
int lcd = open("/dev/fb0", O_RDWR);
char bmp24_buf[800*480*3]={0};
char bmp32_buf[800*480*4]={0};
char show_buf[800*480*4]={0};
lseek(bmp_begin, 54, SEEK_SET);
read(bmp_begin, bmp24_buf, 800*480*3);
for (int i = 0, j = 0; i < 800 * 480 * 4; i += 4, j += 3) {
bmp32_buf[i + 2] = bmp24_buf[j + 2];
bmp32_buf[i + 1] = bmp24_buf[j + 1];
bmp32_buf[i] = bmp24_buf[j];
}
for(int y=0;y<480;y++){
for (int x = 0; x < 800*4; x++) {
show_buf[800 * 4 * y + x] = bmp32_buf[800 * 4 * (479 - y) + x];
}
}
write(lcd, show_buf, 800*480*4);
}
void flashLed();
void flashLed(int s) {
int fd;
fd = open("/dev/Led",O_RDWR);
for (int i = 0; i < s; i++) {
ioctl(fd, LED1, 0);
ioctl(fd, LED2, 0);
ioctl(fd, LED1, 0);
ioctl(fd, LED3, 0);
ioctl(fd, LED4, 0);
sleep(1);
ioctl(fd, LED1, 1);
ioctl(fd, LED2, 1);
ioctl(fd, LED3, 1);
ioctl(fd, LED4, 1);
sleep(1);
}
}
void brushLcd();
void brushLcd(int lcd, long color) {
unsigned char* FB = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd, 0);
//添加我们的RGB逻辑代码
for (int i=0; i<480; i++){
for(int j=0;j<800;j++){
memcpy(FB+ 4*j+800*4*i,&color,4);
}
}
munmap(FB,800*480*4);
}
int main(int argc, char* argv[]) {
int fd;
fd = open("/dev/Led", O_RDWR);
int lcd = open("/dev/fb0", O_RDWR);
int open_bmp=open("./1/bmp", O_RDWR);
long red=0xFF0000, green=0x008000,yellow=0xFFFF00;
/* 初始化所有设备(LED全灭、LCD屏幕加载一张图片(画板自己画一张),写上开始标识)
*/
openorcloseLed(1);
loadbmp(open_bmp);
//四个灯一起闪烁3次: (亮-灭) *3
flashLed(3);
/*当闪烁完毕后,屏幕刷成绿色,同时灯常亮5秒*/
brushLcd(lcd, green);
openorcloseLed(0);
sleep(5);
/*当常亮5s结束后,屏幕刷成黄色,同时开始闪烁5次。*/
brushLcd(lcd,yellow);
flashLed(5);
/*当闪烁完毕后,屏幕刷成红色,灯全灭。等待3s*/
brushLcd(lcd, red);
openorcloseLed(1);
sleep(3);
/*等待结束后加装一张图片,写上结束标识
*/
printf("%d",lcd);
loadbmp(open_bmp);
printf("%d",lcd);
openorcloseLed(1);//LED全灭
//sleep/usleep;
close(lcd);
close(fd);
return 0;
}