驱动编写和编译方法

看到新学CE的兄弟也不少,想想当年自己的惨样,献献丑,只要大家不要笑掉大牙就好了。

在CE中,最简单的驱动程序莫过于一个内置(Built-in)设备的流接口驱动。对于一个不支持热拔插的设备,最方便的做法就是为其实现一个内置的流接口驱动。这种驱动只需要做以下工作:

1.实现一个动态库,其中实现以下函数:
    DWORD xxx_Init( LPCTSTR pContext, LPCVOID lpvBusContext);
    DWORD xxx_Deinit( DWORD hDeviceContext );
   
    DWORD xxx_Open(DWORD hDeviceContext,DWORD dwAccess, DWORD               dwShareMode);
    DWORD xxx_Close(  DWORD hDeviceContext );
   
    void XXX_PowerUp( DWORD hDeviceContext );
    void XXX_PowerDown(DWORD hDeviceContext );


    DWORD xxx_IOControl(
              DWORD hDeviceContext,
              DWORD dwCode,
              PBYTE pBufIn,
              DWORD dwLenIn,
              PBYTE pBufOut,
              DWORD dwLenOut,
              PDWORD pdwActualOut
              );

2.在注册表中添加如下项目。(一般放在Platform.reg)
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SampleDev]
  "Prefix"="XXX"
  "Dll"="MyDev.Dll"
  "Order"=dword:1
3.在BIB文件中添加项目,将所用到的文件加入BIN文件(一般放在Platform.bib)。
    MyDev.dll     $(_FLATRELEASEDIR)/MyDev.dll     NK SH
注:
SampleDev为任意与其它项目不重名的字符串.
每个函数名的前缀XXX可以是任意大写的字符串,只要保证与注册表中Prefix后面的值相同就行。

    现在,已经知道了需要实现那些东西,那你一定急不可待,想知道如何去实现它。好了,一个最直接的方法,在platform/your CPU’s folder/drivers 下新建一个目录,然后在drivers目录中的dirs文件中加入以你刚新建的目录名。
    在刚新建的目录下,新建你的C源代码文件,在其中实现上面所述的函数,及其功能。新建名称分别为sources, makefile, mydev.def的文件。其内容如下:
    makefile: 只需要这样一行
!INCLUDE $(_MAKEENVROOT)/makefile.def

mydriver.def文件定义需要输出的函数,这些函数能够被其它代码用动态加载的方法调用。格式:

LIBRARY     MyDev(这个字符串要和将要生成的动态库的文件名一样)

EXPORTS
    XXX_Init
    XXX_Deinit
    XXX_Open
    XXX_Close
    XXX_PowerOff
    XXX_Power_Down
    XXX_IOControl
Sources:这个文件很重要,内容也多,最基本的一个文件该有如下内容。

TARGETNAME=MyDev(指定要生成的动态库的名称)
TARGETTYPE=DYNLINK(指定要生成的是一个动态库)
(下面两项指定需要与哪些动态库链接,一般要第一项就足够了)
TARGETLIBS=$(_COMMONSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib /
              $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/ceddk.lib

DEFFILE=MyDev.def (指定def文件)

DLLENTRY=DllEntry(指定动态库的入口函数)

SOURCES=(请在这写上你所有源文件的名字,它们将会被编译)


    好了,现在万事俱备,只剩编译啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写Linux驱动需要了解Linux内核的工作原理和驱动模型。Linux驱动通常分为字符设备驱动、块设备驱动、网络设备驱动等等。其中,字符设备驱动是最常见的一种。 编写Linux驱动的步骤如下: 1. 确定驱动类型:根据设备类型确定驱动类型,如字符设备驱动、块设备驱动、网络设备驱动等等。 2. 编写驱动代码:编写驱动代码,包括设备注册、设备初始化、设备读写、设备释放等等。 3. 编写Makefile文件:编写Makefile文件,包括编译驱动代码、生成驱动模块文件等等。 4. 编译驱动代码:使用make命令编译驱动代码,生成驱动模块文件。 5. 加载驱动模块:使用insmod命令加载驱动模块。 6. 测试驱动:使用测试程序测试驱动是否正常工作。 下面是一个简单的字符设备驱动示例: ``` #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/cdev.h> #define DEVICE_NAME "testdev" #define CLASS_NAME "testclass" MODULE_LICENSE("GPL"); static int major; static struct class *testclass; static struct cdev testcdev; static int test_open(struct inode *inode, struct file *file) { printk(KERN_INFO "testdev: open\n"); return 0; } static int test_release(struct inode *inode, struct file *file) { printk(KERN_INFO "testdev: release\n"); return 0; } static ssize_t test_read(struct file *file, char __user *buf, size_t count, loff_t *offset) { printk(KERN_INFO "testdev: read\n"); return 0; } static ssize_t test_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) { printk(KERN_INFO "testdev: write\n"); return count; } static struct file_operations test_fops = { .owner = THIS_MODULE, .open = test_open, .release = test_release, .read = test_read, .write = test_write, }; static int __init test_init(void) { int ret; ret = alloc_chrdev_region(&major, 0, 1, DEVICE_NAME); if (ret) { printk(KERN_ERR "testdev: alloc_chrdev_region failed\n"); goto err_alloc_chrdev_region; } cdev_init(&testcdev, &test_fops); testcdev.owner = THIS_MODULE; ret = cdev_add(&testcdev, major, 1); if (ret) { printk(KERN_ERR "testdev: cdev_add failed\n"); goto err_cdev_add; } testclass = class_create(THIS_MODULE, CLASS_NAME); if (IS_ERR(testclass)) { printk(KERN_ERR "testdev: class_create failed\n"); ret = PTR_ERR(testclass); goto err_class_create; } device_create(testclass, NULL, major, NULL, DEVICE_NAME); printk(KERN_INFO "testdev: init done\n"); return 0; err_class_create: cdev_del(&testcdev); err_cdev_add: unregister_chrdev_region(major, 1); err_alloc_chrdev_region: return ret; } static void __exit test_exit(void) { device_destroy(testclass, major); class_destroy(testclass); cdev_del(&testcdev); unregister_chrdev_region(major, 1); printk(KERN_INFO "testdev: exit done\n"); } module_init(test_init); module_exit(test_exit); ``` 在编写驱动代码后,需要编写Makefile文件。Makefile文件示例如下: ``` obj-m += testdev.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean ``` 其中,obj-m表示要编译驱动模块文件名,$(shell uname -r)表示当前内核版本号,$(PWD)表示当前目录。 使用make命令编译驱动代码,生成驱动模块文件: ``` $ make ``` 使用insmod命令加载驱动模块: ``` $ sudo insmod testdev.ko ``` 使用rmmod命令卸载驱动模块: ``` $ sudo rmmod testdev ``` 使用dmesg命令查看驱动输出信息: ``` $ dmesg ``` 编写编译Linux驱动需要一定的Linux内核知识和编程经验,建议在学习前先学习Linux内核和Linux编程基础知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值