第一篇:S3C2410 LCD驅(qū)動學(xué)習(xí)心得-6
三
實(shí)驗(yàn)過程與結(jié)果 1.Linux 源代碼的修改
首先修改arch/arm/mach-smdk2410.c文件,加入以下代碼。static struct s3c2410fb_mach_info smdk2440_lcd_cfg __initdata = {.regs = {
.lcdcon1 = S3C2410_LCDCON1_TFT16BPP |
S3C2410_LCDCON1_TFT |
S3C2410_LCDCON1_CLKVAL(7),.lcdcon2 = S3C2410_LCDCON2_VBPD(4)|
S3C2410_LCDCON2_LINEVAL(319)|
S3C2410_LCDCON2_VFPD(1)|
S3C2410_LCDCON2_VSPW(1),.lcdcon3 = S3C2410_LCDCON3_HBPD(26)|
S3C2410_LCDCON3_HOZVAL(239)|
S3C2410_LCDCON3_HFPD(30),.lcdcon4 = S3C2410_LCDCON4_HSPW(13)|
S3C2410_LCDCON4_MVAL(13),.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP, },.lpcsel =((0xCE6)& ~7)| 1<<4,.width = 240,.height = 320,.xres = {
.min = 240,.max = 240,.defval = 240,},.yres = {
.min = 320,.max = 320,.defval = 320,},.bpp = {
.min = 16,.max = 16,.defval = 16,}, };在函數(shù)smdk2410_machine_init()函數(shù)中加入LCD的初始化代碼,見下 static void __init smdk2410_machine_init(void){ s3c24xx_fb_set_platdata(&smdk2440_lcd_cfg);smdk_machine_init();} 2.編譯內(nèi)核,產(chǎn)生zImage文件,放入tftp目錄下。
3.在nfs的dev目錄下建立FrameBuffer的設(shè)備節(jié)點(diǎn),使用命令:
mknod fb0 c 29 0 4.啟動開發(fā)板,加載內(nèi)核和文件系統(tǒng)。5.編寫LCD的應(yīng)用程序,程序見附錄。
6.采用arm-linux-gcc 編譯應(yīng)用程序,產(chǎn)生可執(zhí)行文件,放入nfs目錄中。7.在開發(fā)板上運(yùn)行編譯好的可執(zhí)行文件,便可。
8.下圖是BMP位圖顯示程序,在S3C2410上的運(yùn)行結(jié)果。
四
實(shí)驗(yàn)心得體會
1. LCD驅(qū)動的主要問題是沒有LCD屏的文檔,我們找不到它的那些參數(shù)值,后來只能參照Linux源碼里面的其他LCD屏的參數(shù)進(jìn)行實(shí)驗(yàn)。
2. 在驅(qū)動差錯的過程中,我們采用跟蹤打印的方法進(jìn)行調(diào)試。剛開始的時候,內(nèi)核打印出一行找不到LCD設(shè)備。我們定位到輸出這行提示的代碼處,進(jìn)行反向跟蹤。發(fā)現(xiàn)傳給函數(shù)的設(shè)備指針為空,于是往上排查,終于發(fā)現(xiàn)源代碼中沒有定義LCD的設(shè)備信息。于是驅(qū)動問題也就順利解決了。
3. 原來一直以為,只要LCD驅(qū)動工作正常了,內(nèi)核起來的時候,液晶屏?xí)@示出Logo。當(dāng)時搞了很久一直沒有,還以為是驅(qū)動的問題。后來隨便寫了一個LCD應(yīng)用程序,竟然能用。4. 在調(diào)試過程應(yīng)用程序中發(fā)現(xiàn),在讀取文件頭的時候,如果直接定義一個bitmapfileheader為它動態(tài)分配內(nèi)存:
*bmph=(bitmapfileheader*)malloc(sizeof(bitmapfileheader));然后用fread((char*)bmph,sizeof(bitmapfileheader),1,f)把文件頭一次性讀出來,讀出來的文件頭是錯誤的,經(jīng)過調(diào)試發(fā)現(xiàn)原因是bitmapfileheader這個結(jié)構(gòu)體中的type屬性原本應(yīng)該占2字節(jié),但是被編譯器在分配內(nèi)存的時候進(jìn)行了內(nèi)存對齊的優(yōu)化,給他分配了4個字節(jié)的空間,造成讀文件的錯誤。因此在編程中要特別注意內(nèi)存對齊的影響。typedef struct { WORD
type;(被優(yōu)化)DWORD bfsize;DWORD reserved;DWORD offbits;} bitmapfileheader;5. 在嵌入式應(yīng)用程序的移植過程中,我們原來認(rèn)為ARM和PC機(jī)大小尾順序是不同的,因此在應(yīng)用程序中,也對這個差別進(jìn)行了處理。當(dāng)時,在調(diào)試過程中發(fā)現(xiàn),PC機(jī)程序可以直接移植到ARM上,不需要任何改動。但是我們的程序,的確存在會產(chǎn)生大小尾問題代碼(在使用fread()讀入時)。這究竟是為什么?有人說,ARM是可以設(shè)置大小尾順序的。后來這個問題也沒有深究下去。
五
參考文獻(xiàn)
(1)嵌入式系統(tǒng)設(shè)計(jì)與應(yīng)用開發(fā):鄭靈翔.北京:北京航天航空大學(xué)出版社 2006
本篇文章來源于 Linux公社網(wǎng)站(
第二篇:學(xué)習(xí)心得6
學(xué)習(xí)心得
為扎實(shí)推進(jìn)素質(zhì)教育深入開展加強(qiáng)中小學(xué)法制教育的針對性和時效性,認(rèn)真學(xué)習(xí)了《貴州省中小學(xué)學(xué)科滲透法制教育》。在學(xué)習(xí)中我受益很多。
一、學(xué)科法制教育滲透的重要性。青少年犯罪事件時有發(fā)生而且呈上升趨勢及低齡化、危害程度嚴(yán)峻。加強(qiáng)中小學(xué)的法制教育具有必要性、和緊迫性是預(yù)防青少年學(xué)生違法犯罪、引導(dǎo)其健康成長、培養(yǎng)社會主義合格人才的重要舉措。
二、在學(xué)科中尋找法制教育的契機(jī)。法制教育的滲透,不應(yīng)只局限在課堂里或書本上,對學(xué)生進(jìn)行法制教育,增強(qiáng)法制觀念,提高法律意識,已經(jīng)是一個刻不容緩的思想教育任務(wù)。教育學(xué)生學(xué)法、守法、用法也是各個學(xué)科中不可忽視的重要方面。有時一個不恰當(dāng)行為,如不守體育規(guī)則、偷拿實(shí)驗(yàn)藥品、網(wǎng)上亂必貼子等即成為法制教育的契機(jī)。某種意義上講養(yǎng)成即是法制行為養(yǎng)成。所以這類課程其實(shí)有許多優(yōu)勢。
三、情境教學(xué)法。創(chuàng)設(shè)法制教育滲透點(diǎn)。教學(xué)過程中綜合運(yùn)用多種教學(xué)手段,積極創(chuàng)設(shè)情境,使學(xué)生在身臨其境、在心感其情的狀態(tài)中,達(dá)到主動地學(xué)習(xí)歷史知識,提高法律知識的能力。上課、作業(yè)布置與批改、練習(xí)、課外輔導(dǎo)、考試、實(shí)踐活動等環(huán)節(jié)都蘊(yùn)藏著法制教育契機(jī),都可以滲透法制教育就看善不善用會不會用利用得是否有智慧。當(dāng)然也不要走極端,處處和法制問題掛鉤。三句話不離法律招致學(xué)生反感。
四、法制教育要體現(xiàn)對學(xué)生的尊重 尊重學(xué)生情感、人格。不能把法制教育等同于講法律、敲警鐘、訓(xùn)斥人、借題發(fā)揮、諷刺挖苦。尊重學(xué)生的認(rèn)知能力。法制教育也必需因材施教,必須掌握好度。更要尊重學(xué)生的天性。要提高教學(xué)的趣味性和互動性以深入淺出的方法通俗易懂的語言,生動形象的事例,形式豐富的手段實(shí)施滲透教學(xué)。
學(xué)科教學(xué)法制教育工作,教師要提高思想不斷的學(xué)習(xí)法律、法規(guī)。不斷提高自身的法制素養(yǎng)。知道身邊更多的法律事例,要形成教學(xué)滲透法制教育的習(xí)慣。
第三篇:linux驅(qū)動及g-sensor學(xué)習(xí)心得
目錄
1.MODULE_INIT和MODULE_EXIT..............................................................................................2 2.I2C_DRIVER......................................................................................................................................2 3.LINUX的INPUT子系統(tǒng)..................................................................................................................3 3.1 從驅(qū)動層到核心層.......................................................................................................................3 3.2 事件處理層的處理.......................................................................................................................3 3.3 設(shè)備結(jié)點(diǎn)的創(chuàng)建...........................................................................................................................4 3.4 設(shè)備的注銷和釋放.......................................................................................................................4 4.WORK QUEUE..................................................................................................................................4 5.HAL層開發(fā)........................................................................................................................................5 5.1 HAL_MODULE_INFO_SYM.....................................................................................................5 5.2 對設(shè)備文件的訪問.......................................................................................................................7 6.BMA250功能描述..............................................................................................................................7 6.1 電源管理.......................................................................................................................................7 6.2 操作模式.......................................................................................................................................7 6.3 電源模式.......................................................................................................................................8 6.4 SENSOR數(shù)據(jù)..................................................................................................................................8 6.4.1 加速度....................................................................................................................................8 6.4.2 溫度........................................................................................................................................8 6.5 偏移補(bǔ)償.......................................................................................................................................9 6.5.1 慢補(bǔ)償....................................................................................................................................9 6.5.2 快補(bǔ)償....................................................................................................................................9 6.5.3 手動補(bǔ)償..............................................................................................................................10 6.5.4 內(nèi)嵌校準(zhǔn)..............................................................................................................................10 6.6 非易失性存儲器.........................................................................................................................10 6.7 中斷控制器.................................................................................................................................10 6.7.1 new data中斷.......................................................................................................................11 6.7.2 slope中斷.............................................................................................................................11 6.7.3 tap中斷.................................................................................................................................12 6.7.4 orientation中斷....................................................................................................................12 6.7.5 flat中斷................................................................................................................................14 6.7.6 low-g中斷.............................................................................................................................15 6.7.7 high-g中斷...........................................................................................................................15 7.SENSOR驅(qū)動開發(fā)步驟...................................................................................................................15 附錄 BMA250寄存器表......................................................................................................................17 linux驅(qū)動及g-sensor學(xué)習(xí)心得
通過對g-sensor driver code的研究學(xué)習(xí),我對linux設(shè)備驅(qū)動開發(fā)和g-sensor有了一定的了解,現(xiàn)將學(xué)習(xí)所得歸納如下。
1.module_init和module_exit
在pd318 project的g-sensor驅(qū)動程序bma250.c中,首先包含了兩個頭文件
module_init的作用是聲明一個驅(qū)動程序的入口函數(shù),在init.h中可以看到對這個宏的定義如下:
#define module_init(x)__initcall(x);#define __initcall(fn)device_initcall(fn)#define device_initcall(fn)__define_initcall(“6”,fn,6)#define __define_initcall(level,fn,id)static initcall_t __initcall_##fn##id __used __attribute__((__section__(“.initcall” level “.init”)))= fn
如果驅(qū)動程序要以func函數(shù)作為驅(qū)動的入口,則可以這樣聲明:module_init(func)。經(jīng)過上面的宏處理以后,變成__initcall_func6 __used加入到內(nèi)核映射的“.initcall”區(qū)。內(nèi)核加載的時候,會搜索“.initcall”區(qū)內(nèi)的所有條目,并按優(yōu)先級加載它們。通過module_init聲明的驅(qū)動程序優(yōu)先級為6,優(yōu)先級越小越先加載。
對于驅(qū)動入口函數(shù)func,一般要加上__init屬性,這個宏告訴編譯器如果這個模塊被編譯到內(nèi)核,則把這個函數(shù)放到(.init.text)段。而module_exit用于聲明驅(qū)動程序的出口,對于驅(qū)動出口函數(shù),一般要加上__exit屬性,這個宏與__init類似,如果驅(qū)動被編譯進(jìn)內(nèi)核,則__exit宏會忽略清理函數(shù)。
在內(nèi)核初始化后期,所有帶__init屬性的函數(shù)會被放在同一個section里,在用完之后,一次性釋放掉整個section。當(dāng)函數(shù)初始化完成后,這個區(qū)域可以被清除掉以節(jié)約系統(tǒng)內(nèi)存。
2.i2c_driver 在pd318 project中,g-sensor的PS pin連接VDDIO,操作模式采用帶I2C接口的general mode,在bma250.c中可以了解到bma250的i2c_driver的結(jié)構(gòu)定義如下:
struct i2c_driver bma250_driver = {.driver = {
.owner = THIS_MODULE,.name = SENSOR_NAME, },.id_table = bma250_id,.probe = bma250_probe,.remove };= bma250_remove, 在這個結(jié)構(gòu)中,定義了驅(qū)動所屬module、驅(qū)動名、驅(qū)動的id表、驅(qū)動初始化以及移除接口??梢酝ㄟ^i2c_add_driver將sensor driver添加進(jìn)module中,通過i2c_del_driver將driver移除。
3.linux的input子系統(tǒng)
Linux系統(tǒng)提供了input子系統(tǒng),可以用以實(shí)現(xiàn)系統(tǒng)中大多數(shù)輸入設(shè)備的設(shè)備驅(qū)動,pd318中g(shù)-sensor的設(shè)備驅(qū)動就是通過它來實(shí)現(xiàn)的。
input子系統(tǒng)由核心層、驅(qū)動層和事件處理層三部分組成。當(dāng)輸入設(shè)備產(chǎn)生了一個輸入事件時,由驅(qū)動層對事件加以識別,然后提交給核心層,核心層根據(jù)事件的類型將事件交給事件處理層處理,事件處理層將處理結(jié)果再反饋給用戶。其中核心層由/drivers/input/input.c及相關(guān)頭文件實(shí)現(xiàn),對下提供了設(shè)備驅(qū)動的接口,對上提供了事件處理層的編程接口。這樣,一個輸入設(shè)備的輸入過程可以分離為獨(dú)立的兩部分:驅(qū)動層到核心層,核心層到事件處理層,整個鏈路的這兩部分的接口的創(chuàng)建是獨(dú)立的。
3.1 從驅(qū)動層到核心層
驅(qū)動層負(fù)責(zé)和底層的硬件設(shè)備打交道,將底層硬件對用戶輸入的響應(yīng)轉(zhuǎn)換為標(biāo)準(zhǔn)的輸入事件以后再向上發(fā)送給核心層。
驅(qū)動層先要調(diào)用input_allocate_device接口來分配一個設(shè)備,對設(shè)備進(jìn)行一些屬性賦值,如設(shè)備名、總線類型、響應(yīng)事件類型及事件參數(shù)、驅(qū)動數(shù)據(jù)等等,然后通過input_register_device函數(shù)向input子系統(tǒng)中注冊所要驅(qū)動的輸入設(shè)備。對于g-sensor來說,驅(qū)動需要響應(yīng)EV_ABS事件,該事件需要向核心層提供一個絕對坐標(biāo),事件參數(shù)ABS_X、ABS_Y、ABS_Z分別對應(yīng)g-sensor在x、y、z軸上的偏移量。當(dāng)g-sensor發(fā)生坐標(biāo)變化時,驅(qū)動程序需要從相應(yīng)寄存器中讀出偏移量,然后通過input_report_abs接口上報(bào)給input子系統(tǒng),由input子系統(tǒng)負(fù)責(zé)將事件及參數(shù)變化發(fā)送給事件處理層處理。
3.2 事件處理層的處理
驅(qū)動層只是把輸入設(shè)備注冊到input子系統(tǒng)中,在驅(qū)動中的code中并不創(chuàng)建設(shè)備結(jié)點(diǎn)。應(yīng)用程序用來與設(shè)備打交道的設(shè)備結(jié)點(diǎn)的創(chuàng)建由事件處理層調(diào)用核心層的函數(shù)來實(shí)現(xiàn)。而對于常用輸入設(shè)備(如mouse、keyboard、joystick等),在創(chuàng)建具體的設(shè)備結(jié)點(diǎn)之前,事件處理層需要先通過input_register_handler注冊一類設(shè)備的輸入事件處理函數(shù)及相關(guān)接口。以鼠標(biāo)事件處理為例,mouse input_handler定義如下:
static struct input_handler mousedev_handler = {.event = mousedev_event, //向系統(tǒng)報(bào)告input事件,系統(tǒng)通過read方法讀取
.connect = mousedev_connect, //和input_dev匹配后調(diào)用connect構(gòu)建
.disconnect = mousedev_disconnect,.fops = &mousedev_fops, //event設(shè)備文件的操作方法.minor = MOUSEDEV_MINOR_BASE, //次設(shè)備號基準(zhǔn)值
.name = “mousedev”,.id_table = mousedev_ids, //匹配規(guī)則 };
在linux中沒有對g-sensor事件處理register的通用標(biāo)準(zhǔn)定義,對于這類事件,事件處理層會統(tǒng)一地當(dāng)作evdev事件處理,為設(shè)備創(chuàng)建一個對應(yīng)的設(shè)備文件,在HAL層可以通過open該設(shè)備文件來實(shí)現(xiàn)與底層的通信。
3.3 設(shè)備結(jié)點(diǎn)的創(chuàng)建
向input子系統(tǒng)注冊一個硬件設(shè)備后,在input_register_handler中調(diào)用已經(jīng)注冊的所有類型的input handler的connect函數(shù),每一個connect函數(shù)會根據(jù)注冊設(shè)備所支持的事件類型判斷是否與自己有關(guān),如果有關(guān)就調(diào)用input_register_minor創(chuàng)建一個具體的設(shè)備結(jié)點(diǎn)。
此外,如果已經(jīng)注冊了一些硬件設(shè)備,此后再注冊一類新的input handler,則同樣會對所有已注冊的設(shè)備調(diào)用新的input handler的connect函數(shù)以確定是否需要創(chuàng)建新的設(shè)備結(jié)點(diǎn)。
3.4 設(shè)備的注銷和釋放
在remove driver同時注銷掉所注冊的input設(shè)備,通過input_unregister_device函數(shù)注銷設(shè)備,通過input_free_device接口釋放設(shè)備資源。
4.work queue 在pd318 bma250.c的bma25_probe函數(shù)中可以看到,對于g-sensor狀態(tài)的獲取和report是通過linux的work queue機(jī)制來實(shí)現(xiàn)的。這里可以看到一個宏:INIT_DELAYED_WORK。這個宏被定義在/linux/workqueue.h中,具體定義如下:
#define INIT_WORK(_work, _func)
do {
__INIT_WORK((_work),(_func), 0);} while(0)
#define INIT_DELAYED_WORK(_work, _func)
do {
INIT_WORK(&(_work)->work,(_func));
init_timer(&(_work)->timer);
} while(0)
從這個定義中可以看到,INIT_DELAYED_WORK就是帶有timer的INIT_WORK,而INIT_WORK所做的事情就是初始化一個工作,但是并不馬上執(zhí)行,需要將來某個時刻去觸發(fā)執(zhí)行。INIT_DELAYED_WORK(INIT_WORK)需要兩個參數(shù),一個是struct delayed_work(struct work_struct)結(jié)構(gòu)體,一個是一個函數(shù)指針_func。這個初始化實(shí)際上就是為一個struct work_struct結(jié)構(gòu)體綁定一個函數(shù)。在/linux/workqueue.h中可以看到struct work_struct的定義如下:
struct work_struct { atomic_long_t data;#define WORK_STRUCT_PENDING 0 /* T if work item pending execution */ #define WORK_STRUCT_STATIC 1 /* static initializer(debugobjects)*/ #define WORK_STRUCT_FLAG_MASK(3UL)#define WORK_STRUCT_WQ_DATA_MASK(~WORK_STRUCT_FLAG_MASK)struct list_head entry;work_func_t func;#ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map;#endif };
在這個結(jié)構(gòu)體中有一個成員函數(shù)func,初始化的目的就是使這個func指向INIT_WORK的第二個參數(shù)_func。以后調(diào)用schedule_delayed_work(schedule_work)時,只要傳遞struct delayed_work(struct work_struct)結(jié)構(gòu)體參數(shù)即可,不需要再傳遞_func。這是因?yàn)椋幚韜ork的線程實(shí)際上跑的是一個死循環(huán),有事情就處理,沒事情就睡眠,而schedule_delayed_work(schedule_work)的作用就是喚醒這個線程。
INIT_DELAYED_WORK與schedule_delayed_work,INIT_WORK與schedule_work是對應(yīng)著使用的,兩者的區(qū)別就是schedule_work在喚醒線程的同時立刻執(zhí)行_func,而schedule_delayed_work在喚醒線程后delay一段時間再執(zhí)行。bma250.c通過使用INIT_DELAYED_WORK與schedule_delayed_work,實(shí)現(xiàn)g-sensor對不同取樣頻率的支持。
關(guān)于workqueue還有兩個函數(shù),它們是cancel_delayed_work和flush_scheduled_work。cancel_delayed_work的作用是對于一個延遲執(zhí)行的工作而言,在工作還未執(zhí)行的時候就把它給取消掉。而flush_scheduled_work的作用是為了防止有競爭條件的出現(xiàn)。一般在cancel_delayed_work之后都得調(diào)用flush_scheduled_work,函數(shù)會一直等待,直到隊(duì)列中所有工作都被執(zhí)行以后才返回。
5.HAL層開發(fā)
5.1 HAL_MODULE_INFO_SYM HAL層,即硬件抽象層,android層對于硬件的調(diào)用一般通過HAL的方式來完成。要想HAL的編寫方法,首先需要了解HAL的運(yùn)行機(jī)制??碼ndroid源碼,可以發(fā)現(xiàn)android中實(shí)現(xiàn)調(diào)用HAL是通過hw_get_module來實(shí)現(xiàn)的。
int hw_get_module(const char *id, const struct hw_module_t **module);上面的是其函數(shù)原型,id會指定Hardware的id,這是一個字符串,比如sensor的id是#define SENSORS_HARDWARE_MODULE_ID “sensors”。如果找到了對應(yīng)的hw_module_t結(jié)構(gòu)體,會將其指針放入*module中。代碼實(shí)現(xiàn)如下:
for(i=0;i if(i < HAL_VARIANT_KEYS_COUNT){ /* 獲取“ro.hardware”、“ro.product.board”、“ro.board.platform”、“ro.arch”等key的值*/ if(property_get(variant_keys[i], prop, NULL)== 0){ continue; } /* 獲取并訪問HAL動態(tài)鏈接庫 */ snprintf(path, sizeof(path), “%s/%s.%s.so”,HAL_LIBRARY_PATH1, id, prop); if(access(path, R_OK)== 0)break; snprintf(path, sizeof(path), “%s/%s.%s.so”,HAL_LIBRARY_PATH2, id, prop); if(access(path, R_OK)== 0)break; } else { snprintf(path, sizeof(path), “%s/%s.default.so”,HAL_LIBRARY_PATH1, id); if(access(path, R_OK)== 0)break; } } status =-ENOENT;if(i < HAL_VARIANT_KEYS_COUNT+1){ /* 調(diào)用load函數(shù)打開動態(tài)鏈接庫*/ status = load(id, path, module);} 這個函數(shù)的作用,就是獲取動態(tài)鏈接庫并調(diào)用load函數(shù)打開它。再看load函數(shù),可以發(fā)現(xiàn)該函數(shù)中出現(xiàn)了一個宏HAL_MODULE_INFO_SYM_AS_STR。HAL_MODULE_INFO_SYM_AS_STR是硬件模塊在動態(tài)鏈接庫中的標(biāo)志,定義在hardware.h中如下: #define HAL_MODULE_INFO_SYM HMI #define HAL_MODULE_INFO_SYM_AS_STR “HMI” 再去對照一個sensors.app中的代碼: extern “C” const struct sensors_module_t HAL_MODULE_INFO_SYM = { common :{ tag : HARDWARE_MODULE_TAG,version_major : 1,version_minor : 0,id : SENSORS_HARDWARE_MODULE_ID,name : “Bosch sensor module”,author : “Bosch Sensortec”,methods : &sensors_module_methods,dso : NULL,reserved : {}, },get_sensors_list : sensors__get_sensors_list };這里的sensors_module_t結(jié)構(gòu)體的定義為: struct sensors_module_t { struct hw_module_t common; int(*get_sensors_list)(struct sensors_module_t* module,struct sensor_t const** list);};它定義了一個hw_module_t類型的common成員,和獲取sensors list的接口函數(shù)sensors__get_sensors_list。注意,這里的HAL_MODULE_INFO_SYM必須為這個名字,這樣編譯器才會將這個結(jié)構(gòu)體的導(dǎo)出符號變?yōu)椤癏MI”。 從以上分析可以知道,HAL層開發(fā)就是要定義一個hw_module_t結(jié)構(gòu)體,結(jié)構(gòu)體名稱命名為HAL_MODULE_INFO_SYM,然后實(shí)現(xiàn)結(jié)構(gòu)體的相關(guān)內(nèi)容即可。也就是說,HAL模塊的入口地址就是HAL_MODULE_INFO_SYM變量,通過它,我們可以訪問到HAL模塊中所有想要外部訪問到的方法。 5.2 對設(shè)備文件的訪問 在HAL層可以通過訪問3.2節(jié)中evdev.c生成的設(shè)備文件來實(shí)現(xiàn)對硬件設(shè)備的訪問。對于g-sensor來說,要實(shí)現(xiàn)對于sensor的poll、setDelay、activate、close等函數(shù)接口。在poll接口中,程序通過一個循環(huán)去獲取設(shè)備文件中顯示出的sensor的坐標(biāo)變化,在收到EV_SYN事件時,將sensor的坐標(biāo)變化反饋給android系統(tǒng),android對獲取到的狀態(tài)變化作出相應(yīng)的處理。 6.bma250功能描述 6.1 電源管理 VDD :主電源,為所有內(nèi)部模擬/數(shù)字功能塊供電。VDDIO:專為數(shù)字I/O供電的單獨(dú)電源引腳。 6.2 操作模式 General mode :sensor作為外部總線的一個從設(shè)備,可以配置、使用外部中斷引腳INT1和INT2。 Dedicated mode :sensor作為一個獨(dú)立設(shè)備,沒有外部中斷功能,使用內(nèi)部中斷機(jī)制,一次只能夠被指派處理orientation recognition、tap sensing、slope detection三種中斷中的一種。 PS引腳的連接狀態(tài)決定了sensor采用哪種操作模式。PS = GND general mode with SPI interface PS = VDDIO general mode with I2C interface PS = float dedicated mode 6.3 電源模式 bma250具有三種電源模式:normal mode、low-power mode和suspend mode。normal mode :電路全開,整個g-sensor處于正常工作狀態(tài)。 low-power mode :周期性地在睡眠和喚醒狀態(tài)之間切換。睡眠狀態(tài)下,除振蕩器外所有器件不工作;喚醒狀態(tài)下工作在正常狀態(tài)。 suspend mode :包括振蕩器在內(nèi)的整個board處于power down狀態(tài),僅可以讀取寄存器、寫suspend位和softreset寄存器。 三種模式之間可能的狀態(tài)切換如圖1所示。 圖1 電源模式切換圖 6.4 sensor數(shù)據(jù) 6.4.1 加速度 每一個軸上的加速度數(shù)據(jù)都是10個bit,分為兩個寄存器來存儲(MSB :9~2 bit,LSB :1~0 bit)。x、y、z三個軸的加速度數(shù)據(jù)存儲在寄存器0x02~0x07,依次存儲x、y、z軸加速度的LSB、MSB數(shù)據(jù)。 加速度數(shù)據(jù)可以使用兩種不同的數(shù)據(jù)流:unfiltered和filtered。使用哪種數(shù)據(jù)流由0x13寄存器的data_high_bw位決定。 unfiltered :采樣頻率為 2kHz,data_high_bw = 1。filtered : 采樣頻率為帶寬的兩倍,data_high_bw = 0。filtered加速度數(shù)據(jù)帶寬由0x10寄存器的bw位決定。另外,bma250支持四種不同的加速度度量范圍(range),分別為±2g、±4g、±8g和±16g,這由0x0F寄存器的低四位決定。 6.4.2 溫度 由0x08寄存器決定,溫度范圍為-40°C ~ 87.5°C。 6.5 偏移補(bǔ)償 偏移補(bǔ)償就是根據(jù)ADC值對加速度數(shù)據(jù)作出一個補(bǔ)償。不過用于補(bǔ)償?shù)墓布拇嫫鳎╬ublic register)0x38 ~ 0x3D對每個軸用于讀寫補(bǔ)償?shù)闹挥? bit,而內(nèi)部寄存器(internal register)對于每個加速度值都是用10 bit(MSB + LSB)來存儲的。在這之間需要一個轉(zhuǎn)換,補(bǔ)償轉(zhuǎn)換原則如圖2所示。 圖2 8-bit/10-bit補(bǔ)償轉(zhuǎn)換原則圖 從上圖可以看出,根據(jù)設(shè)定的range,公共寄存器的補(bǔ)償值將要對輸出的加速度數(shù)據(jù)作出補(bǔ)償。例如,公共寄存器值為00000001b,從圖2中得到加速度數(shù)據(jù)補(bǔ)償為±7.8mg,對應(yīng)內(nèi)部寄存器為±2 LSB。 bma250支持四種偏移補(bǔ)償方式:慢補(bǔ)償、快補(bǔ)償、手動補(bǔ)償和內(nèi)嵌校準(zhǔn)。對于慢補(bǔ)償和快補(bǔ)償來說,0x37寄存器的offset_target_x、offset_target_y、offset_target_z決定了sensor在x、y、z軸上的目標(biāo)值。而0x36的offset_reset位如果被置為1,則所有的偏移補(bǔ)償寄存器都reset為0。 6.5.1 慢補(bǔ)償 如果連續(xù)一定數(shù)量的采樣加速度大于(小于)0x37寄存器所設(shè)置的目標(biāo)值,偏移補(bǔ)償值寄存器0x38 ~ 0x3D的值減少(增加)4 LSB。加速度數(shù)據(jù)的采樣周期由0x37的cut_off位決定,如果cut_off位為0,采樣周期為8,反之為16。 在x、y、z軸是否采用慢補(bǔ)償分別由寄存器0x36中的hp_x_en、hp_y_en和hp_z_en決定。 6.5.2 快補(bǔ)償 連續(xù)取16個加速度值,計(jì)算出平均值,將這個平均值與0x37寄存器所設(shè)置的目標(biāo)值的差值寫入0x37寄存器中。0x36寄存器的cal_trigger決定了對哪個軸實(shí)行快補(bǔ)償。cal_trigger = 00b none cal_trigger = 01b x軸 cal_trigger = 10b y軸 cal_trigger = 11b z軸 當(dāng)正在進(jìn)行快補(bǔ)償時,慢補(bǔ)償被阻斷。 6.5.3 手動補(bǔ)償 通過數(shù)字接口去手動設(shè)置補(bǔ)償值。在手動補(bǔ)償時要注意不要影響正在進(jìn)行的偏移補(bǔ)償,所以一般在獲得new data中斷后立刻執(zhí)行。在慢補(bǔ)償有效或快補(bǔ)償正在運(yùn)行時,不允許對偏移補(bǔ)償寄存器作出寫操作。 6.5.4 內(nèi)嵌校準(zhǔn) 通過前面所提到的偏移補(bǔ)償方法計(jì)算出合適的補(bǔ)償值,然后將這些補(bǔ)償值存放在EEPROM中。在每一次設(shè)備重置時,補(bǔ)償值被load進(jìn)image寄存器作為偏移補(bǔ)償,直到它被用其他的補(bǔ)償方式重寫。 6.6 非易失性存儲器 bma250具有三種存儲器:hard-wired、valatile和non-valatile。non-valatile存儲器通過EEPROM來實(shí)現(xiàn),可以通過訪問image寄存器來訪問它。在bma250中共有八個image寄存器(0x38 ~ 0x3F),0x38 ~ 0x3D被用作存儲偏移補(bǔ)償值,0x3E和0x3F保留備用。 在兩種情況下EEPROM內(nèi)容會被load到image寄存器中去,一種情況是設(shè)備重置時,另一種情況是將0x33寄存器中的nvm_load值置為1。只要image寄存器還沒有l(wèi)oad完成,nv_ram位就為1,在完成后被置成0。image寄存器可以像其他寄存器一樣執(zhí)行讀寫操作。 寫EEPROM要經(jīng)過三步: 1)將新內(nèi)容寫入image寄存器; 2)將0x33寄存器中的nvm_prog_mode置成1,unlock EEPROM ; 3)將0x33寄存器中的nvm_prog_trig置為1,并保持nvm_prog_mode為1,激活寫操作。 每次寫EEPROM總是要更新整個EEPROM內(nèi)容,可以通過讀取0x33寄存器的nvm_rdy位來檢測寫狀態(tài)。nvm_rdy等于1,表示寫操作正在進(jìn)行中;nvm_rdy等于0,表示寫操作已完成。在寫EEPROM時,電源模式必須處于normal mode,而且不能對image寄存器作出更新。 6.7 中斷控制器 中斷的清除取決于所選擇的中斷模式,bma250支持三種模式:non-latched、latched和temporary。中斷模式可以通過0x21寄存器的低四位latch_int來設(shè)置,具體對應(yīng)關(guān)系如表1所示。 只要滿足中斷激活條件,就會產(chǎn)生一個中斷。在non-latched模式下,除了new data、orientation和flat中斷會在一個固定時間后自動重置,其他中斷只要激活條件不再有效,中斷狀態(tài)位和所選擇的pin腳(INT1 and/or INT2)就會立刻被清除。 latched模式下,必須通過將0x21寄存器的reset_init位置為1來清除中斷狀態(tài)和pin腳。清除時如果中斷條件仍然保持,中斷狀態(tài)會在加速度寄存器下次變化時再次被宣稱。 表1 中斷模式選擇對應(yīng)表 在temporary模式下,中斷狀態(tài)和pin腳在一段時間后被清除,這段時間由latch_int的具體值來決定。 bma250支持七種中斷機(jī)制,分別為:new data、tap、slope、high-g、low-g、orientation和flat。其中,new data、tap、slope、high-g和low-g既可以使用filtered data也可以使用unfiltered data作為輸入,這分別由0x1E寄存器的int_src_data、int_src_tap、int_src_slope、int_src_high和int_src_low位決定。而orientation和flat只能使用filtered data作為輸入。 可以通過0x19 ~ 0x1B寄存器來建立中斷類型到中斷引腳的映射關(guān)系。例如,將0x19寄存器的int1_flag位置為1,就是建立了flat中斷到INT1中斷引腳的映射關(guān)系。 6.7.1 new data中斷 new data中斷提供了一個同步讀取加速度數(shù)據(jù)的服務(wù)。它在將一個z軸的新值寫入數(shù)據(jù)寄存器時產(chǎn)生,在下一次數(shù)據(jù)獲取循環(huán)開始的時候自動清除。通過將0x17寄存器的data_en位置為1來使能new data中斷,中斷狀態(tài)存儲在0x0A的data_int位中。 6.7.2 slope中斷 在sensor移動中產(chǎn)生連續(xù)的加速度信號,當(dāng)一定數(shù)量的連續(xù)兩個加速度信號的值差大于一個預(yù)設(shè)的臨界值時,會產(chǎn)生一個slope中斷。而在一定數(shù)量的連續(xù)兩個加速度信號的值差小于這個預(yù)設(shè)值時,中斷被清除??梢酝ㄟ^0x28寄存器的slope_th位來設(shè)置這個臨界值,1 LSB slope_th對應(yīng)1 LSB的加速度數(shù)據(jù)。 連續(xù)兩個加速度信號的取值時間差取決于所選擇的帶寬,Δt=1/(2*bw)。而取值的數(shù)量由0x27寄存器的slope_dur來決定,N = slope_dur + 1。 通過設(shè)置0x16寄存器的slope_en_x、slope_en_y和slope_en_z為1來使能在x、y、z軸上的slope中斷。在dedicated mode喚醒狀態(tài)時,三個軸的slope中斷都被使能,0x16寄存器上的這三個值無效。 中斷狀態(tài)存儲在0x09的slope_int位。檢測到的slope中斷狀態(tài)信息存放在0x0B寄存器中,slope_first_x、slope_first_y、slope_first_z分別標(biāo)識了觸發(fā)中斷的軸狀態(tài),slope_sign位標(biāo)識了正負(fù)(0為正,1為負(fù))。 6.7.3 tap中斷 tap中斷類似于鼠標(biāo)按鍵的click,當(dāng)至少在一個軸上的加速度slope大于一個預(yù)定義的值時,該中斷產(chǎn)生。 有兩種tap事件:single tap和double tap。single tap是在一次tap事件后,緊跟著是一段安靜時間,類似于鼠標(biāo)的單擊;而double tap是在一段定義好的時間內(nèi),連續(xù)發(fā)生兩次tap事件,類似于鼠標(biāo)的雙擊。 同一時間,只能有一種tap中斷被使能。0x16寄存器的s_tap_en為1表示single tap使能,d_tap_en為1表示double tap使能。如果s_tap_en和d_tap_en同時被置為1,s_tap_en無效,只有double tap使能。 single tap的中斷狀態(tài)存儲在0x09寄存器的s_tap_int位,double tap的中斷狀態(tài)存儲在0x09寄存器的d_tap_int位。 通過設(shè)置0x2B寄存器的tap_th值來設(shè)置tap中斷的slope預(yù)設(shè)臨界值,在不同的range下,slope_th表示不同的數(shù)值。1 LSB的tap_th對應(yīng)于2g-range下的62.5mg slope,4g-range下的125mg slope,8g-range下的250mg slope,16g-range下的500mg slope。 0x2A寄存器的tap_shock和tap_quiet對single tap和double tap都是有效的,tap_dur僅對double tap有效。在tap_shock的持續(xù)時間里,任何新的tap事件都會被忽略;在slope_quiet的持續(xù)時間里,不能有新的tap事件發(fā)生,否則第一次tap事件將會被取消。tap_shock為0(1)表示tap_shock的持續(xù)時間為50 ms(75 ms),tap_quiet為0(1)表示tap_quiet的持續(xù)時間為30 ms(20 ms)。tap_dur的持續(xù)時間如表2所示。 表2 tap_dur對應(yīng)持續(xù)時間值表 tap中斷產(chǎn)生后12.5 ms后會被自動清除。 0x0B 寄存器的tap_sign位標(biāo)識了觸發(fā)tap中斷的第一次tap的slope正負(fù)(0為正,1為負(fù))。觸發(fā)中斷的軸狀態(tài)分別被存放在0x0B寄存器的tap_first_x、tap_first_y和tap_first_z中。 在低電模式(low-power mode)下,在喚醒狀態(tài)時,對取樣數(shù)量有一個限制,這由0x2B寄存器的tap_samp決定。tap_samp = 00b(01b、10b、11b),表示取樣數(shù)量為2(4、8、16)。 6.7.4 orientation中斷 orientation表示的是sensor相對于重力域矢量g的方向變化,假設(shè)z軸與g的夾角為θ,x軸與水平方向的夾角為φ,如下圖3所示。 圖3 sensor角度矢量圖 假設(shè)x、y、z軸上的加速度分別為acc_x、acc_y和acc_z,則可以得到: acc_x = 1g * sinθ * cosφ acc_y =-1g * sinθ * sinφ acc_z = 1g * cosθ 有三種不同的orientation計(jì)算模式,在這三種模式下具有不同的轉(zhuǎn)換臨界值。這三種模式分別為:對稱、高非對稱和低非對稱。這取決于0x2C寄存器的orient_mode值。orient_mode等于01b,工作在高非對稱模式;orient_mode等于10b,工作在低非對稱模式;否則,工作在對稱模式。對于每一種orienttaion模式,0x0C寄存器的orient表示不同的意思。三種模式下,orient的意思分別如表 3、表 4、表5所示。 圖3 對稱模式下的0x0C寄存器orient意思示表 圖4 高非對稱模式下的0x0C寄存器orient意思示表 圖5 低非對稱模式下的0x0C寄存器orient意思示表 在以上三張表中,‘hyst’ 表示一個延遲,這個值通過0x0C寄存器的orient_hyst設(shè)置。1 LSB的orient_hyst對應(yīng)于62.5 mg。 通過將0x16寄存器的orient_en位置為1來使能orientation中斷。當(dāng)0x0C寄存器的orient發(fā)生變化時,中斷產(chǎn)生,一段之間后自動清除。中斷狀態(tài)存儲在0x09寄存器的orient_int位。 0x0C寄存器的orient位發(fā)生變化后,中斷的產(chǎn)生可能會被阻斷,這可以通過0x2C寄存器的orient_blocking進(jìn)行設(shè)置。 orient_blocking = 00b表示沒有阻斷; orient_blocking = 01b表示θ阻斷; orient_blocking = 10b表示θ阻斷,或任一軸上的加速度slope > 0.2 g; orient_blocking = 11b表示θ阻斷,或任一軸上的加速度slope > 0.4 g,或orient值超過100 ms一直不穩(wěn)定。 θ阻斷通過下面的不等式定義: 參數(shù)blocking_theta由0x2D寄存器的orient_theta決定,由此可知阻斷角度θ的取值范圍為0° ~ 44.8°。 6.7.5 flat中斷 flat中斷,顧名思義,用于檢測sensor是否位于水平狀態(tài),判斷設(shè)備位于水平狀態(tài)的條件時: 參數(shù)parameter_theta由0x2E寄存器的flat_theta決定,由此可知,flat角度可能取值范圍也是0° ~ 44.8°。 通過將0x16寄存器的flat_en置為1使能flat中斷。當(dāng)0x0C寄存器的flat值發(fā)生變化,并且這個值保持穩(wěn)定一段時間后,flat中斷產(chǎn)生。保持穩(wěn)定的時間的最小值由0x2F寄存器的flat_hold_time決定。flat_hold_time等于00b、01b、10b、11b分別表示0、512 ms、1024 ms、2048 ms。這個中斷在一段之間后自動清除。flat中斷狀態(tài)存儲在0x09寄存器的flat_int位。 6.7.6 low-g中斷 這個中斷是基于比較加速度數(shù)據(jù)和low-g臨界值而產(chǎn)生的,比如對自由落體的偵測。通過設(shè)置0x17寄存器的low_en位使能該中斷。low-g中斷有兩種模式:single mode和sum mode。single mode是只比較某一個軸的加速度,而sum mode是比較三個軸加速度的絕對值總和。這由0x24寄存器的low_mode位決定,0表示single mode,1表示sum mode。 low-g臨界值通過0x23寄存器的low_th設(shè)置,1 LSB low_th對應(yīng)于7.81 mg的加速度??梢酝ㄟ^設(shè)置0x24寄存器的low_hy來設(shè)置滯后值,1 LSB low_hy對應(yīng)于125 mg的加速度值。 當(dāng)某一軸上的加速度絕對值(single mode)或三軸加速度絕對值的總和(sum mode)小于臨界值超過一段時間(這個時間由0x22寄存器的low_dur決定)后,中斷產(chǎn)生;當(dāng)某一軸上的加速度絕對值(single mode)或三軸加速度絕對值的總和(sum mode)大于臨界值減去滯后值至少超過一個數(shù)據(jù)的獲取時間后,中斷被重置。 low-g中斷產(chǎn)生前的延遲時間與low_dur的關(guān)系為:delay [ms] = [(0x22)low_dur + 1] * 2 ms。所以,延遲時間的可能范圍為2 到512 ms。 6.7.7 high-g中斷 這個中斷是基于比較加速度數(shù)據(jù)和high-g臨界值而產(chǎn)生的,主要用于對震動或其他的一些高加速度事件的偵測。 通過設(shè)置0x17寄存器的hign_en_x、high_en_y和high_en_z使能sensor在x、y和z軸上的high-g終端。 high-g臨界值通過0x26寄存器的high_th設(shè)置,1 LSB high_th對應(yīng)于2g-range下的7.81mg,4g-range下的15.63mg,8g-range下的31.25mg,16g-range下的62.5mg??梢酝ㄟ^設(shè)置0x24寄存器的high_hy來設(shè)置滯后值,1 LSB high_hy對應(yīng)于2g-range下的125mg,4g-range下的250mg,8g-range下的500mg,16g-range下的1000mg。 當(dāng)至少一個使能軸的加速度絕對值高于high-g臨界值超過一段時間(這個時間由0x25寄存器的high_dur決定)后,中斷產(chǎn)生。當(dāng)所有使能軸的加速度絕對值都低于high-g臨界值減去滯后值一段時間(由0x25寄存器的high_dur決定)后,中斷被重置。 high-g中斷產(chǎn)生前的延遲時間與high_dur的關(guān)系為:delay [ms] = [(0x22)high_dur + 1] * 2 ms。所以,延遲時間的可能范圍為2 到512 ms。 7.sensor驅(qū)動開發(fā)步驟 綜上所述,sensor驅(qū)動開發(fā)可以歸納為以下步驟來完成: 1.read && verify spec,確認(rèn)chip功能以及register配置; 2.按照spec所述,在code中加入主要的配置數(shù)據(jù),如電源模式、主要寄存器的配置、range支持、bandwidth支持、中斷配置等; 3.設(shè)計(jì)主要的數(shù)據(jù)結(jié)構(gòu); 4.實(shí)現(xiàn)sensor數(shù)據(jù)的設(shè)置和獲取接口; 5.通過module_init和module_exit接口加入driver層入口和出口函數(shù)函數(shù); 6.定義i2c_driver,設(shè)置driver的probe和remove函數(shù)入口,通過i2c_add_driver和i2c_del_driver接口添加/移除driver; 7.實(shí)現(xiàn)driver的probe函數(shù)功能,函數(shù)中實(shí)現(xiàn)sensor的硬件配置,并通過linux的input子系統(tǒng)實(shí)現(xiàn)sensor數(shù)據(jù)的上報(bào); 8.實(shí)現(xiàn)driver的remove函數(shù)功能,函數(shù)中實(shí)現(xiàn)設(shè)備的移除、資源的釋放等。 9.HAL層中注冊hw_module_t結(jié)構(gòu)體,將結(jié)構(gòu)體名稱命名為HAL_MODULE_INFO_SYM; 10.判斷sensor設(shè)備文件是否存在,通過open_input_device訪問設(shè)備文件,并注冊設(shè)備文件的poll、activate、close等函數(shù); 11.實(shí)現(xiàn)sensor list的獲取函數(shù); 12.實(shí)現(xiàn)對設(shè)備文件的主要操作接口,完成上層與硬件設(shè)備的通信; 13.調(diào)試sensor功能。附錄 bma250寄存器表 精品學(xué)習(xí)資料范文 創(chuàng)新驅(qū)動發(fā)展戰(zhàn)略學(xué)習(xí)心得 創(chuàng)新驅(qū)動發(fā)展戰(zhàn)略學(xué)習(xí)心得 通過將近一個月的課程學(xué)習(xí),我獲益匪淺,對“創(chuàng)新”有了新的理解和認(rèn)識。創(chuàng)新是一種探索未知事物、尋找科學(xué)真理的活動,意味著新的嘗試,走新的道路。創(chuàng)新是引領(lǐng)發(fā)展的第一動力,必須擺在國家發(fā)展全局的核心位置,深入實(shí)施創(chuàng)新驅(qū)動發(fā)展戰(zhàn)略。作為黨員領(lǐng)導(dǎo)干部,更應(yīng)該樹立創(chuàng)新意識,自覺運(yùn)用創(chuàng)新思維方式和方法謀劃自身工作。 一、要樹立創(chuàng)新的勇氣 中國的改革航船已經(jīng)駛?cè)牍?jiān)克難的深水區(qū)。只有創(chuàng)新思維,沖破思想觀念的束縛,突破利益固化的藩籬,攻克體制機(jī)制上的頑癥痼疾,才能進(jìn)一步發(fā)展社會生產(chǎn)力和增強(qiáng)社會活力。創(chuàng)新,需要敢于冒險(xiǎn)的勇氣和魄力。中國改革創(chuàng)新,束縛怎么沖破? 藩籬如何突破? 頑癥痼疾又怎樣攻克? 倘若沒有一往無前的勇氣,沒有壯士斷腕的決心,沒有背水一戰(zhàn)的氣概,沒有迎難而上的擔(dān)當(dāng),這艘改革航船將注定無法抵達(dá)勝利的彼岸。我們要拿出逢山開路的闖勁兒,拿出甩開膀子的干勁兒,拿出抓鐵有痕的韌勁兒,拿出眾人拾柴的心勁兒,拿出 精品學(xué)習(xí)資料范文 勇毅篤行的穩(wěn)勁兒,用今天的改革為明天的遠(yuǎn)行鋪路搭橋。 二、要講究創(chuàng)新的方法 實(shí)現(xiàn)創(chuàng)新,需要具備追求卓越的意識、開拓創(chuàng)先的精神和獨(dú)具卓識的方法。要學(xué)會掌握和運(yùn)用逆向思維、發(fā)散思維和聯(lián)想思維等方法,克服思維的單一性、孤立性,善于多角度、多層次、全方位地解決、學(xué)習(xí)實(shí)踐中的各種問題,力爭達(dá)到獨(dú)創(chuàng)性、系統(tǒng)性?!皠?chuàng)新是民族進(jìn)步的靈魂,創(chuàng)新是國家興旺發(fā)達(dá)不竭的動力”創(chuàng)新就在于創(chuàng)造,創(chuàng)造就在于人腦的訓(xùn)練。創(chuàng)新思維是發(fā)散思維和集中思維的結(jié)合,發(fā)散思維是構(gòu)成創(chuàng)造性思維的主導(dǎo)成分。發(fā)散思維是在思維過程中通過重組所給的和記憶中的信息,得到眾多可能的答案、設(shè)想或解決方案。它的特點(diǎn)為是以一個問題為中心,充分發(fā)揮人的聯(lián)想力和想象力,突破原有的知識圈,從一點(diǎn)向四面八方想開去,從各個不同的角度或側(cè)面進(jìn)行思考,讓思維多向流動,以便獲得解決問題的全部可能。這種思考無一定方向、無一定范圍、不墨守成規(guī)、不拘于傳統(tǒng)方法,可以標(biāo)新立異、異想天開,從已知的領(lǐng)域去探求未知的境界。所以,發(fā)散思維是一種創(chuàng)新思維方法,集中體現(xiàn)了創(chuàng)造性思維的本質(zhì)牲特征。我們要有意識的訓(xùn)練運(yùn)用這些思維方式和方法,創(chuàng)造性的開展自身的工作。 精品學(xué)習(xí)資料范文 三、要在實(shí)踐中創(chuàng)新 創(chuàng)新思維來自于實(shí)踐,服務(wù)于實(shí)踐。要把創(chuàng)新思維和社會實(shí)踐結(jié)合起來,在實(shí)踐中統(tǒng)籌兼顧,用整體、全面的觀點(diǎn)和方法處理和解決發(fā)展中的各種復(fù)雜性問題。日常學(xué)習(xí)和生活中,在一個有限的范圍內(nèi),人們接觸了一定的類似的概念后,會習(xí)慣性地形成一種思維定勢,會“想當(dāng)然”地認(rèn)為事情就是大多數(shù)認(rèn)為的那樣,容易陷入“知其然而不知其所以然”的怪圈,不能看到事物的本來面目,在這樣的狀態(tài)下難以創(chuàng)新。因此,在各種實(shí)踐探索過程中,要勇于拆掉習(xí)慣性思維的墻,打破所有束縛頭腦的條條框框,要允許自己異想天開,主動丟棄從眾心理和從眾思維習(xí)慣,“不走尋常路”,不讓自己被表象迷惑,增強(qiáng)洞察事物本質(zhì)的能力,從根源上找到解決問題的新構(gòu)思、新思想。實(shí)踐,是創(chuàng)新思維的源頭活水,實(shí)踐中發(fā)現(xiàn)和產(chǎn)生的需求,是創(chuàng)新活動不竭的動力。因此,要積極投身和參與實(shí)踐中,在實(shí)踐中收獲“觀念更新、思維新穎、方法先進(jìn)”的成果。 四、要加強(qiáng)知識的積累 要勤于學(xué)習(xí)各種知識,不斷開闊視野。知識和經(jīng)驗(yàn)是創(chuàng)新思維的基礎(chǔ)。有豐富的閱歷,廣博的知識,就有足夠的閃光點(diǎn)用來進(jìn)行 精品學(xué)習(xí)資料范文 “想象”、“整合”和“類比”。閱歷和知識越多樣化,頭腦中能夠產(chǎn)生的關(guān)聯(lián)就會越多。因此,要培養(yǎng)自己對各類事物的觀察、學(xué)習(xí)興趣,主動參與各種理論和實(shí)踐活動,力爭對各個行業(yè)、各種事物都有所了解。同時,要養(yǎng)成善于學(xué)習(xí)和思考的習(xí)慣,能將各個不同領(lǐng)域內(nèi)看似毫無內(nèi)在關(guān)聯(lián)的問題、想法、事物成功地聯(lián)系在一起,找出所有事物共同點(diǎn)、共通點(diǎn),為“整合”、“創(chuàng)造”打好扎實(shí)的基礎(chǔ)。最后,要錘煉堅(jiān)持不懈的品格。創(chuàng)新的道路上,沒有平坦的大道可走,挫折和失敗在所難免。不僅需要超常的智力,更需要非凡的勇氣和精神支撐。面對創(chuàng)新過程中可能遇到的各種困難,要努力克服畏難情緒和懶惰習(xí)氣,把追求創(chuàng)新、努力創(chuàng)新作為學(xué)習(xí)、工作的要求和標(biāo)準(zhǔn)。注重錘煉自信、堅(jiān)毅、獨(dú)創(chuàng)、不迷信權(quán)威等品格,用鍥而不舍、百折不撓的精神,不達(dá)目的不罷休的韌勁,義無反顧地去思、去闖。只有善于創(chuàng)新、勇于實(shí)踐,把創(chuàng)新看成自己生命中的一部分,努力讓世界變得更加美好,在創(chuàng)新的世界中收獲屬于自己的成功。 五、要注重人才隊(duì)伍的創(chuàng)新要相信“時勢造英雄”,要充分認(rèn)識到國家的人口基數(shù)大,高效人才的流動。要鼓勵科研人員創(chuàng)業(yè)創(chuàng)新。大力弘揚(yáng)創(chuàng)新文化,厚植創(chuàng)新沃土,營造敢為人先、寬容失敗的良好氛圍,充分激發(fā)企業(yè)家精神,調(diào)動全社會創(chuàng)業(yè)創(chuàng)新積極性,匯聚成推動發(fā)展的磅礴力量。 精品學(xué)習(xí)資料范文 對于商貿(mào)工作而言,我認(rèn)為“創(chuàng)新”所帶來的影響將會更深遠(yuǎn),其作用不可替代。 一、創(chuàng)新產(chǎn)業(yè)規(guī)?;徒M織化建設(shè),提升流通水平和層次。商貿(mào)流通企業(yè)規(guī)模小、流通水平低嚴(yán)重阻礙了商貿(mào)流通業(yè)的發(fā)展。一方面可以加大商貿(mào)流通企業(yè)的并購力度,鼓勵企業(yè)以參股、控股、兼并、重組等方式實(shí)現(xiàn)更大范圍的整合,形成更大的連鎖型企業(yè),優(yōu) 3.BMP和JPEG圖形顯示程序 3.1 在LCD上顯示BMP或JPEG圖片的主流程圖 首先,在程序開始前。要在nfs/dev目錄下創(chuàng)建LCD的設(shè)備結(jié)點(diǎn),設(shè)備名fb0,設(shè)備類型為字符設(shè)備,主設(shè)備號為29,次設(shè)備號為0。命令如下: mknod fb0 c 29 0 在LCD上顯示圖象的主流程圖如圖3.1所示。程序一開始要調(diào)用open函數(shù)打開設(shè)備,然后調(diào)用ioctl獲取設(shè)備相關(guān)信息,接下來就是讀取圖形文件數(shù)據(jù),把圖象的RGB值映射到顯存中,這部分是圖象顯示的核心。對于JPEG格式的圖片,要先經(jīng)過JPEG解碼才能得到RGB數(shù)據(jù),本項(xiàng)目中直接才用現(xiàn)成的JPEG庫進(jìn)行解碼。對于bmp格式的圖片,則可以直接從文件里面提取其RGB數(shù)據(jù)。要從一個bmp文件里面把圖片數(shù)據(jù)陣列提取出來,首先必須知道bmp文件的格式。下面來詳細(xì)介紹bmp文件的格式。 圖3.1 3.2 bmp位圖格式分析 位圖文件可看成由四個部分組成:位圖文件頭、位圖信息頭、彩色表和定義位圖的字節(jié)陣列。如圖3.2所示。 圖3.2 文件頭中各個段的地址及其內(nèi)容如圖3.3。 圖3.3 位圖文件頭數(shù)據(jù)結(jié)構(gòu)包含BMP圖象文件的類型,顯示內(nèi)容等信息。它的數(shù)據(jù)結(jié)構(gòu)如下定義: Typedef struct { int bfType;//表明位圖文件的類型,必須為BM long bfSize;//表明位圖文件的大小,以字節(jié)為單位 int bfReserved1;//屬于保留字,必須為本0 int bfReserved2;//也是保留字,必須為本0 long bfOffBits;//位圖陣列的起始位置,以字節(jié)為單位 } BITMAPFILEHEADER; 圖3.4 位圖文件頭的數(shù)據(jù)結(jié)構(gòu) (2)信息頭中各個段的地址及其內(nèi)容如圖3.5所示。 圖3.5 位圖信息頭的數(shù)據(jù)結(jié)構(gòu)包含了有關(guān)BMP圖象的寬,高,壓縮方法等信息,它的C語言數(shù)據(jù)結(jié)構(gòu)如圖3.6所示。Typedef struct { long biSize; //指出本數(shù)據(jù)結(jié)構(gòu)所需要的字節(jié)數(shù) long biWidth;//以象素為單位,給出BMP圖象的寬度 long biHeight;//以象素為單位,給出BMP圖象的高度 int biPlanes;//輸出設(shè)備的位平面數(shù),必須置為1 int biBitCount;//給出每個象素的位數(shù) long biCompress;//給出位圖的壓縮類型 long biSizeImage;//給出圖象字節(jié)數(shù)的多少 long biXPelsPerMeter;//圖像的水平分辨率 long biYPelsPerMeter;//圖象的垂直分辨率 long biClrUsed;//調(diào)色板中圖象實(shí)際使用的顏色素?cái)?shù) long biClrImportant;//給出重要顏色的索引值 } BITMAPINFOHEADER; 圖3.6 BITMAPINFOHEADER數(shù)據(jù)結(jié)構(gòu) (3)對于象素小于或等于16位的圖片,都有一個顏色表用來給圖象數(shù)據(jù)陣列提供顏色索引,其中的每塊數(shù)據(jù)都以B、G、R的順序排列,還有一個是reserved保留位。而在圖形數(shù)據(jù)區(qū)域存放的是各個象素點(diǎn)的索引值。它的C語言結(jié)構(gòu)如圖3.7所示。 圖3.7 顏色表數(shù)據(jù)結(jié)構(gòu)(4)對于24位和32位的圖片,沒有彩色表,他在圖象數(shù)據(jù)區(qū)里直接存放圖片的RGB數(shù)據(jù),其中的每個象素點(diǎn)的數(shù)據(jù)都以B、G、R的順序排列。每個象素點(diǎn)的數(shù)據(jù)結(jié)構(gòu)如圖3.8所示。 圖3.8 圖象數(shù)據(jù)陣列的數(shù)據(jù)結(jié)構(gòu)(5)由于圖象數(shù)據(jù)陣列中的數(shù)據(jù)是從圖片的最后一行開始往上存放的,因此在顯示圖象時,是從圖象的左下角開始逐行掃描圖象,即從左到右,從下到上。 (6)對S3C2410或PXA255開發(fā)板上的LCD來說,他們每個象素點(diǎn)所占的位數(shù)為16位,這16位按B:G:R=5:6:5的方式分,其中B在最高位,R在最低位。而從bmp圖象得到的R、G、B數(shù)據(jù)則每個數(shù)據(jù)占8位,合起來一共24位,因此需要對該R、G、B數(shù)據(jù)進(jìn)行移位組合成一個16位的數(shù)據(jù)。移位方法如下: b >>= 3;g >>= 2;r >>= 3;RGBValue =(r<<11 | g << 5 | b);基于以上分析,提取各種類型的bmp圖象的流程如圖3.9所示 圖 3.9 本篇文章來源于 Linux公社網(wǎng)站(本篇文章來源于 Linux公社網(wǎng)站(第四篇:創(chuàng)新驅(qū)動發(fā)展戰(zhàn)略學(xué)習(xí)心得范文
第五篇:S3C2410 LCD驅(qū)動學(xué)習(xí)心得-4