日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编写SPI DAC驱动程序

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写SPI DAC驱动程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考資料:用戶態調用spidev操作DAC模塊

一、修改設備樹

&spi0 {dac:dac@00{ compatible = "100ask,dac"; reg = <0>;spi-max-frequency = <10000000>;status="okay";}; };

二、編寫驅動程序

#include <linux/init.h> #include <linux/module.h> #include <linux/spi/spi.h> #include <asm/uaccess.h> #include <linux/device.h> #include <linux/of.h>static struct spi_device *dac; static int major;static long spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {int val;int err;int old_val = 0;unsigned char tx_buf[2];unsigned char rx_buf[2];struct spi_message msg;struct spi_transfer xfer[1];int status;memset(&xfer[0], 0, sizeof(xfer));err = copy_from_user(&val, (const void __user *)arg, sizeof(int));printk(KERN_ERR"copy from user %d \n", val);val <<= 2;val &= 0xFFC; //只發送8位tx_buf[0] = (val>>8) & 0xff; //低位在前tx_buf[1] = val & 0xff;xfer[0].tx_buf = tx_buf;xfer[0].rx_buf = rx_buf;xfer[0].len = 2;spi_message_init(&msg);spi_message_add_tail(&xfer[0], &msg);status = spi_sync(dac, &msg);printk(KERN_ERR"spi_sync %d \n", status);old_val = (rx_buf[0]<<8) | (rx_buf[1]); //把讀到的數據返回給應用層old_val >>= 2;err = copy_to_user((void __user*)arg, &old_val, sizeof(int));return 0; }static const struct file_operations spidev_fops = {.owner = THIS_MODULE,.unlocked_ioctl = spidev_ioctl, };static struct class *spidev_class;static const struct of_device_id spidev_dt_ids[] = {{ .compatible = "100ask,dac" },{}, };static int spidev_probe(struct spi_device *spi) {dac = spi;major = register_chrdev(0, "100ask_dac", &spidev_fops);spidev_class = class_create(THIS_MODULE, "100ask_dac");device_create(spidev_class, NULL, MKDEV(major, 0), NULL, "100ask_dac");return 0; }static int spidev_remove(struct spi_device *spi) {device_destroy(spidev_class, MKDEV(major, 0));class_destroy(spidev_class);unregister_chrdev(major, "100ask_dac");return 0; }static struct spi_driver spidev_spi_driver = {.driver = {.name = "100ask_spi_dac_drv",.of_match_table = of_match_ptr(spidev_dt_ids),},.probe = spidev_probe,.remove = spidev_remove, };static int __init spidev_init(void) {int status;status = spi_register_driver(&spidev_spi_driver);if(status < 0) {printk(KERN_ERR"spidev_spi_driver error\n");}return status; } module_init(spidev_init);static void __exit spidev_exit(void) {spi_unregister_driver(&spidev_spi_driver); } module_exit(spidev_exit);MODULE_LICENSE("GPL");

三、編寫應用程序

#include <stdlib.h> #include <fcntl.h> #include <string.h> #include <stdio.h>#include <sys/ioctl.h> #include <sys/types.h> #include <sys/stat.h>#include <linux/types.h>#define SPI_IOC_WR 123int main(int argc, char **argv) {int fd;unsigned int val;int status;unsigned char tx_buf[2];unsigned char rx_buf[2];if(argc != 3) {printf("Usage: %s /dev/100ask_dac <val>\n", argv[0]);return 0;}fd = open(argv[1], O_RDWR);if(fd < 0) {printf("can not open %s\n", argv[1]);return 1;}val = strtoul(argv[2], NULL, 0);status = ioctl(fd, SPI_IOC_WR, &val);if(status < 0) {printf("SPI_IOC_WR\n");return -1;}printf("Pre val = %d\n", val);return 0; }

四、操作過程和結果

