在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ADC/DAC芯片pcf8591的linux驅動的幾種實現方案

冬至子 ? 來源:嵌入式ABC ? 作者:小魚 ? 2023-10-17 11:14 ? 次閱讀

下面是PCF8591的介紹:

PCF8591 是一個單片集成、單獨供電、低功耗、8-bit CMOS數據獲取器件。PCF8591 具有 4 個模擬輸入、1 個模擬輸出和 1個串行 I2C 總線接口。PCF8591 的 3 個地址引腳 A0, A1 和 A2 可用于硬件地址編程,允許在同個 I2C 總線上接入 8 個 PCF8591 器件,而無需額外的硬件。在 PCF8591 器件上輸入輸出的地址、控制和數據信號都是通過雙線雙向 I2C 總線以串行的方式進行傳輸。

下圖是PCF8591的框圖

圖片

本篇討論其linux驅動的以下幾種實現方式

  • Hardware Monitoring framework (hwmon)
  • 雜項字符設備 (misc)
  • 通過memmap, IOmap在用戶空間直接操作processor i2c
  • Industrial IO framework (iio)

通過hwmon框架實現

在linux中已經支持通過hwmon框架方式實現pcf8591驅動的代碼。

下面只貼出部分代碼,具體請參見鏈接

static int pcf8591_probe(struct i2c_client *client,
       const struct i2c_device_id *id)
{
  struct pcf8591_data *data;
  int err;


  data = devm_kzalloc(&client- >dev, sizeof(struct pcf8591_data),
          GFP_KERNEL);
  if (!data)
    return -ENOMEM;


  i2c_set_clientdata(client, data);
  mutex_init(&data- >update_lock);


  /* Initialize the PCF8591 chip */
  pcf8591_init_client(client);


  /* Register sysfs hooks */
  err = sysfs_create_group(&client- >dev.kobj, &pcf8591_attr_group);
  if (err)
    return err;


  /* Register input2 if not in "two differential inputs" mode */
  if (input_mode != 3) {
    err = device_create_file(&client- >dev, &dev_attr_in2_input);
    if (err)
      goto exit_sysfs_remove;
  }


  /* Register input3 only in "four single ended inputs" mode */
  if (input_mode == 0) {
    err = device_create_file(&client- >dev, &dev_attr_in3_input);
    if (err)
      goto exit_sysfs_remove;
  }


  data- >hwmon_dev = hwmon_device_register(&client- >dev);
  if (IS_ERR(data- >hwmon_dev)) {
    err = PTR_ERR(data- >hwmon_dev);
    goto exit_sysfs_remove;
  }


  return 0;


exit_sysfs_remove:
  sysfs_remove_group(&client- >dev.kobj, &pcf8591_attr_group_opt);
  sysfs_remove_group(&client- >dev.kobj, &pcf8591_attr_group);
  return err;
}








static const struct i2c_device_id pcf8591_id[] = {
  { "pcf8591", 0 },
  { }
};
MODULE_DEVICE_TABLE(i2c, pcf8591_id);


static struct i2c_driver pcf8591_driver = {
  .driver = {
    .name  = "pcf8591",
  },
  .probe    = pcf8591_probe,
  .remove    = pcf8591_remove,
  .id_table  = pcf8591_id,
};


static int __init pcf8591_init(void)
{
  if (input_mode < 0 || input_mode > 3) {
    pr_warn("invalid input_mode (%d)n", input_mode);
    input_mode = 0;
  }
  return i2c_add_driver(&pcf8591_driver);
}


static void __exit pcf8591_exit(void)
{
  i2c_del_driver(&pcf8591_driver);
}


MODULE_AUTHOR("Aurelien Jarno < aurelien@aurel32.net >");
MODULE_DESCRIPTION("PCF8591 driver");
MODULE_LICENSE("GPL");


module_init(pcf8591_init);
module_exit(pcf8591_exit);

圖片

在編譯內核modules需要把模塊添加進去,或者單獨編譯好模塊再復制到樹莓派版中。

下圖為通過menuconfig配置模塊: 圖中“Philips PCF8591 ADC/DAC"選項

圖片

安裝模塊驅動

sudo insmod pcf8591.ko

安裝后可以在sysfs下查看,/sys/bus/i2c/drivers下多了一個pcf8591, 見下圖:

圖片

