【ASOC全解析(五)】编译测试与验证

【ASOC全解析(五)】编译测试与验证

  • 主要内容
  • 源码来源
  • 如何编译
  • 如何进行测试

/*****************************************************************************************************************/

声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创,转载or引用请注明出处,谢谢!

创作不易,如果文章对你有帮助,麻烦点赞 收藏支持~感谢

/*****************************************************************************************************************/

主要内容

在之前叙述ASOC的文章中,我们已经在实践环节给出了一部分的代码,如今我们对这些代码进行功能性的测试。主要涉及到编译和测试问题。本章主要以安卓系统为例进行编译与测试,其中Linux Kernel的版本号为5.10。对于衍生Linux系统(例如Ubuntu 、CentOS等),百度上有很多参考的文章去编译文件和测试,安卓是基于Linux内核的,故衍生Linux系统的编译和测试通常没有安卓系统的复杂,本文不阐述衍生Linux系统的编译与测试。

源码来源

参考前三篇文章中的源码,主要有三份:

  • 完整的codec驱动代码示例
  • 完整的machine驱动代码示例
  • 完整的platform驱动代码示例

将这三份源码分别复制到文件并命名为:

  • mycodec.c
  • mymachine.c
  • myplatform.c

如何编译

首先完整编译一次安卓系统。

接下来使用下面的makefile进行编译

# 默认使用/Android_code_dir作为代码目录
CODEDIR ?= /Android_code_dir

# 指定内核源代码目录,通常是编译输出的目录
KERNELDIR = /Android_code_dir/out_krn/target/product/mgk_64_k510/obj/KERNEL_OBJ/kernel-5.10

# 设置交叉编译工具链的前缀,这里使用的是aarch64架构的Android GCC 4.9.1版本的工具链
CROSS_COMPILE = $(CODEDIR)/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9.1/bin/aarch64-linux-android-

# 指定Clang编译器的路径
CLANG = $(CODEDIR)/prebuilts/clang/host/linux-x86/clang-r416183b/bin/clang

# 指定LLVM链接器ld.lld的路径
LLD = $(CODEDIR)/prebuilts/clang/host/linux-x86/clang-r416183b/bin/ld.lld 

# 设置链接时优化(LTO)的类型为thin
FLTO = thin

# 为myplatform.o目标文件添加编译标志,启用栈保护,以防止栈溢出攻击
CFLAGS_myplatform.o += -fstack-protector

# 指定要构建为模块的目标文件列表
obj-m   += myplatform.o
obj-m   += mycodec.o
obj-m   += mymachine.o

# 默认目标,用于编译所有的模块
all:
    # 调用内核构建系统,传递编译器、链接器、优化选项、架构、交叉编译前缀和模块目录
    $(MAKE) -C $(KERNELDIR) CC=$(CLANG) LD=$(LLD) LTO=$(FLTO) ARCH=arm64 CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules

clean:
    $(MAKE) -C $(KERNELDIR)  M=$(PWD) clean;
    rm -f *.ko

如果编译成功将会产生三个ko文件,分别是:

  • mycodec.ko
  • mymachine.ko
  • myplatform.ko

如何进行测试

  1. 将生成的*.ko文件push到设备,可以选择vendor/lib/modules目录或者其它目录。

    例如:
    adb push mycodec.ko mymachine.ko myplatform.ko /vendor/lib/modules
    
  2. 获得root权限并且挂载ko文件,然后将目录"/sdcard/"获取权限和关闭SELinux,以防止dump文件出现问题。

 C:\Users\mywin10>adb root
 C:\Users\mywin10>adb shell
 Android_device:/ # insmod vendor/lib/modules/mycodec.ko
 Android_device:/ # insmod vendor/lib/modules/myplatform.ko
 Android_device:/ # insmod vendor/lib/modules/mymachine.ko
 Android_device:/ #
 Android_device:/ # chmod 777 /sdcard/
 Android_device:/ # setenforce 0
 Android_device:/ #
 Android_device:/ # cat /proc/asound/pcm |grep MY-
 01-00: MY-CODEC my_codec.0-0 :  : playback 1 : capture 1
 Android_device:/ #
  1. 使用tinyalsa进行播放以及回采播放的数据

    spm8673p1_64:/ # tinyplay /sdcard/48K_s16_2c.wav -D 1 -d 0 &
    spm8673p1_64:/ # tinycap /sdcard/mycap.wav -D 1 -d 0 -r 48000 -b 16 -c 2
    
  2. 将设备目录"/sdcard/“中的回采数据文件"mycap.wav"以及“playback.pcm"文件用音频工具(例如软件"Audacity”)查看。可以观察到两个文件均能正常听到声音,其中文件"mycap.wav"是开始录音时的录音文件,“playback.pcm"文件则是从播放开始到结束(或者从播放开始到手动让播放结束)的音频文件。

你可能感兴趣的:(ASOC全解析,音视频,android,驱动开发,linux,语音识别,c语言)