先上代碼
unsigned nlcmVendorSize;void *plcmVendorID; plcmVendorID =smem_get_entry(SMEM_LCM_VENDOR_ID, &nlcmVendorSize); printk(KERN_INFO"\n[LCD_COMP]plcmVendorID=%d\n",*((uint32*)plcmVendorID)); printk(KERN_INFO"[LCD_COMP]Default lcm_vedor=%d\n",lcm_vedor);if(plcmVendorID!=NULL){/*Shared LCD type is available*/if( *((uint32*)plcmVendorID)>LCM_VENDOR_ID_MIN && *((uint32*)plcmVendorID)<LCM_VENDOR_ID_MAX){if(*((uint32*)plcmVendorID)==LCM_VENDOR_ID_CHENXING){lcm_vedor=LCM_VENDOR_ID_CHENXING;printk(KERN_INFO"[LCD_COMP]LCM is ChenXing\n");}else if(*((uint32*)plcmVendorID)==LCM_VENDOR_ID_DJN){lcm_vedor=LCM_VENDOR_ID_DJN;printk(KERN_INFO"[LCD_COMP]LCM is DJN\n");}}elseprintk(KERN_INFO"[LCD_COMP]Select default lcm\n");//else select default lcm}else{printk(KERN_INFO"[LCD_COMP]Read SMEM_LCM_VENDOR_ID Fail, Select deault LCM\n");//select default lcm}printk(KERN_INFO"[LCD_CMOP]lcm_vedor=%d\n\n",lcm_vedor);
做lcd“相容”時,由於lcd的spi沒有接sdo,無法從ic讀資料,於是只能通過配置不同的efs來做相容。要從arm9端通過共用記憶體介面讀資料,出錯處理比較多,如可能讀不到,可能讀錯,都需要考慮到。添加的代碼如上,經測試發現了個致命的問題:如果modern端efs沒有配置,導致無法開機!(雖然arm9和arm11端代碼正常應該一致,為了防止人為疏忽,以防萬一,還得尋找原因:-( )。最終找到原因,差點吐血:
plcmVendorID =smem_get_entry(SMEM_LCM_VENDOR_ID, &nlcmVendorSize);讀取失敗,返回0,此時plcmVendorID=0,即此指標不指向任何變數,
千不該萬不該,為了調試方便,我在緊隨其後加了句測試代碼:
printk(KERN_INFO"\n[LCD_COMP]plcmVendorID=%d\n",*((uint32*)plcmVendorID))
如果plcmVendorID為0這個指標根本不會指向任何變數,但prink卻要列印其指向變數的值!!??
解決方案,將這句printk下移放入if(plcmVendorID!=NULL)中,即只有這個指標有指向時才列印!