文中提到了hwmon設備常通過i2cbus探測的方式。但是我們卻可以看到pcf8591.c中并沒有detect函數:

static struct i2c_driver pcf8591_driver = {
  .driver = {
    .name  = "pcf8591",
  },
  .probe    = pcf8591_probe,
  .remove    = pcf8591_remove,
  .id_table  = pcf8591_id,
};

這是因為pcf8591沒有“制造商和設備ID寄存器”。

因此我們可以通過方式1,方式2和方式4

  • 方法1:靜態聲明I2C設備
    • 通過devicetree聲明I2C設備
    • 在板級文件中聲明I2C設備
  • 方法2:顯式實例化設備
  • 方法3:對某些設備進行I2C總線探測
  • 方法4:從用戶空間實例化

為了避免麻煩,這里就選擇方法4。

先查看地址,然后通過sysfs, new_device的方式實例化(參見上篇)

圖片

圖片

實例化成功后,如上圖,便可以通過sysfs來獲取adc的值,以及設置dac的值。

cat /sys/class/hwmon/hwmon1/device/in0_input

**misc驅動框架實現 **

misc的意思是混合、雜項的,因此MISC驅動也叫做雜項驅動,也就是當我們板子上的某些外設無法進行分類的時候就可以使用MISC驅動。misc設備也是一個字符設備,在misc的初始化函數中注冊了一個字符設備,主設備號為MISC_MAJOR (10)。

驅動分為兩部分:i2c設備驅動,i2c設備顯式實例化

在i2c設備顯示實例化中調用,i2c_new_probed_device函數

i2c_new_probed_device(i2c_adap,&i2c_info,i2c_addr_list,NULL);

在某些設備中,比如需要后期插入i2c模塊板,而預先不知道I2C總線的編號,則可以顯式地實例化I2C設備。這是通過填充結構體i2c_board_info并調用i2c_new_client_device()來完成。

如下圖,分別將,i2c設備驅動,i2c設備顯式實例化,編譯成pcf8591.ko 和pcf8591_dev.ko, 然后通過Insmod加載

圖片

再另外編寫應用代碼,open misc設備,進行讀寫操作。

通過memmap, IOmap在用戶空間直接操作processor i2c

樹莓派的一些庫,如bcm2835, wiringpi等

/* Open the master /dev/mem device */
      if ((memfd = open("/dev/mem", O_RDWR | O_SYNC) ) < 0)
    {
      fprintf(stderr, "bcm2835_init: Unable to open /dev/mem: %sn",
          strerror(errno)) ;
      goto exit;
    }


      /* Base of the peripherals block is mapped to VM */
      bcm2835_peripherals = mapmem("gpio", bcm2835_peripherals_size, memfd, (off_t)bcm2835_peripherals_base);
      if (bcm2835_peripherals == MAP_FAILED) goto exit;


      /* Now compute the base addresses of various peripherals,
      // which are at fixed offsets within the mapped peripherals block
      // Caution: bcm2835_peripherals is uint32_t*, so divide offsets by 4
      */
      bcm2835_gpio = bcm2835_peripherals + BCM2835_GPIO_BASE/4;
      bcm2835_pwm  = bcm2835_peripherals + BCM2835_GPIO_PWM/4;
      bcm2835_clk  = bcm2835_peripherals + BCM2835_CLOCK_BASE/4;
      bcm2835_pads = bcm2835_peripherals + BCM2835_GPIO_PADS/4;
      bcm2835_spi0 = bcm2835_peripherals + BCM2835_SPI0_BASE/4;
      bcm2835_bsc0 = bcm2835_peripherals + BCM2835_BSC0_BASE/4; /* I2C */
      bcm2835_bsc1 = bcm2835_peripherals + BCM2835_BSC1_BASE/4; /* I2C */
      bcm2835_st   = bcm2835_peripherals + BCM2835_ST_BASE/4;
      bcm2835_aux  = bcm2835_peripherals + BCM2835_AUX_BASE/4;
      bcm2835_spi1 = bcm2835_peripherals + BCM2835_SPI1_BASE/4;

效率比較

下圖為使用misc設備驅動,在應用代碼中進行1ms采樣時,cpu的占用率5.2%。

圖片

而使用bcm2835庫進行10ms周期的采樣時,cpu的占用率52.1%。

圖片

IIO

