我採用的是正點原子的linux板子,覺得原子的板子還是很不錯的。
由於正點原子使用的設計是通過電平拉低是點亮led,拉高則是關閉led。
1.構建驅動載入和解除安裝函式
2.申請裝置號,裝置號可以指定,或者讓系統自動分配
3.初始化建立的cdev結構體。
4.最後自動建立裝置節點
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define newchrled_name "newchrled"
struct newchrled
;#define ccm_ccgr1 (0x020c406c)
#define sw_mux_gpio1_io03 (0x020e0068)
#define sw_pad_gpio1_io03 (0x020e02f4)
#define gpio1_dr (0x0209c000)
#define gpio1_gdir (0x0209c004)
#define led_on 1
#define led_off 0
static
void __iomem *ccm_ccgr1;
static
void __iomem *sw_mux_gpio01_io03;
static
void __iomem *sw_pad_gpio01_io03;
static
void __iomem *gpio01_dr;
static
void __iomem *gpio01_gdir;
//申請虛擬位址對映
static
void
led_physical_to_virtual_map
(void
)//釋放虛擬位址對映
static
void
led_physical_to_virtual_unmap
(void
)static
void
led_driver_switch
(unsigned
char sta)
else
if(sta == led_on)
}//註冊模組時候初始化gpio
static
void
led_driver_init
(void
)//解除安裝模組時候禁止led
static
void
led_driver_freed
(void
)static
intnewchrled_open
(struct inode *inode,
struct file *file)
static
intnewchrled_release
(struct inode *inode,
struct file *file)
static ssize_t newchrled_write
(struct file *filp,
const
char __user *buf,
size_t count, loff_t * ppos)
else
return0;
}static
struct file_operations newchrled_fops =
;struct newchrled newchrled;
static
int __init newchrled_init
(void
)else
if(result <0)
printk
("major:%d minor:%d\r\n"
,newchrled.major,newchrled.minor)
; newchrled.cdev.owner = this_module;
cdev_init
(&newchrled.cdev,
&newchrled_fops)
;
result =
cdev_add
(&newchrled.cdev,newchrled.devid,1)
;if(result <0)
newchrled.class =
class_create
(this_module, newchrled_name);if
(is_err
(newchrled.class)
) newchrled.device =
device_create
(newchrled.class,
null
,newchrled.devid,
null
,newchrled_name);if
(is_err
(newchrled.device)
)printk
("newchrled init ok\r\n");
return0;
device_create_out:
class_destroy
(newchrled.class)
;class_create_cdev:
cdev_del
(&newchrled.cdev)
;cdev_err:
unregister_chrdev_region
(newchrled.devid,1)
;devid_err:
return result;
}static
void __exit newchrled_exit
(void
)module_init
(newchrled_init)
;module_exit
(newchrled_exit)
;module_license
("gpl");
module_author
("gale"
);
1、linux使用虛擬記憶體管理,所以要想實際操作真實的實體地址,必須呼叫函式申請虛擬位址對應的實體地址,相對應的,在載入函式的時候申請了,那麼在解除安裝驅動的時候必須將這些申請的虛擬位址給釋放掉!
2、任何資源在載入時候申請了,除非逼不得已,否則都要在解除安裝驅動時候將其釋放掉。
3、個人採用的是使用**alloc_chrdev_region()**這個函式系統自動申請裝置號,最後再將主裝置號和從裝置號分離。
4、個人使用的是在載入驅動的時候,就自動建立裝置節點,否則的話還需要使用這個命令建立裝置節點mknod。
作為我的第乙個程式,有些地方可能還需要優化,關於驅動乙個io做出的比較多的步驟,linux應該會有更好的框架來處理這部分,當然這只是我的猜想,關於linux方面的知識還在學習中,後續學到在接著更新。
linux驅動之 led驅動
練手,第乙個字元驅動.用模組載入方法 華清遠見 嵌入式linux裝置驅動開發詳解 的 拿來改的.編譯過程發現很多錯誤.最後發現 這本書帶的驅動 都是基於linux2.4的.目前我用的linux2.6,部分需要做修改.我的板子是 友善之臂的 2410.vmware ubuntu nfs交叉編譯 首先 ...
Linux驅動 LED驅動測試
環境 主機 fedora12 目標板 mini6410 目標板linux核心版本 2.6.38 實現功能 驅動目標板4個led.說明 led與6410引腳對應連線 led1 gpk4 led2 gpk5 led3 gpk6 led4 gpk7 驅動源 led driver.c cpp view pl...
Linux裝置驅動之《點亮一盞LED》
如果玩過微控制器那麼對於arm控制gpio來說應該不會很陌生,上手比較容易,對於硬體的操作無非就是高低電平和暫存器的操作,所以對於arm也是一樣的。這裡簡單的介紹乙個控制開發板上led的簡單例子,對於硬體操作能有一定的基礎概念和操作方法。全部程式的實現在三個檔案中,標頭檔案ioctl c.h,c檔案...