[root@firefly-rk3288:/home/picture/spi/dac_drv]# insmod dac_drv.ko [ 456.955496] dac_drv: loading out-of-tree module taints kernel. [root@firefly-rk3288:/home/picture/spi/dac_drv]# ./dac_test /dev/ 100ask_dac loop2 stderr tty33 tty61 ashmem loop3 stdin tty34 tty62 block/ loop4 stdout tty35 tty63 bus/ loop5 tty tty36 tty7 char/ loop6 tty0 tty37 tty8 console loop7 tty1 tty38 tty9 cpu_dma_latency mali0 tty10 tty39 ttyFIQ0 dht11 mapper/ tty11 tty4 ttyS0 disk/ mem tty12 tty40 ttyS1 dri/ memory_bandwidth tty13 tty41 ttyS2 ds18b20 mmcblk0 tty14 tty42 ttyS3 fb0 mmcblk0p1 tty15 tty43 ttyS4 fd/ mmcblk0p2 tty16 tty44 uhid full mmcblk2 tty17 tty45 uinput fuse mmcblk2boot0 tty18 tty46 urandom hdmi_hdcp1x mmcblk2boot1 tty19 tty47 usbmon0 hevc-service mmcblk2rpmb tty2 tty48 usbmon1 hwrng net/ tty20 tty49 usbmon2 i2c-0 network_latency tty21 tty5 usbmon3 i2c-2 network_throughput tty22 tty50 usbmon4 i2c-3 null tty23 tty51 v4l/ i2c-4 ppp tty24 tty52 vcs i2c-6 ptmx tty25 tty53 vcs1 iio:device0 pts/ tty26 tty54 vcsa input/ ram0 tty27 tty55 vcsa1 irda random tty28 tty56 vendor_storage kmsg rfkill tty29 tty57 vhci log rtc tty3 tty58 video0 loop-control rtc0 tty30 tty59 vpu-service loop0 shm/ tty31 tty6 zero loop1 snd/ tty32 tty60 zram0 [root@firefly-rk3288:/home/picture/spi/dac_drv]# ./dac_test /dev/100ask_dac 0 [ 472.618281] copy from user 0 [ 472.622078] spi_sync 0 Pre val = 0 [root@firefly-rk3288:/home/picture/spi/dac_drv]# ./dac_test /dev/100ask_dac 500 [ 475.983460] copy from user 500 [ 475.987103] spi_sync 0 Pre val = 0 [root@firefly-rk3288:/home/picture/spi/dac_drv]# ./dac_test /dev/100ask_dac 1000 [ 479.009154] copy from user 1000 [ 479.013211] spi_sync 0 Pre val = 500 [root@firefly-rk3288:/home/picture/spi/dac_drv]# ./dac_test /dev/100ask_dac 200 [ 482.198009] copy from user 200 [ 482.201851] spi_sync 0 Pre val = 1000 [root@firefly-rk3288:/home/picture/spi/dac_drv]# ./dac_test /dev/100ask_dac 300 [ 484.559005] copy from user 300 [ 484.562844] spi_sync 0 Pre val = 200 [root@firefly-rk3288:/home/picture/spi/dac_drv]# ./dac_test /dev/100ask_dac 400 [ 486.566507] copy from user 400 [ 486.570157] spi_sync 0 Pre val = 300 [root@firefly-rk3288:/home/picture/spi/dac_drv]# ./dac_test /dev/100ask_dac 500 [ 489.214435] copy from user 500 [ 489.218095] spi_sync 0 Pre val = 400 [root@firefly-rk3288:/home/picture/spi/dac_drv]#

總結

以上是生活随笔為你收集整理的编写SPI DAC驱动程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色综合久久久久综合体桃花网 | 视频1区2区 | xxxx性视频| 18禁一区二区| 老妇女av | 亚洲av鲁丝一区二区三区 | 九一国产在线 | 欧美日韩亚洲激情 | 麻豆免费在线观看视频 | 久久久久久久影院 | 特黄特色免费视频 | 日韩av在线直播 | 日本xxxxxxxxx18 | 伊人青草 | 精品国产影院 | 男女激情网址 | 免费观看高清在线 | 97成人免费| 国产精品aⅴ | 国产亚洲精品久久久久婷婷瑜伽 | 一区二区三区免费看视频 | 尹人综合在线 | 欧洲人妻丰满av无码久久不卡 | 日本电影大尺度免费观看 | 成年人小视频在线观看 | 97影院在线午夜 | 少妇在线视频 | 久久久久亚洲AV成人 | 欧美性bbw| 超碰在线免费播放 | 麻豆蜜桃视频 | 男人干女人视频 | 亚洲区av | 日韩av一区二区在线播放 | 美女国产网站 | 尹人成人| 日韩乱码在线观看 | 日韩不卡 | 黄色三级图片 | 亚洲午夜精品久久久久久浪潮 | 国产精品不卡av | 日韩一二三级 | 91丨porny丨中文 | 国产一级二级三级精品 | 中文字字幕 | 天天操精品| 黄色免费av网站 | 国产在线精品一区二区 | 中国美女性猛交 | 国产精品高潮呻吟久久aⅴ码 | 国产欧美一区二区精品性色超碰 | 日韩电影在线一区 | 少妇被爽到高潮动态图 | 欧美少妇一区 | 2021久久| 六月色婷婷 | 在线视频久久 | 波多野结衣中文一区 | 亚洲视频在线观看一区 | 九九热免费在线 | 亚洲av无一区二区三区怡春院 | 日韩精品免费播放 | 黄色a一级视频 | 毛片网止| 亚洲成人三区 | 色图一区 | 在线观看国产精品入口男同 | 91国自产精品中文字幕亚洲 | 手机av免费在线观看 | 99热官网| 国产又粗又猛又黄又爽的视频 | 日本伦理片在线看 | 成人av动漫 | 久久久久亚洲AV成人无码国产 | 日韩成人av网 | 4438成人网| 欧美日韩在线视频免费观看 | 呦女精品| 日韩1024| 337p日本欧洲亚洲大胆精筑 | 亚洲网在线观看 | 亚洲欧美综合精品久久成人 | 午夜伦伦电影理论片费看 | 日韩一区网站 | 九九色网站 | 人妻人人澡人人添人人爽 | jizz网站| 成人在线观看小视频 | 国产精品视频一 | 久久精品噜噜噜成人88aⅴ | 91蜜桃臀久久一区二区 | 激情宗合 | 人妻丰满熟妇无码区免费 | 中文字幕人成 | 成人精品动漫 | www.日本在线视频 | 黄色av网站在线播放 | 日本va欧美va国产激情 | 欧美综合网|