IIO 全稱是 Industrial I/O,當你使用的傳感器本質是 ADC 或 DAC 器件的時候,可以優先考慮使用 IIO 驅動框架。比如常用的陀螺儀、加速度計、電壓/電流測量芯片、光照傳感器、壓力傳感器等內部都是有個 ADC,內部 ADC 將原始的模擬數據轉換為數字量,然后通過其他的通信接口,比如 IIC、SPI 等傳輸給 SOC。Linux 內核為了管理這些日益增多的 ADC 類傳感器,特地推出了 IIO 子系統。

iio 支持多種標準的 Linux 設備訪問接口:char device, sysfs, configfs, debugfs。

IIO的4種接口

1). sysfs interface

  • /sys/bus/iio/devices/iio:deviceX;
  • 可用于配置 /dev/iio:deviceX 接口的 events / data
  • 可用于輪循的方式低速地直接讀/寫 IIO 設備;
  • Documentation/ABI/testing/sysfs-bus-iio;

2). character device

  • /dev/iio:deviceX,該接口在 IIO 子系統里是可選非必要的;
  • 標準的文件 IO API: open(), read(), write(), close().
  • 用于讀取 events 和 data;

3). configfs

  • 用于配置額外的 IIO 特性,例如:軟件 triggers 或者 hrtimer triggers;
  • 詳細說明:
    • Documentation/ABI/testing/configfs-iio;
    • Documentation/iio/iio_configfs.txt;

4). debugfs

  • 一些調試功能,例如 direct_reg_access 節點可用于讀寫寄存器;

具體的代碼實現便不再花時間了,可以參考drivers下iio部分代碼。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • adc
    adc
    +關注

    關注

    99

    文章

    6537

    瀏覽量

    545878
  • CMOS器件
    +關注

    關注

    0

    文章

    71

    瀏覽量

    11575
  • DAC芯片
    +關注

    關注

    1

    文章

    32

    瀏覽量

    14719
  • Linux驅動
    +關注

    關注

    0

    文章

    43

    瀏覽量

    10026
  • 樹莓派
    +關注

    關注

    117

    文章

    1710

    瀏覽量

    105897
  • PCF8591芯片
    +關注

    關注

    2

    文章

    8

    瀏覽量

    7395
