微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > ZedBoard上的点灯签名实验(六)驱动开机自启动及OLED签名

ZedBoard上的点灯签名实验(六)驱动开机自启动及OLED签名

时间:02-10 来源:与非网 点击:

写好了驱动,也就是留好了API的接口,接下来就可以在应用层面上调用API接口,从而实现对LED的操作了。为此我们要做一个准备工作,我们希望驱动开机自动加载,省去手动执行insmod命令,从而直接进入应用程序。开机自启动的方法,官方Zynq Geek和网友蓝兔子 都有很好的介绍。基本思路就是,先解压文件系统ramdisk8M.image.gz, 然后修改其中的/etc/init.d/rcs, 加入挂载和加载命令
mount /dev/mmcblk0p1 /mnt
insmod /mnt/myled.ko

然后再重新打包,替换掉SD卡上原来的ramdis8M.image.gz文件。这样上电后,系统就可以自动运行以上2条命令了。具体的做法如下:
把SD卡从Zedboard上拔下,插入PC上,SD卡自动加载到/media/ZED_BOOT, 然后把ramdisk8.image.gz, 拷到一个文件夹,比如/tmp, 命令为 cp /media/ZED_BOOT/ramdisk8M.image.gz /tmp, 然后到/tmp下解压, gunzip ramdisk8M.image.gz 得到ramdisk8M.image, 挂载ramdisk8M.image到目录/mnt, 命令mout -o loop ramdisk8M.image /mnt, 然后到/mnt目录下,找到 etc/init.d/rcS, 使用gedit 打开rcS, 命令为gedit rcS, 在文档最后加入上述2条命令。然后卸载, umount -l /mnt, 回到/tmp目录,命令cd /tmp, 重新打包, 命令gzip ramdisk8M.image,得到新的ramdisk8M.image.gz, 把他拷到SD卡上,覆盖原来的ramdisk8M.image.gz. 重新上电,效果如下图

可以看到2条命令已经自动执行了,驱动myled.ko已经自动加载了。当然,开机自启动也可以在编译内核的时候,通过修改内核Makefile达到目的,其实还是这样方便些。
再说一下,OLED签名, 就是让OLED显示自定义的图案或者文字,要做到这个事情,当然第一步就是要研究一下OLED驱动(附件),oled_driver_gpio.txt, 说实在的,这个驱动我没有仔细研究过,给Zedboard上电,一会后就会看到Digilent的logo了,这说明Digilent至少是设置好了开机自动加载驱动,那么我们打开ramdisk8M.image中的文件 etc/init.d/rcS 看看有什么内容是和OLED相关的,我们看到load_oled, rcS是一个shell脚本,那么load_oled应该是一个可执行文件,为了要找到他,我们先看环境变量,命令gedit /etc/profile, 我们看到
export PATH=/sbin:/usr/sbin:/bin:/usr/bin
那就挨个找吧,在目录/usr/bin中, 我们看到load_oled和unload_oled两个脚本,试着打开看看,gedit load_oled, 里边是一个shell脚本,
#!/bin/sh
insmod /lib/modules/`uname -r`/pmodoled-gpio.ko;

if [ -c /dev/zed_oled ]; then
cat /root/logo.bin > /dev/zed_oled;
fi;
这就很明白了,/dev/zed_oled是驱动的API接口,把/root/logo.bin输入到接口,OLED就显示logo.bin,那么,接下来的关键就是制作二进制文件.bin或者怎么样把图片或者文字转化成二进制了,这个其实并不容易,网上说,很多软件可以做到,但是我试过不下5种软件,都行不通。最后,在官博()上看到网友发了这样一段程序,
#include
#include
#define WIDTH 128
#define HEIGHT 32
#define SHORT_LENGTH 16
#define BYTE_LENGTH 8
// Name of defined image
#define NAME line_bits
// Filename to write to
#define FILENAME "line_bits.bin"
// Invert image
#define INVERT 0
staTIc unsigned short line_bits[] = {
0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff };
void printDisplay(unsigned short * display){
int i,j;
for( i=0; i for( j=0; j if(display[i*WIDTH+j] != 0)
printf("X");
else
printf(" ");
}
printf("\n");
}
printf("\n");
}
int write_to_file(unsigned short * display, char * filename){
FILE * fp;
fp = fopen(filename,"w");
if (fp < 3)
return -1;
int i,j,k;
unsigned char tmp;
for( i=0; i for( j=(WIDTH-1); j>=0; j--){
tmp = 0;
for( k=0; k tmp = tmp+(display[(i+k)*WIDTH+j] << k);
}
fwrite(&tmp,1,1,fp);
}
}
fclose(fp);
return 0;
}
unsigned short * expandBitMap(unsigned short * bits, unsigned short * display){
int i,j;
for(i = 0; i<(WIDTH*HEIGHT/SHORT_LENGTH); i++){
for(j=0; j display[i*SHORT_LENGTH + j] = (bits[i] & (1 << j)) >> j;
if(INVERT == 1){
if( display[i*SHORT_LENGTH + j] == 0)
display[i*SHORT_LENGTH + j] = 1;
else
display[i*SHORT_LENGTH + j] = 0;
}
}
}
return display;
}
int main(){
unsigned short * display = malloc(2*WIDTH*HEIGHT);
display = expandBitMap(NAME,display);
printDisplay(display);
write_to_file(display,FILENAME);
free(display);
return 0;
}
这段程序的目的,就是把 line_bits[]制成二进制文件供OLED读取, line_bits[] 共计128x32, 512Byte。我用笨办法一个个pixel修改出了TUHH的logo,如图.
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xffff, 0x0f0f, 0xf000, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0xffff, 0x0f0f, 0xf000, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0xffff, 0x0f0f, 0xf000, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0xffff, 0x0f0f, 0xf000, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0x0f00, 0x0f00, 0xf000, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0x0f00, 0x0f00, 0xf000, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0x0f00, 0x0f00, 0xf000, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0x0f00, 0x0f00, 0xf000, 0xfff0, 0xf0ff, 0xffff, 0x0000, 0x0000,
0x0f00, 0x0f00, 0xf000, 0xfff0, 0xf0ff, 0xffff, 0x0000, 0x0000,
0x0f00, 0x0f00, 0xf000, 0xfff0, 0xf0ff, 0xffff, 0x0000, 0x0000,
0x0f00, 0x0f00, 0xf000, 0xfff0, 0xf0ff, 0xffff, 0x0000, 0x0000,
0x0f00, 0x0f00, 0xf000, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0x0f00, 0xff00, 0xffc3, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0x0f00, 0xf000, 0x0fff, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0x0f00, 0xf000, 0x0fff, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0x0f00, 0x0000, 0x00ff, 0x00f0, 0xf0f0, 0xf000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top