1. 怎麼用C語言編寫驅動程序(顯卡驅動)
你先買一本《c語言手冊》,什麼出版社的都行,上面會有什麼狀況下的模塊設計,然後你自己制定一下自己的程序的大致分幾個部分,然後先把框架設計下來,然後根據手冊的內容編輯
2. 如何編寫驅動程序
代碼:
#include<linux/mole.h>
#include<linux/kernel.h>
#include<asm/io.h>
#include<linux/miscdevice.h>
#include<linux/fs.h>
#include<asm/uaccess.h>
//流水燈代碼
#define GPM4CON 0x110002e0
#define GPM4DAT 0x110002e4
static unsigned long*ledcon=NULL;
static unsigned long*leddat=NULL;
//自定義write文件操作(不自定義的話,內核有默認的一套文件操作函數)
static ssize_t test_write(struct file*filp,const char __user*buff,size_t count,loff_t*offset)
{
int value=0;
int ret=0;
ret=_from_user(&value,buff,4);
//底層驅動只定義基本操作動作,不定義功能
if(value==1)
{
*leddat|=0x0f;
*leddat&=0xfe;
}
if(value==2)
{
*leddat|=0x0f;
*leddat&=0xfd;
}
if(value==3)
{
*leddat|=0x0f;
*leddat&=0xfb;
}
if(value==4)
{
*leddat|=0x0f;
*leddat&=0xf7;
}
return 0;
}
//文件操作結構體初始化
static struct file_operations g_tfops={
.owner=THIS_MODULE,
.write=test_write,
};
//雜設備信息結構體初始化
static struct miscdevice g_tmisc={
.minor=MISC_DYNAMIC_MINOR,
.name="test_led",
.fops=&g_tfops,
};
//驅動入口函數雜設備初始化
static int __init test_misc_init(void)
{
//IO地址空間映射到內核的虛擬地址空間
ledcon=ioremap(GPM4CON,4);
leddat=ioremap(GPM4DAT,4);
//初始化led
*ledcon&=0xffff0000;
*ledcon|=0x00001111;
*leddat|=0x0f;
//雜設備注冊函數
misc_register(&g_tmisc);
return 0;
}
//驅動出口函數
static void __exit test_misc_exit(void)
{
//釋放地址映射
iounmap(ledcon);
iounmap(leddat);
}
//指定模塊的出入口函數
mole_init(test_misc_init);
mole_exit(test_misc_exit);
MODULE_LICENSE("GPL");
include用法:
#include命令預處理命令的一種,預處理命令可以將別的源代碼內容插入到所指定的位置;可以標識出只有在特定條件下才會被編譯的某一段程序代碼;可以定義類似標識符功能的宏,在編譯時,預處理器會用別的文本取代該宏。
插入頭文件的內容
#include命令告訴預處理器將指定頭文件的內容插入到預處理器命令的相應位置。有兩種方式可以指定插入頭文件:
1、#include<文件名>
2、#include"文件名"
如果需要包含標准庫頭文件或者實現版本所提供的頭文件,應該使用第一種格式。如下例所示:
#include<math.h>//一些數學函數的原型,以及相關的類型和宏
如果需要包含針對程序所開發的源文件,則應該使用第二種格式。
採用#include命令所插入的文件,通常文件擴展名是.h,文件包括函數原型、宏定義和類型定義。只要使用#include命令,這些定義就可被任何源文件使用。如下例所示:
#include"myproject.h"//用在當前項目中的函數原型、類型定義和宏
你可以在#include命令中使用宏。如果使用宏,該宏的取代結果必須確保生成正確的#include命令。例1展示了這樣的#include命令。
【例1】在#include命令中的宏
#ifdef _DEBUG_
#define MY_HEADER"myProject_dbg.h"
#else
#define MY_HEADER"myProject.h"
#endif
#include MY_HEADER
當上述程序代碼進入預處理時,如果_DEBUG_宏已被定義,那麼預處理器會插入myProject_dbg.h的內容;如果還沒定義,則插入myProject.h的內容。
3. 我想學習如何編寫驅動程序(C)
驅動程序一般用C來開發,好像微軟也有一個軟體專門用來開發驅動的,但我不是很清楚,你說的做晶元,其實就是嵌入式的開發,開發工具一般是C語言和相對的晶元支持的匯編語言,如果你選擇嵌入式開發這條路,建議你先從MCS-51開始學起,如果你在學校學過《微機原理與匯編語言》這門課,應該在三個月到半年內可以入門,入門後就可以找一些簡單的項目來做,後面的路就長了,只要你好學,嵌入式LINUX,WINCE的軟體及驅動開發都可以嘗試,嵌入式幾乎無所不在,小至馬路上的交通紅綠燈,你上網所用的MODEM,路由器,大至大屏幕LCD彩電,大型的廣告等都是它的用武之地,我也是剛剛入門的,有興趣一起交流,我的QQ63305988
4. C語言編寫晶元驅動的方法
驅動就是操作晶元完成功能,使用C語言完成相關的操作也是類似的。
完成過SD卡的,主要的流程是,查看晶元手冊,找到使用的埠,然後根據相關的協議和已有的部分介面完成操作。別糾結於細節,前整體完成結構之後再想著編程。
類似於這種程序網上都有,想重新寫一套的話沒有必要。參照類似的然後修改和添加你要的就可以。
5. C語言如何編寫驅動
准備好相應晶元的技術手冊。
根據技術手冊,配置對應時鍾寄存器
如需要中斷,配置中斷相關寄存器。完成對應的ISR中斷服務程序。
實現對外介面。
6. 用C/C++進行底層驅動編程需要了解哪些知識
計算機組成原理,數字電路,模擬電路,匯編語言,操作系統等
7. C語言匯編硬體驅動開發用哪個好哪個語言寫出來的驅動
假定前提, C語言和匯編語言,都學的很精通,硬體知識也很好。
那麼 匯編語言做出來的驅動 將是更高效的,更好的。
問題是 實際上很少有人用匯編做驅動
因為匯編太煩了,代碼量太大。
與C語言相比,實現相同的功能, 需要用十倍甚至更多的時候,去編碼,去調試
最終只能提升1%甚至更少的性能。
這是得不償失的。所以實際上,還是C寫驅動性價比更高。 在一些關鍵的位置 可能會嵌入匯編。
8. 編寫驅動程序用c語言還是匯編語言還是控制硬體要在c中混編匯編可以給出一個例子的代碼嗎謝謝。
會匯編當然最好
硬體控制可以直接用C語言
#include <stdio.h>
extern void swi_handler(void);
/*中斷處理子程序*/
void do_swi(int num)
{
/*
switch (num)
{
case 0x1: ...
case 0x2: ...
}
*/
printf("%d helloworld\n", num);
}
//swi_handler
void install_swi_handler(void (*fun)(void))
{
unsigned int cmd;
//1.構造一條跳轉指令
*((unsigned int *)0x38) = (unsigned int)fun;
cmd = 0xe59ff028;
//2.把此指令機器碼放到0x8地址
*((unsigned int *)0x8) = cmd;
}
int main(void)
{
int i = 0;
install_swi_handler(swi_handler);
for (i = 0; i < 10; i++) {
if (i == 3) {
__asm
{
swi 0x123
}
}
else
printf("aa\n");
}
return 0;
}
9. 驅動編程的語言基礎:是不是c51/arm/win/unix等編程都可以用標准C語言寫驅動
是的,51的驅動還有c和匯編混編的程序。
10. 怎麼用C語言寫嵌入式系統的驅動程序
寫驅動程序,要看你在什麼操作系統,什麼平台上開發,現在比較流行的操作系統linux,比較流行的cpu平台arm,買個arm的開發板(淘寶上有),隨開發板會有一些資料,回來研究研究,再買本《linux上的設備驅動程序》書看看,邊學習邊實踐,慢慢走上linux嵌入式驅動編程之路。