ai代码如下
#include <Arduino.h>
#define SLAVE_ID 15
#define BAUDRATE 2400
#define TIMEOUT 1000
#define TX_ENABLE_PIN 4
// MODBUS function codes
#define READ_HOLDING_REGISTERS 0x03
// Registers addresses
#define ADDR_ENERGY 0x0000
#define ADDR_VOLTAGE 0x0300
#define ADDR_CURRENT 0x0303
#define ADDR_POWER 0x0306
// Registers lengths
#define LEN_ENERGY 2
#define LEN_VOLTAGE 1
#define LEN_CURRENT 1
#define LEN_POWER 1
void setup() {
Serial.begin(BAUDRATE, SERIAL_8E1); // 偶校验
pinMode(TX_ENABLE_PIN, OUTPUT);
}
void loop() {
float energy = readRegister(ADDR_ENERGY, LEN_ENERGY) * 0.01; // kWh
float voltage = readRegister(ADDR_VOLTAGE, LEN_VOLTAGE) * 0.1; // V
float current = readRegister(ADDR_CURRENT, LEN_CURRENT) * 0.01; // A
float power = readRegister(ADDR_POWER, LEN_POWER) * 0.01; // kW
if (current > 1.0) {
digitalWrite(TX_ENABLE_PIN, HIGH);
} else {
digitalWrite(TX_ENABLE_PIN, LOW);
}
// 延时一段时间后再次读取
delay(5000);
}
long readRegister(unsigned int addr, unsigned char len) {
unsigned char buf[8];
buf[0] = SLAVE_ID; // Slave Address
buf[1] = READ_HOLDING_REGISTERS; // Function Code
buf[2] = highByte(addr); // Starting Address High
buf[3] = lowByte(addr); // Starting Address Low
buf[4] = 0x00; // Number of Registers High
buf[5] = len; // Number of Registers Low
unsigned int crc = calculateCRC(buf, 6);
buf[6] = lowByte(crc); // CRC Low
buf[7] = highByte(crc); // CRC High
sendRequest(buf, 8);
delay(100);
if (Serial.available()) {
// Read the response
// TODO: Add code to parse the response
}
return 0; // Placeholder for actual value
}
void sendRequest(unsigned char *packet, unsigned char packetLength) {
digitalWrite(TX_ENABLE_PIN, HIGH);
for (unsigned char i = 0; i < packetLength; i++) {
Serial.write(packet[i]);
}
Serial.flush();
digitalWrite(TX_ENABLE_PIN, LOW);
}
unsigned int calculateCRC(unsigned char *buf, unsigned char len) {
unsigned int crc = 0xFFFF;
for (unsigned int pos = 0; pos < len; pos++) {
crc ^= (unsigned int)buf[pos];
for (int i = 8; i != 0; i--) {
if ((crc & 0x0001) != 0) {
crc >>= 1;
crc ^= 0xA001;
} else {
crc >>= 1;
}
}
}
return crc;
}
我也是要读这个电表,真是太tmd坎坷了。
本来用的天问的asrpro模块,想着它带喇叭可以语音说话,我想做个当电流超多少时自动语音报警(因为家里是速热热水器,开起来最大到32A,我限制了水流到20A,家里总断路器才32A的,如果这时候烧水或是干啥容易超电流跳闸,我自己会注意,家人不太懂电这东西),结果他们的芯片有问题,偶校验2400波特率走modbus模块,发送数据是正常的,但收数据就是大概率误码,如果我读电量,电流电压功率,大概率电压能读出来,如果我只读电压,是一次正确一次误码。后来测试自收自发还误码,真狗,浪费了2天休息日的大好时光。然后图省事,试了试手里的arduino nano,和nodemcu8266,但都是只有一个串口,没法看调试信息,后来用nano那一个串口测试,和esp8266测试,都是用的arduino,也是不行,真狗,这两个模块用示波器测了下,原来是rx脚被板载USB串口芯片的tx拉高了,果断把nano上的ch340焊下来。果然好了,太tm坎坷了。
代码我是直接对AI提的编程需求,粘上就能用。问法如下。我的硬件是Arduino Nano。我需要使用串口以MODBUS RTU协议读取电表的电压 电流 功率 电量。电量的地址是0x0000,数据长度为2。电压的地址是0x0300,数据长度为1。电流的地址是0x0303,数据长度为1。功率的地址是0x0306,数据长度为1。modbus的读参量用03H号命令。电表的modbus地址为15。电量数据是高位在前,低位在后,若读出值为0012D687H(1234567),则电能计量值为 1234567×0.01=12345.67kWh。电能表中所测电压值固定为 1 位小数,数据格式为 XXX.X,单位为 V,若通讯读出,电压值为 0897H(2199),则电压的实际值为 219.9V;所测电流值固定为 2 位小数数据格式为 XXX.XX,单位 A,若通讯读出电流值为 0096H(150), 则电流的实际值为 1.50A。电能表的有功率值固定为 2 位小数,数据格式为 XXX.XX,单位为 kW, 若通讯读出有功功
率值为 0020H(32),则有功率的实际值为 0.32kW。 帮我写出对应功能的arduino程序。 调试信息不打印。注意,接电表的串口使用偶校验。当电流大于1A时,控制4脚输出高,低于1A时输出低。请不要使用modbus库,请使用代码实现modbus的发送及接收。
最近看到这个开源项目挺不错的
https://github.com/scottbez1/smartknob
志辉那个FOC嘛,一样的功能。
考虑再加一块屏幕
1.PDA手持机
之前考虑是用f1c200s做,当时是看中了芯片便宜,才12.5元。
现在贵了,也就没动力做了,而且资源也不丰富,
引脚紧缺,跑Linux可玩的东西,内存64MB太小,USB不能接hub的缺陷严重,
结构有些复杂。
种种原因,一直处于鸽的状态。
若是用A133 4G做PDA,可玩性就比较高了,也不用担心资源问题。
价格还不算太贵,最小系统140块的样子。
2.家用智能屏
样式最好是相框的形式,可以挂在墙上,
通过感知人是否在家,来将结婚照片或名画等循环显示。
还可以做语音交互的东西,
天气,情况,
地图路线,
语音定闹钟提醒,日历事件提醒,大事件新闻提醒等等。
这个也用A133+4G来做应该也够用的
多谢大佬分享,是个参考项!
SN65LVDS049 这个应该正好
http://www.ti.com/cn/lit/gpn/sn65lvds049
我看了TI的lvds类转换芯片,价格比较贵,所以排除了。
出发点:需要做个可扩展的控制器,类似PLC,IO点不够可以增加扩展模块来扩充IO,没有485等串口,可以增加扩展模块来扩充。
西门子 PLC图片如下:
CPU主控打算用全志T113系列,
考虑扩展模块上芯片不会用太高端,所以只能从UART、SPI、I2C、RS485、CAN这类的去考虑,
1、需要多从机
2、需要高速
3、需要远距离抗干扰,比如CPU挂10个扩展模块,线长都出去了半米了。
综合考虑,T113处选择SPI接口,
使用将SPI改为3线,使用CLK、MOSI、MISO
考虑远距离传输的抗干扰性,将3根信号线变为差分信号。
T113连接CPLD,CPLD将单端信号变为两个端口输出,来模拟差分线。
在接收端,使用高速比较器进行接收数据,市面在售的7ns比较器比较便宜。
增加总线的地址机制,每个从设备都有地址,当收到自己地址的数据需要发送时才会进行发送,否则发送为高阻态。
下面是初版设计原理图,
将本固件功能做成windows上的UI软件,方便大家使用。
DKTool2021哇酷网特别版.7z
由于项目需要,以及市面上各种难用的模块,不得不自己造轮子。
先从需求说起,需求就是以太网IO模块、光源控制器、相机触发模块多种用途的一个小模块。
考虑到以太网的需求,采用CH579M是最好不过的了。
对于输入采集,直接用光耦就好了,这个简单。
主要是输出,想弄高边输出,而不是开漏输出。
对于开漏输出,基本都是下图这种形式。
想做高边输出,比如用PMOS,IRF9540N这个管子便宜还普及,感觉比较好。
但遇到了个问题,我想应用于电源电压12V、24V、32V都能用的场景。
网上大多数关于PMOS的驱动电路都是这个样子的:
栅极耐压是±20V,用24V或32V的话直接将栅极拉低到GND其实是超压了。
又找到类似这样的电路,通过电阻分压的方式可以控制PMOS,但大多都是用作高边电源开关,
不能用作PWM输出,因为分压电阻的阻值比较大,给PWM会使得MOS大部分出于临界状态,发热严重直至烧毁。
我想搜一些高边PWM输出的电路怎么驱动,啥都没有,居然搜到了PMOS高速PWM输出的专利....
关于高边输出,卡了半年,也就是一直没有进行。
得把flash拆了吧,这条不能没有
抱歉,忘记了老贴了,最新版本是哇酷特别版,没有过期。
链接在这 https://whycan.com/t_5733.html
随便画的
文件在这立创EDA工程Project_远程开机卡LAN_2021-01-19_22-08-51.rar
软件使用sunxi-fel为烧写工具,可以读写w25qxx系列的芯片,可以读写DDR和寄存器。
更添加了晕哥的大招,可以将板载TF 、EMMC、SD NAND、W25Qxx系列Nor Flash 模拟成U盘。使用win32diskimager进行烧录。
同时一键打开任务管理器,设备管理器,可方便查看COM口。
只有一个exe文件,方便使用。
内置Win32DiskImager,用于烧写模拟成U盘的设备。
内置Zadig驱动安装工具,
内置Putty终端调试软件。
内置F1C200S的数据手册和用户手册。
下载地址:DKTool哇酷网特别版--密码是哇酷网址.rar (解压密码: whycan.cn)
下载的留个言,支持下。
软件随便用,个人用或者公司用,附图软件工具时,需要与作者协商,软件版权归迪卡所有。
可以定制软件功能。
以下由 @哇酷小二 添加:
----------------------------
解压密码: whycan.cn
##############
#####显示屏#####
##############
显示屏部分呢,用的是一个MIPI+RGB的显示屏,按照配置接法是RGB模式。
供电来自AXP199的3.3V,和SOC的3.3V共用,
这个屏需要初始化,
涉及
LCD_CS
LCD_SCL
LCD_SDA
实际上呀,他是按照SPI走的,但屏厂为啥按照I2C的命名就不懂了。不管它,反正按照屏厂的初始化代码拉IO就行了。
LCD_RST是复位屏控制器的,这种无关紧要的我就给到AXP199去控制。
背光,一定要注意输出端用的电容耐压值,
这个升压能达到50V,!!!
电源来自AXP199的IPSOUT,背光控制由N76E003来控制,因为AXP199的PWM的高电平是2.5V.
最难搞定的就是IO的分配,每个小功能倒是能确定的了。
一个一个来。先从电容触摸屏开始。
##############
####电容触摸#####
##############
I2C接口是连接F1C200S和N76E003和AXP199还有这个电容触摸的,还有摄像头!!!。
供电取自N76E003的供电,因为主控有掉电状态,考虑可以双击触摸屏来启动相关操作。
N76E003的供电直接来自电池然后LDO3.3
CTP_EINT是触摸中断,当你的手点到屏幕时,会持续触发中断,你快速的点一下,就能达到几十甚至上百个中断。
我将中断连接到N76E003,而不是给F1C200S,因为F1C200S只有1个脚可以用来做中断了。
N76E003也起到中断控制器的作用......任务艰巨,不仅管按键,还管电源,还管中断。
CTP_RST是电容触摸的复位,这个无关紧要,但还是加上,所以给到了AXP199去控制。
写帖子时候,不能看到图片,不好说明,在此说明一下。
CH340->MCUTTL MCUTTL->CH340
是我标注串口的习惯,免得TX RX搞反了,我直接标注谁到谁。
这个串口的用途是,
1.更新MCU的固件
N76E003出厂不内置bootloader,所以需要先用ICP烧写一下。之后就可以用串口进行烧写了。
2.调试MCU程序使用,看串口信息来调试MCU程序(在PDA已经封装成整机的情况下)
3.PC上位机通过该串口,获得版本号或是状态,可以设置让soc复位,或者让soc复位到fel模式,只要MCU能控制采集的东西,都可以搞。
BAT_ADC
单片机的ADC脚去采集电池电压,当然是电阻分压出来的,不用太精确,别太没电了就行,有个采集,在界面上可以显示下电量。
LCD_CS LCD_SDA LCD_SCL LCD_RST
这4个脚是初始化LCD显示屏用的,LCD默认是MIPI模式,需要通过SPI接口去初始化变成RGB模式。我也不懂为啥屏厂对SPI脚的命名方式和I2C一样
ICP_DAT ICP_CLK ICP_RST
这3个脚是烧录单片机用的,ICP烧录接口,包括复位
在这里,LCD_CS和ICP_DAT复用了,但没有问题;在烧录bootloader的时候,屏幕排线是不插的。
SW A B
这3个脚是滚轮编码器的3个脚,我接了中断脚。这个滚轮编码器真是漂亮啊,但是也真贵 9块钱一个!
CTP_EINT
这个脚是电容屏触摸中断脚,我已经用单片机试过了,如果你用手摸电容板的话,这个脚会一直脉冲输出,哪怕我以最快的速度点一下屏幕,都好几十个中断。
长按一会就好多万。
我是通过单片机转一下这个中断,再到F1C200S。F1C200S的SOCEINT检测到中断后,先I2C读N76E003,到底是哪个脚发生了中断。
TWI0_SDA TWI0_SCK
这两个脚就是上面说的,F1C200S要I2C去读单片机,到底是什么中断发生了。还可以通过I2C去读电池电压等,去设置屏幕PWM背光,亮屏关屏等MCU可以干的事。
SOCEINT
F1C200S只剩下这一个中断脚了,所以我这相当于用N76E003做了一个中断控制器。emmmm....(N76E003AQ20:"你是想累死谁!!")
EMMC_EN
这个脚用来控制EMMC的使能,因为F1C200S复位后,如果识别到sdio里又固件,就直接运行了,我们的操作就是让F1C200S访问不到SDIO设备。这样F1C200S就能复位进入到fel模式了。
CTP_RST WIFI_INT
CTP_RST这个就是电容屏的复位脚了,其实不接也行,但有人说,有时候万一它不好用了,复位一下就好了。
WIFI_INT是ESP8266在下载固件时候需要用到的,其实不接也行的,软件驱动方面改一改,我就没有接,也没有改,就能跑起来,啊哈哈。
LCD_PWM
背光调节
CH_USB
看过上面功能图的应该知道,这个脚是用来控制USB的交叉开关的,
1.可以将GL852给F1C200S用,PC还能继续使用串口去看F1C200S的串口终端。
2.可以将GL825给PC用,这样所有USB设备都由PC控制,F1C200S是slave模式。当然,模式的切换我是考虑用一个隐形的IO,毕竟1片N76E003可以模拟很多个PCF8574
SOC_RESET
F1C200S的复位脚,在烧写时候,复位也无所谓,不用管SOC,之后MCU就控制F1C200S复位就好了(N76E003:"mmp,还让我当复位芯片")
RY1303_EN
这次更改,我的电源直接从BAT上取,控制1.2 2.5 3.3的电压输出和关闭,(MCU是独立供电,不受影响)
迪卡告诉你如何将24个IO塞到只有18个IO的N76E003上面
我们现在的需求是这个样子的
我们先把固定不能动的画上
单片机的RST复位脚只有在烧录bootloader时候才用的上,所以把F1C200S的复位脚和单片机的RST连到一起,
当烧录完N76E003后,单片机的RST脚只做IO就可以了。这样只负责控制主控是否复位。用于上位机控制复位F1C200S进入fel状态。
将检测电池电压的ADC先定下来, 毕竟支持ADC的脚不多,还有背光的PWM也先定下来,电容屏中断也找一个带中断的脚接上。
还有RY1303电源控制脚也得固定,不能复用,要不来回开关电源,可就真成了“开关电源了”
初始化LCD用的SPI接口的CS脚,去和ICP烧写单片机的DAT脚复用,
尽量保证复用的脚是屏幕部分的,因为烧写bootloader时候,可以不接屏幕
因为实在不够用了,CS脚在对屏幕失效的时候,SPI的MOSI和CLK是可以复用干别的事,当作输出用。
先把对SOC的中断和SPI的MOSI复用吧。
分配到现在还剩余2个IO
先看一下大概的功能,只看网络标号可能看不出来干啥用的。
最后分完了。
emmc读写速度测试
写入速度测试
root@dika-pc:~# dd if=/dev/zero bs=1k count=10000 of=./savefile
10000+0 records in
10000+0 records out
10240000 bytes (10 MB, 9.8 MiB) copied, 1.02184 s, 10.0 MB/s
root@dika-pc:~# dd if=/dev/zero bs=2k count=5000 of=./savefile
5000+0 records in
5000+0 records out
10240000 bytes (10 MB, 9.8 MiB) copied, 0.727644 s, 14.1 MB/s
root@dika-pc:~# dd if=/dev/zero bs=4k count=2500 of=./savefile
2500+0 records in
2500+0 records out
10240000 bytes (10 MB, 9.8 MiB) copied, 0.570808 s, 17.9 MB/s
root@dika-pc:~# dd if=/dev/zero bs=8k count=1250 of=./savefile
1250+0 records in
1250+0 records out
10240000 bytes (10 MB, 9.8 MiB) copied, 0.580831 s, 17.6 MB/s
root@dika-pc:~# dd if=/dev/zero bs=32k count=1250 of=./savefile
1250+0 records in
1250+0 records out
40960000 bytes (41 MB, 39 MiB) copied, 2.38199 s, 17.2 MB/s
root@dika-pc:~#
读取速度测试
root@dika-pc:~# dd if=./40MB.file of=/dev/null bs=1k
32000+0 records in
32000+0 records out
32768000 bytes (33 MB, 31 MiB) copied, 1.46465 s, 22.4 MB/s
root@dika-pc:~# dd if=./40MB.file of=/dev/null bs=4k
8000+0 records in
8000+0 records out
32768000 bytes (33 MB, 31 MiB) copied, 1.2441 s, 26.3 MB/s
root@dika-pc:~# dd if=./40MB.file of=/dev/null bs=8k
4000+0 records in
4000+0 records out
32768000 bytes (33 MB, 31 MiB) copied, 1.17389 s, 27.9 MB/s
root@dika-pc:~# dd if=./40MB.file of=/dev/null bs=16k
2000+0 records in
2000+0 records out
32768000 bytes (33 MB, 31 MiB) copied, 1.13172 s, 29.0 MB/s
root@dika-pc:~# dd if=./40MB.file of=/dev/null bs=32k
1000+0 records in
1000+0 records out
32768000 bytes (33 MB, 31 MiB) copied, 1.12216 s, 29.2 MB/s
root@dika-pc:~# dd if=./40MB.file of=/dev/null bs=64k
500+0 records in
500+0 records out
32768000 bytes (33 MB, 31 MiB) copied, 1.1215 s, 29.2 MB/s
root@dika-pc:~#
我有6个USB摄像头,接到PC机上,我使用opencv和qt,能全部同时打开,并imshow
显示出图像,并保持30fps的帧率,
我每个USB摄像头使用了1个线程去读取摄像头数据,然后显示出来。
我想将采集的图片一张一张无损的保存在本地png格式,但是当我在读取的线程中imwrite保存的时候,就会降低帧率(摄像头保持30FPS,PC的读取帧率降低)
我改变了思路,我创建了6个队列,每一个线程去获取图片,然后扔到对应的队列里面,然后创建6个线程去读取队列并保存。
我发现帧率还是降低的,并不能保证满帧率,
因为PC机是4核8线程,即使加了很多线程,都是在轮询执行,保存图片的线程占用了读取图片线程的时间。
有没有大佬有好的解决办法呢,我想30fps不丢帧的保存下来摄像头拍摄的图片,并且图片需要无损的方式。
全网搜,无资料,arecord录音报错,
https://whycan.cn/t_2041.html
这个帖子里的大佬们,你们是怎么能录音的??
我是5.2内核
root@dika-pc:~# ./tinymix contents
Number of controls: 97
ctl type num name value
0 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
1 BOOL 1 PCM Notify On
2 BOOL 1 PCM Slave Active Off
3 INT 1 PCM Slave Format 2 (range 0->52)
4 INT 1 PCM Slave Rate 48000 (range 0->192000)
5 INT 1 PCM Slave Channels 2 (range 1->1024)
6 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
7 BOOL 1 PCM Notify On
8 BOOL 1 PCM Slave Active Off
9 INT 1 PCM Slave Format 2 (range 0->52)
10 INT 1 PCM Slave Rate 48000 (range 0->192000)
11 INT 1 PCM Slave Channels 2 (range 1->1024)
12 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
13 BOOL 1 PCM Notify On
14 BOOL 1 PCM Slave Active Off
15 INT 1 PCM Slave Format 2 (range 0->52)
16 INT 1 PCM Slave Rate 48000 (range 0->192000)
17 INT 1 PCM Slave Channels 2 (range 1->1024)
18 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
19 BOOL 1 PCM Notify On
20 BOOL 1 PCM Slave Active Off
21 INT 1 PCM Slave Format 2 (range 0->52)
22 INT 1 PCM Slave Rate 48000 (range 0->192000)
23 INT 1 PCM Slave Channels 2 (range 1->1024)
24 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
25 BOOL 1 PCM Notify On
26 BOOL 1 PCM Slave Active Off
27 INT 1 PCM Slave Format 2 (range 0->52)
28 INT 1 PCM Slave Rate 48000 (range 0->192000)
29 INT 1 PCM Slave Channels 2 (range 1->1024)
30 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
31 BOOL 1 PCM Notify On
32 BOOL 1 PCM Slave Active Off
33 INT 1 PCM Slave Format 2 (range 0->52)
34 INT 1 PCM Slave Rate 48000 (range 0->192000)
35 INT 1 PCM Slave Channels 2 (range 1->1024)
36 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
37 BOOL 1 PCM Notify On
38 BOOL 1 PCM Slave Active Off
39 INT 1 PCM Slave Format 2 (range 0->52)
40 INT 1 PCM Slave Rate 48000 (range 0->192000)
41 INT 1 PCM Slave Channels 2 (range 1->1024)
42 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
43 BOOL 1 PCM Notify On
44 BOOL 1 PCM Slave Active Off
45 INT 1 PCM Slave Format 2 (range 0->52)
46 INT 1 PCM Slave Rate 48000 (range 0->192000)
47 INT 1 PCM Slave Channels 2 (range 1->1024)
48 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
49 BOOL 1 PCM Notify On
50 BOOL 1 PCM Slave Active Off
51 INT 1 PCM Slave Format 2 (range 0->52)
52 INT 1 PCM Slave Rate 48000 (range 0->192000)
53 INT 1 PCM Slave Channels 2 (range 1->1024)
54 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
55 BOOL 1 PCM Notify On
56 BOOL 1 PCM Slave Active Off
57 INT 1 PCM Slave Format 2 (range 0->52)
58 INT 1 PCM Slave Rate 48000 (range 0->192000)
59 INT 1 PCM Slave Channels 2 (range 1->1024)
60 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
61 BOOL 1 PCM Notify On
62 BOOL 1 PCM Slave Active Off
63 INT 1 PCM Slave Format 2 (range 0->52)
64 INT 1 PCM Slave Rate 48000 (range 0->192000)
65 INT 1 PCM Slave Channels 2 (range 1->1024)
66 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
67 BOOL 1 PCM Notify On
68 BOOL 1 PCM Slave Active Off
69 INT 1 PCM Slave Format 2 (range 0->52)
70 INT 1 PCM Slave Rate 48000 (range 0->192000)
71 INT 1 PCM Slave Channels 2 (range 1->1024)
72 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
73 BOOL 1 PCM Notify On
74 BOOL 1 PCM Slave Active Off
75 INT 1 PCM Slave Format 2 (range 0->52)
76 INT 1 PCM Slave Rate 48000 (range 0->192000)
77 INT 1 PCM Slave Channels 2 (range 1->1024)
78 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
79 BOOL 1 PCM Notify On
80 BOOL 1 PCM Slave Active Off
81 INT 1 PCM Slave Format 2 (range 0->52)
82 INT 1 PCM Slave Rate 48000 (range 0->192000)
83 INT 1 PCM Slave Channels 2 (range 1->1024)
84 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
85 BOOL 1 PCM Notify On
86 BOOL 1 PCM Slave Active Off
87 INT 1 PCM Slave Format 2 (range 0->52)
88 INT 1 PCM Slave Rate 48000 (range 0->192000)
89 INT 1 PCM Slave Channels 2 (range 1->1024)
90 INT 1 PCM Rate Shift 100000 100000 (range 80000->120000)
91 BOOL 1 PCM Notify On
92 BOOL 1 PCM Slave Active Off
93 INT 1 PCM Slave Format 2 (range 0->52)
94 INT 1 PCM Slave Rate 48000 (range 0->192000)
95 INT 1 PCM Slave Channels 2 (range 1->1024)
96 INT 2 PCM Playback Volume 255, 255 (range 0->255)
root@dika-pc:~#
root@dika-pc:~# ./tinymix controls
Number of controls: 97
ctl type num name
0 INT 1 PCM Rate Shift 100000
1 BOOL 1 PCM Notify
2 BOOL 1 PCM Slave Active
3 INT 1 PCM Slave Format
4 INT 1 PCM Slave Rate
5 INT 1 PCM Slave Channels
6 INT 1 PCM Rate Shift 100000
7 BOOL 1 PCM Notify
8 BOOL 1 PCM Slave Active
9 INT 1 PCM Slave Format
10 INT 1 PCM Slave Rate
11 INT 1 PCM Slave Channels
12 INT 1 PCM Rate Shift 100000
13 BOOL 1 PCM Notify
14 BOOL 1 PCM Slave Active
15 INT 1 PCM Slave Format
16 INT 1 PCM Slave Rate
17 INT 1 PCM Slave Channels
18 INT 1 PCM Rate Shift 100000
19 BOOL 1 PCM Notify
20 BOOL 1 PCM Slave Active
21 INT 1 PCM Slave Format
22 INT 1 PCM Slave Rate
23 INT 1 PCM Slave Channels
24 INT 1 PCM Rate Shift 100000
25 BOOL 1 PCM Notify
26 BOOL 1 PCM Slave Active
27 INT 1 PCM Slave Format
28 INT 1 PCM Slave Rate
29 INT 1 PCM Slave Channels
30 INT 1 PCM Rate Shift 100000
31 BOOL 1 PCM Notify
32 BOOL 1 PCM Slave Active
33 INT 1 PCM Slave Format
34 INT 1 PCM Slave Rate
35 INT 1 PCM Slave Channels
36 INT 1 PCM Rate Shift 100000
37 BOOL 1 PCM Notify
38 BOOL 1 PCM Slave Active
39 INT 1 PCM Slave Format
40 INT 1 PCM Slave Rate
41 INT 1 PCM Slave Channels
42 INT 1 PCM Rate Shift 100000
43 BOOL 1 PCM Notify
44 BOOL 1 PCM Slave Active
45 INT 1 PCM Slave Format
46 INT 1 PCM Slave Rate
47 INT 1 PCM Slave Channels
48 INT 1 PCM Rate Shift 100000
49 BOOL 1 PCM Notify
50 BOOL 1 PCM Slave Active
51 INT 1 PCM Slave Format
52 INT 1 PCM Slave Rate
53 INT 1 PCM Slave Channels
54 INT 1 PCM Rate Shift 100000
55 BOOL 1 PCM Notify
56 BOOL 1 PCM Slave Active
57 INT 1 PCM Slave Format
58 INT 1 PCM Slave Rate
59 INT 1 PCM Slave Channels
60 INT 1 PCM Rate Shift 100000
61 BOOL 1 PCM Notify
62 BOOL 1 PCM Slave Active
63 INT 1 PCM Slave Format
64 INT 1 PCM Slave Rate
65 INT 1 PCM Slave Channels
66 INT 1 PCM Rate Shift 100000
67 BOOL 1 PCM Notify
68 BOOL 1 PCM Slave Active
69 INT 1 PCM Slave Format
70 INT 1 PCM Slave Rate
71 INT 1 PCM Slave Channels
72 INT 1 PCM Rate Shift 100000
73 BOOL 1 PCM Notify
74 BOOL 1 PCM Slave Active
75 INT 1 PCM Slave Format
76 INT 1 PCM Slave Rate
77 INT 1 PCM Slave Channels
78 INT 1 PCM Rate Shift 100000
79 BOOL 1 PCM Notify
80 BOOL 1 PCM Slave Active
81 INT 1 PCM Slave Format
82 INT 1 PCM Slave Rate
83 INT 1 PCM Slave Channels
84 INT 1 PCM Rate Shift 100000
85 BOOL 1 PCM Notify
86 BOOL 1 PCM Slave Active
87 INT 1 PCM Slave Format
88 INT 1 PCM Slave Rate
89 INT 1 PCM Slave Channels
90 INT 1 PCM Rate Shift 100000
91 BOOL 1 PCM Notify
92 BOOL 1 PCM Slave Active
93 INT 1 PCM Slave Format
94 INT 1 PCM Slave Rate
95 INT 1 PCM Slave Channels
96 INT 2 PCM Playback Volume
按照https://whycan.cn/t_2041.html第13楼的补丁,将对应的文件进行替换和更改,包括设备树,都直接复制的
并在内核配置中,开启了以下部分。
设备树如下
.dtsi文件
dma: dma-controller@1c02000 {
compatible = "allwinner,suniv-dma";
reg = <0x01c02000 0x1000>;
interrupts = <18>;
clocks = <&ccu CLK_BUS_DMA>;
resets = <&ccu RST_BUS_DMA>;
#dma-cells = <2>;
};
codec: codec@1c23c00 {
compatible = "allwinner,suniv-codec";
reg = <0x01c23c00 0x400>;
interrupts = <21>;
clocks = <&ccu CLK_BUS_CODEC>,
<&ccu CLK_CODEC>;
clock-names = "apb", "codec";
resets = <&ccu RST_BUS_CODEC>;
dmas = <&dma 0 12>, <&dma 0 12>;
dma-names = "rx", "tx";
status = "disabled";
};
.dst文件
&codec {
allwinner,audio-routing =
"Headphone", "HP",
"Headphone", "HPCOM",
"MIC", "Mic";
status = "okay";
};