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嵌入式驱动编程之路。