写好了驱动,也就是留好了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();
}
printf();
}
int write_to_file(unsigned short * display, char * filename){
file * fp;
fp = fopen(filename,w);
if (fp =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;
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
效果图
交换器市场思科芯片能突出重围吗
开启嵌入式智能视觉应用新时代
iphone8最新消息:最新iPhone8概念图曝光,重拾儿时的记忆
采用 LoRa 完善其通信技术,对于亚马逊来说意味着什么?
如何推动数字经济与能源行业的深度融合发展
ZedBoard上的点灯签名实验(六)驱动开机自启动及OLED签名
基于NB-IOT技术的冷藏车无线监控系统
思特威正式推出两款AIoT及安防应用2MP及3MP图像传感器产品
电涡流式传感器的结构和工作原理
试验变压器容量的计算_试验变压器的分类
高重复率Vpp编程电源电路原理图
华为5G随行WiFi Pro可以实现不换5G手机照样体验5G网络
任正非在科技大会上的演讲:以创新为核心竞争力,为祖国百年科技振兴而奋斗
南孚推出一款10000毫安便携充电宝 体积比iPhoneX还小一圈
用MR16LED替代1W至5WLED驱动器设计参考
三坐标测针有哪些类型
无刷直流电机的转速和什么有关
RTX 30系列显卡有望再创16nm帕斯卡显卡辉煌
苹果打算降低iPad入门门槛
利用一款准确的ADC来对一个准确的传感器进行数字化处理