寫好了驅(qū)動,也就是留好了API的接口,接下來就可以在應(yīng)用層面上調(diào)用API接口,從而實現(xiàn)對LED的操作了。為此我們要做一個準(zhǔn)備工作,我們希望驅(qū)動開機自動加載,省去手動執(zhí)行insmod命令,從而直接進入應(yīng)用程序。開機自啟動的方法,官方Zynq Geek和網(wǎng)友藍(lán)兔子 都有很好的介紹?;舅悸肪褪?,先解壓文件系統(tǒng)ramdisk8M.image.gz, 然后修改其中的/etc/init.d/rcs, 加入掛載和加載命令
mount /dev/mmcblk0p1 /mnt
insmod /mnt/myled.ko
然后再重新打包,替換掉SD卡上原來的ramdis8M.image.gz文件。這樣上電后,系統(tǒng)就可以自動運行以上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條命令已經(jīng)自動執(zhí)行了,驅(qū)動myled.ko已經(jīng)自動加載了。當(dāng)然,開機自啟動也可以在編譯內(nèi)核的時候,通過修改內(nèi)核Makefile達(dá)到目的,其實還是這樣方便些。
再說一下,OLED簽名, 就是讓OLED顯示自定義的圖案或者文字,要做到這個事情,當(dāng)然第一步就是要研究一下OLED驅(qū)動(附件),oled_driver_gpio.txt, 說實在的,這個驅(qū)動我沒有仔細(xì)研究過,給Zedboard上電,一會后就會看到Digilent的logo了,這說明Digilent至少是設(shè)置好了開機自動加載驅(qū)動,那么我們打開ramdisk8M.image中的文件 etc/init.d/rcS 看看有什么內(nèi)容是和OLED相關(guān)的,我們看到load_oled, rcS是一個shell腳本,那么load_oled應(yīng)該是一個可執(zhí)行文件,為了要找到他,我們先看環(huán)境變量,命令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是驅(qū)動的API接口,把/root/logo.bin輸入到接口,OLED就顯示logo.bin,那么,接下來的關(guān)鍵就是制作二進制文件.bin或者怎么樣把圖片或者文字轉(zhuǎn)化成二進制了,這個其實并不容易,網(wǎng)上說,很多軟件可以做到,但是我試過不下5種軟件,都行不通。最后,在官博()上看到網(wǎng)友發(fā)了這樣一段程序,
#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 < 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
效果圖
評論
查看更多