❶ linux下的SPI使用方法是怎样的
如果linux中已经提供了驱动,并且在/dev/目录下已经提供了相应的设备文件节点。那么可以和专串口一样直接打开设属置读写。如果内核中有驱动,但是没有生成设备文件节点,那么只要知道设备的主次设备号,可以使用mknode建立设备文件节点,然后直接来使用。如果没有驱动就需要自己添加设备驱动了。这个也分两种情况,看你外设怎么和你的板子连接的。如果接到板子上的spi控制器上,可以直接编写通过控制器来控制外设的驱动,这种情况一般生产主控芯片的厂家都已经提供了驱动。如果没有接到spi控制器上,而是通过gpio连接的外设,你编写的驱动就需要自己来模拟spi协议来控制外设。
❷ linux用mknod怎么创建设备怎么用
首先要明白什么是设备文件,简单的我们说,操作系统与外部设备(入磁盘驱动器,打印机,modern,终端等等)都是通过设备文件来进行通信的,在Unix/Linux系统与外部设备通讯之前,这个设备必须首先要有一个设备文件,设备文件均放在/dev目录下。一般情况下在安装系统的时候系统自动创建了很多已检测到的设备的设备文件,但有时候我们也需要自己手动创建,命令行生成设备文件的方式有insf,mksf,mknod等等根据mknod命令的使用参数来看【mknodName{b|c}MajorMinor】,使用mknod之前,至少要明白以下几点:设备文件类型:分为块设备和字符设备。ls-l/dev结果显示第一个字段有b***和c****,这里即标识了块设备和字符设备。字符设备文件—-字符设备文件传送数据给设备的时候,一次传送一个字符,终端,打印机,绘图仪,modern等设备都经过字符设备文件传送数据块设备—系统通过块设备文件存取一个设备的时候,先从内存中的buffer中读或写数据,而不是直接传送数据到物理磁盘,这种方式能有效的提高磁盘和CD-ROMS的I/O性能。磁盘和CD-ROMS即可以使用字符设备文件也可使用块设备文件。主号和次号主号:当在任意目录使用ls-l时,结果的第5个字段就是主号,设备主号代表了这个设备使用的是哪个设备驱动程序次号:次号是一个24位的十六进制数字,定义了设个设备在系统中的物理的位置就拿我们常用的创建卷组来看:先来看看mknod命令,如果该设备文件你想放在一个特定的文件夹下当然就先创建文件夹mknod设备文件名[/dev/xyz]b/c主号次号{mkdir/dev/vg01mknod/dev/vg01/groupc640X010000}创建之后,就可以使用你想要创建的设备对于德创建命令了,如我现在的卷组的创建命令:vgcreate/dev/vg01/dev/dsk/c*t*d*一直进行下去,之后的步骤根据不同的设备而不尽相同。
❸ linux SPI驱动,请问有人研究过SPI驱动吗
内核版本抄2.6.30。编进内核袭的SPI驱动,通过看代码我明白了,大致过程是这样: 1、先创建一个spi_board_info结构描述spi设备信息,调用spi_register_board_info将这个结构添加到board_list中。 2、然后调用spi_register_master注册SPI控制器驱动,…
❹ linux自动创建设备文件时:
把你下载的CD即ISO文件,导入到你的虚拟光盘里,打你的VWORK(虚拟机),新建一个虚拟机,属性那里的盘,用你的虚拟光盘(盘符)。一般能行。 请参考
❺ 怎么写linux的spi设备驱动
回复1#我也是新手,不过调通了SPI,在SPI驱动里面是分为设备总线驱动的。。这个你要搞清楚。你所说的几个文件就是在这个层次关系里面的代码,如果你只是简单的使用SPI,内核自带的spidev.c就已经能够满足要求了。。我就这么用的。。。你可以参照内核里面的例程来分析分析。另外,你也可以试着写一个裸驱试试。。。
❻ 请教linux的SPI驱动问题
内核版本来2.6.30。编进内核的SPI驱动源,通过看代码我明白了,大致过程是这样:1、先创建一个spi_board_info结构描述spi设备信息,调用spi_register_board_info将这个结构添加到board_list中。2、然后调用spi_register_master注册SPI控制器驱动,此时会调用scan_boardinfo扫描board_list,根据spi_board_info调用spi_new_device生成spi_device结构,用spi_add_device添加设备。3、调用spi_register_driver注册spi_driver,通过与device匹配驱动设备。
❼ 如何手动创建一个设备节点,写出主要命令及参数
Linux下生成驱动设备节点文件的方法有3个:1、手动mknod;2、利用devfs;3、利用udev在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点。在2.6.17以前,在/dev目录下生成设备文件很容易,devfs_mk_bdevdevfs_mk_cdevdevfs_mk_symlinkdevfs_mk_dirdevfs_remove这几个是纯devfs的api,2.6.17以前可用,但后来devfs被sysfs+udev的形式取代,同时期sysfs文件系统可以用的api:class_device_create_file,在2.6.26以后也不行了,现在,使用的是device_create ,从2.6.18开始可用struct device *device_create(struct class *class, struct device *parent,dev_t devt, const char *fmt, …)从2.6.26起又多了一个参数drvdata: the data to be added to the device for callbacks不会用可以给此参数赋NULLstruct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, …) 下面着重讲解第三种方法udev在驱动用加入对udev的支持主要做的就是:在驱动初始化的代码里调用class_create(…)为该设备创建一个class,再为每个设备调用device_create(…)( 在2.6较早的内核中用class_device_create)创建对应的设备。内核中定义的struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_create(…)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用 device_create(…)函数来在/dev目录下创建相应的设备节点。这样,加载模块的时候,用户空间中的udev会自动响应 device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。struct class和class_create(…) 以及device_create(…)都包含在在/include/linux/device.h中,使用的时候一定要包含这个头文件,否则编译器会报错。struct class定义在头文件include/linux/device.h中class_create(…)在/drivers/base/class.c中实现device_create(…)函数在/drivers/base/core.c中实现class_destroy(…),device_destroy(…)也在/drivers/base/core.c中实现调用过程类似如下:static struct class *spidev_class; /*————————————————————————-*/ static int __devinit spidev_probe(struct spi_device *spi){ …. dev =device_create(spidev_class, &spi->dev, spidev->devt, spidev, "spidev%d.%d", spi->master->bus_num, spi->chip_select); …} static int __devexit spidev_remove(struct spi_device *spi){ …… device_destroy(spidev_class, spidev->devt); ….. return 0;} static struct spi_driver spidev_spi = { .driver = { .name = "spidev", .owner = THIS_MODULE, }, .probe = spidev_probe, .remove = __devexit_p(spidev_remove), }; /*————————————————————————-*/ static int __init spidev_init(void){ …. spidev_class =class_create(THIS_MODULE, "spidev"); if (IS_ERR(spidev_class)) { unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name); return PTR_ERR(spidev_class); } ….}mole_init(spidev_init); static void __exit spidev_exit(void){ …… class_destroy(spidev_class); ……}mole_exit(spidev_exit); MODULE_DESCRIPTION("User mode SPI device interface");MODULE_LICENSE("GPL"); 下面以一个简单字符设备驱动来展示如何使用这几个函数 #include <linux/mole.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/device.h> int HELLO_MAJOR = 0;int HELLO_MINOR = 0;int NUMBER_OF_DEVICES = 2; struct class *my_class;//struct cdev cdev;//dev_t devno; struct hello_dev {struct device *dev;dev_t chrdev;struct cdev cdev;};static struct hello_dev *my_hello_dev = NULL;struct file_operations hello_fops = { .owner = THIS_MODULE}; static int __init hello_init (void){int err = 0;struct device *dev;my_hello_dev = kzalloc(sizeof(struct hello_dev), GFP_KERNEL);if (NULL == my_hello_dev) {printk("%s kzalloc failed!\n",__func__);return -ENOMEM;}devno = MKDEV(HELLO_MAJOR, HELLO_MINOR);if (HELLO_MAJOR)err= register_chrdev_region(my_hello_dev->chrdev, 2, "memdev");else{err = alloc_chrdev_region(&my_hello_dev->chrdev, 0, 2, "memdev");HELLO_MAJOR = MAJOR(devno);} if (err) {printk("%s alloc_chrdev_region failed!\n",__func__);goto alloc_chrdev_err;}printk("MAJOR IS %d\n",HELLO_MAJOR);cdev_init(&(my_hello_dev->cdev), &hello_fops);my_hello_dev->cdev.owner = THIS_MODULE;err = cdev_add(&(my_hello_dev->cdev), my_hello_dev->chrdev, 1);if (err) {printk("%s cdev_add failed!\n",__func__);goto cdev_add_err;}printk (KERN_INFO "Character driver Registered\n");my_class =class_create(THIS_MODULE,"hello_char_class"); //类名为hello_char_classif(IS_ERR(my_class)) {err = PTR_ERR(my_class);printk("%s class_create failed!\n",__func__);goto class_err;}dev = device_create(my_class,NULL,my_hello_dev->chrdev,NULL,"memdev%d",0); //设备名为memdevif (IS_ERR(dev)) {err = PTR_ERR(dev);gyro_err("%s device_create failed!\n",__func__);goto device_err;}printk("hello mole initialization\n");return 0; device_err:device_destroy(my_class, my_hello_dev->chrdev);class_err:cdev_del(my_hello_dev->chrdev);cdev_add_err:unregister_chrdev_region(my_hello_dev->chrdev, 1);alloc_chrdev_err:kfree(my_hello_dev);return err;} static void __exit hello_exit (void){cdev_del (&(my_hello_dev->cdev));unregister_chrdev_region (my_hello_dev->chrdev,1);device_destroy(my_class, devno); //delete device node under /dev//必须先删除设备,再删除class类class_destroy(my_class); //delete class created by usprintk (KERN_INFO "char driver cleaned up\n");} mole_init (hello_init);mole_exit (hello_exit); MODULE_LICENSE ("GPL");这样,模块加载后,就能在/dev目录下找到memdev这个设备节点了。 例2:内核中的drivers/i2c/i2c-dev.c在i2cdev_attach_adapter中调用device_create(i2c_dev_class, &adap->dev, MKDEV(I2C_MAJOR, adap->nr), NULL, "i2c-%d", adap->nr);这样在dev目录就产生i2c-0 或i2c-1节点 接下来就是udev应用,udev是应用层的东西,udev需要内核sysfs和tmpfs的支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提供存放空间udev的源码可以在去相关网站下载,然后就是对其在运行环境下的移植,指定交叉编译环境,修改Makefile下的CROSS_COMPILE,如为mipsel-linux-,DESTDIR=xxx,或直接make CROSS_COMPILE=mipsel-linux-,DESTDIR=xxx 并install把主要生成的udevd、udevstart拷贝rootfs下的/sbin/目录内,udev的配置文件udev.conf和rules.d下的rules文件拷贝到rootfs下的/etc/目录内并在rootfs/etc/init.d/rcS中添加以下几行:echo “Starting udevd…”/sbin/udevd –daemon/sbin/udevstart(原rcS内容如下:# mount filesystems/bin/mount -t proc /proc /proc/bin/mount -t sysfs sysfs /sys/bin/mount -t tmpfs tmpfs /dev# create necessary devices/bin/mknod /dev/null c 1 3/bin/mkdir /dev/pts/bin/mount -t devpts devpts /dev/pts/bin/mknod /dev/audio c 14 4/bin/mknod /dev/ts c 10 16)这样当系统启动后,udevd和udevstart就会解析配置文件,并自动在/dev下创建设备节点文件