1.增加platform
在项目需求中需要控制硬件的风扇,马达,蜂鸣器,LED,在驱动编写时,是将其分开编写的,每个部件分别编写了字符设备驱动。
在应用层程序编写过程中,需要获取较多的文件描述符,其实应该使用platform设备平台的思想来编写,在具体实现中在ioctl里对应用层命令switch判断
设备树文件添加
myplatform{
compatible = "hqyj,myplatform";
led1 = <&gpioe 10 0>;
led2 = <&gpiof 10 0>;
led3 = <&gpioe 8 0>;
fan = <&gpioe 9 0>;
motor = <&gpiof 6 0>;
buzzer = <&gpiob 6 0>;
};
2.应用层程序spi线程显示代码优化
原代码
void *pthread_spi(void *arg)
{
msg_t *recvmsg = (msg_t *)arg;
int fd;
fd = open("/dev/myspi", O_RDWR);
if (-1 == fd)
{
ERR_MSG("open");
return NULL;
}
while (1)
{
if (recvmsg->type & SPI_EN)
{
if (recvmsg->type & TEMP)
{
unsigned char str[8] = {
[0] = ledpos[0],
[1] = leddata[(int)temp / 10 % 10],
[2] = ledpos[1],
[3] = leddata[(int)temp % 10] | 0x80,
[4] = ledpos[2],
[5] = leddata[(int)(temp * 10) % 10],
[6] = ledpos[3],
[7] = leddata[(int)(temp * 100) % 10],
};
ioctl(fd, IO_SPI_WRITE, str);
}
else if (recvmsg->type & HUMI)
{
unsigned char str[8] = {
[0] = ledpos[0],
[1] = leddata[(int)humi / 10 % 10],
[2] = ledpos[1],
[3] = leddata[(int)humi % 10] | 0x80,
[4] = ledpos[2],
[5] = leddata[(int)(humi * 10) % 10],
[6] = ledpos[3],
[7] = leddata[(int)(humi * 100) % 10],
};
ioctl(fd, IO_SPI_WRITE, str);
}
else if (recvmsg->type & SPI_SET)
{
unsigned char str[8] = {
[0] = ledpos[0],
[1] = leddata[recvmsg->spi_set / 1000],
[2] = ledpos[1],
[3] = leddata[recvmsg->spi_set / 100 % 10],
[4] = ledpos[2],
[5] = leddata[recvmsg->spi_set / 10 % 10],
[6] = ledpos[3],
[7] = leddata[recvmsg->spi_set % 10],
};
ioctl(fd, IO_SPI_WRITE, str);
}
}
else if (recvmsg->type & SPI_UN)
{
ioctl(fd, IO_SPI_ZERO);
}
}
}
优化后:
void *pthread_spi(void *arg)
{
msg_t *recvmsg = (msg_t *)arg;
unsigned char str[8] = {ledpos[0], 0, ledpos[1], 0, ledpos[2], 0, ledpos[3], 0};
int fd = open("/dev/myspi", O_RDWR);
if (-1 == fd)
{
ERR_MSG("open");
return NULL;
}
while (1)
{
if (recvmsg->type & SPI_EN)
{
if (recvmsg->type & TEMP)
{
str[1] = leddata[(int)temp / 10 % 10];
str[3] = leddata[(int)temp % 10] | 0x80;
str[5] = leddata[(int)(temp * 10) % 10];
str[7] = leddata[(int)(temp * 100) % 10];
ioctl(fd, IO_SPI_WRITE, str);
}
else if (recvmsg->type & HUMI)
{
str[1] = leddata[(int)humi / 10 % 10];
str[3] = leddata[(int)humi % 10] | 0x80;
str[5] = leddata[(int)(humi * 10) % 10];
str[7] = leddata[(int)(humi * 100) % 10];
ioctl(fd, IO_SPI_WRITE, str);
}
else if (recvmsg->type & SPI_SET)
{
str[1] = leddata[recvmsg->spi_set / 1000];
str[3] = leddata[recvmsg->spi_set / 100 % 10];
str[5] = leddata[recvmsg->spi_set / 10 % 10];
str[7] = leddata[recvmsg->spi_set % 10];
ioctl(fd, IO_SPI_WRITE, str);
}
}
else if (recvmsg->type & SPI_UN)
{
str[1] = 0x00;
str[3] = 0x00;
str[5] = 0x00;
str[7] = 0x00;
ioctl(fd, IO_SPI_ZERO,str);
}
}
}
在简洁方面,进行优化