收藏 人收藏

    評論

    相關推薦

    PCF8591的端口地址

    PCF8591代替DAC0832做D/A轉換,完成函數發生器,PCF8591的端口地址是什么?
    發表于 01-10 19:09

    PCF8591 DA轉換

    想通過PCF8591芯片 進行DA轉換 在1V開始 隔一秒輸出加1V 應該怎么寫程序 沒弄懂PCF8591的工作原理還望大神賜教
    發表于 10-04 16:09

    藍橋杯單片機——PCF8591 ADC/DAC模塊 精選資料分享

    。模擬電壓輸入電路圖:硬件上旋動Rb2旋鈕,即可改變模擬電壓的輸入值。光強電阻電壓輸入電路圖:光敏電阻值的改變,影響該模擬電壓通道的輸入值。ADC/DAC模塊驅動配置PCF8591采用
    發表于 07-19 07:41

    PCF8591是什么?怎樣去設計PCF8591電路?

    PCF8591是什么?怎樣去設計PCF8591電路?如何去編寫ADC/DAC模塊函數代碼?
    發表于 07-19 08:56

    單片機PCF8591DAC是怎么使用的?

    單片機PCF8591DAC是怎么使用的?
    發表于 09-29 08:13

    怎樣通過pcf8591芯片實現AD/DA轉換

    藍橋杯單片機比賽系列AD/DA轉換AD/DA原理相關電路pcf8591器件地址代碼解釋修改代碼AD自寫代碼ADDAAD/DA原理相關電路通過pcf8591芯片實現ad轉換。板子上ad采
    發表于 01-11 08:02

    PCF8591ADCDAC分別是什么意思

    PCF8591ADCDAC分別是什么意思?它們之間有何關系呢?
    發表于 02-14 07:36

    PCF8591驅動程序

    PCF8591驅動程序 51單片機程序
    發表于 08-31 16:11 ?30次下載

    PCF8591 ADCDAC芯片的數據手冊免費下載

    本文檔的主要內容詳細介紹的是PCF8591 ADCDAC芯片的數據手冊免費下載主要內容包括了:YL-40 AD模塊使用說明,四路采集串口顯示程序,Commix串口調試助手,YL-40
    發表于 07-15 08:00 ?71次下載
    <b class='flag-5'>PCF8591</b> <b class='flag-5'>ADC</b>和<b class='flag-5'>DAC</b><b class='flag-5'>芯片</b>的數據手冊免費下載

    微雪電子ADC DAC AD DA轉換PCF8591 PCF8591T簡介

    PCF8591 AD DA轉換模塊 I2C接口 8位精度 四通道AD 單通道DA 電壓輸出型 型號 PCF8591 AD DA Board
    的頭像 發表于 12-30 09:59 ?3338次閱讀
    微雪電子<b class='flag-5'>ADC</b> <b class='flag-5'>DAC</b> AD DA轉換<b class='flag-5'>PCF8591</b> <b class='flag-5'>PCF8591</b>T簡介

    PCF8591的原理圖與電路圖解析

    PCF8591是一個單電源低功耗的8位CMOS數據采集器件,其接口電路的工作原理圖,PCF8591原理圖與PCF8591電路圖。
    的頭像 發表于 02-20 01:18 ?4.9w次閱讀
    <b class='flag-5'>PCF8591</b>的原理圖與電路圖解析

    藍橋杯單片機——PCF8591 ADC/DAC模塊

    。模擬電壓輸入電路圖:硬件上旋動Rb2旋鈕,即可改變模擬電壓的輸入值。光強電阻電壓輸入電路圖:光敏電阻值的改變,影響該模擬電壓通道的輸入值。ADC/DAC模塊驅動配置PCF8591采用
    發表于 11-17 11:06 ?10次下載
    藍橋杯單片機——<b class='flag-5'>PCF8591</b> <b class='flag-5'>ADC</b>/<b class='flag-5'>DAC</b>模塊

    PCF8591 ADC與Arduino連接的方法

    在本教程中,我們將檢查 如何將 PCF8591 ADC/DAC 模塊與 Arduino 連接。
    發表于 08-26 15:18 ?4178次閱讀
    將<b class='flag-5'>PCF8591</b> <b class='flag-5'>ADC</b>與Arduino連接的方法

    如何將PCF8591 ADC模塊與Raspberry Pi連接

     在本教程中,我們將學習如何將 PCF8591 ADC/DAC 模塊與 Raspberry Pi 連接。
    的頭像 發表于 08-26 15:58 ?4326次閱讀
    如何將<b class='flag-5'>PCF8591</b> <b class='flag-5'>ADC</b>模塊與Raspberry Pi連接

    Linux驅動開發-編寫PCF8591(ADC)芯片驅動

    PCF8591是一個IIC總線接口的ADC/DAC轉換芯片,功能比較強大,這篇文章就介紹在Linux系統里如何編寫一個
    的頭像 發表于 09-17 15:16 ?2219次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>驅動</b>開發-編寫<b class='flag-5'>PCF8591</b>(<b class='flag-5'>ADC</b>)<b class='flag-5'>芯片</b><b class='flag-5'>驅動</b>
    主站蜘蛛池模板: 日本色图网站 | av手机在线播放 | 黑人干亚洲 | 丁香花高清在线观看 | 99久免费精品视频在线观看2 | 成 人 免费 网站 | 亚洲国产精品网站久久 | 免费看黄色网页 | 韩国xxxxxxxx69| 欧美怡红院免费全部视频 | 亚洲成人精品在线 | 性过程很黄的小说男男 | 一级片在线播放 | 免费黄色在线视频 | 午夜视频1000部免费看 | 成人免费久久精品国产片久久影院 | 国产精品黄页网站在线播放免费 | 狠狠干网站| 激情六月天婷婷 | 四虎4hu影库免费永久国产 | yezhulu在线永久网址yellow | 午夜免费伦费影视在线观看 | 91po狼人社在线观看 | 美女视频黄色的免费 | 日本特黄特色 | tom影院亚洲国产日本一区 | 特级黄视频 | 人人草人人插 | 久久国产精品夜色 | 黄色福利小视频 | 在线种子搜索 | 天天干天天操天天做 | 免费一级毛毛片 | 老色批在线播放视频网站免费 | 两性色午夜视频免费国产 | 天天射天| 99久久99这里只有免费费精品 | 天天舔天天操天天干 | 国产一二精品 | 国模最新私拍视频在线观看 | 欲色淫香|