(2)函数说明:把参数buffer所指的内存写入count个字节到参数file所指的文件内。当然,文件读写位置也会随之移动;
(3)返回值:若正确会返回实际写入的字节数;当有错误发生时则返回-1,错误代码存入errno中。
3)open()函数:打开音频设备。
(1)函数定义:int(*open)( struct inode *inode, struct file *file);
(2)函数说明:参数inode为设备特殊文件的incode(索引结点)结构的指针,参数file是指向这一设备的文件结构的指针。open()的主要任务是确定硬件是否处在就绪状态,验证次设备号的合法性,控制使用设备的进程数;
(3)返回值:如果打开文件成功,open会返回一个文件描述符,以后对文件的所有操作就可以对这个文件描述符进行操作。比如程序中open()函数的返回值赋给了应用程序中的devfd,后面则可以对其进行操作;若打开失败返回负数。
4)ioctl()函数:用于设置编码比特、采样频率和选择声道。
(1)函数定义:int ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg);
(2)函数说明:设备驱动程序中对设备的I/O通道进行管理的特殊控制函数,可以通过它向设备传递控制信息或从设备取得状态信息,实现用户程序命令和驱动命令的相互联系;
(3)返回值:执行成功返回正数,失败返回-1。
5)s3c2410_uda1341_init()函数:动态加载驱动模块时的初始化函数。 (1)函数定义:int __init s3c2410_uda1341_init(void);
(2)函数说明:该函数首先会初始化I/O和UDA1341 芯片,然后申请2个DMA 通道用于音频传输。将输出音频缓冲区的DMA通道设为通道2,输入音频缓冲区的DMA 通道设为通道1。最后调用register_sound_dsp()和register_sound_mixer() 两个函数来分别注册驱动设备;
(3)返回值:初始化成功,返回0;DMA 通道初始化设置失败,返回负数。 6)void __exit s3c2410_uda1341_exit()函数:动态卸载驱动模块时调用的函数。 (1)函数定义:void __exit s3c2410_uda1341_exit(void);
(2)函数说明:注销音频设备,分两次调用audio_clear_dma()函数来分别释放已申请的音频输入和音频输出的DMA 通道;
(3)返回值:无。
19
第六章 根文件系统建立与文件系统下载
6.1 根文件系统分析
6.1.1 cramfs 目录结构
一个完整的根文件系统通常包含以下几个目录: /bin 应用程序存放目录。
/sbin 系统管理员服务程序,其中最重要的就是供内核初始化之后执行的/sbin/init 进程。
/lib 存放程序运行所需要的动态库。 /proc 系统状态文件目录。 /dev 驱动程序存放目录。
/etc 系统配置文件及用户数据存放目录。
/mnt 用于设备安装的目录,通常包含etc 子目录和为块设备安装保留目录。 /usr 用于存放用户程序和配置文件的目录,可以根据需要进行设置。
一般情况下都要把已经规划好的目录结构转换成一个映象文件,即使用命令工具mkcramfs(cygwin下为mkcramfs.exe),把相应的cramfs 目录树压缩为单一的映象文件。其命令格式为:
mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile
使用mkcramfs.exe 在cygwin 下编译生成文件系统映象文件root.cramfs,再固化到开发系统FLASH 上运行。 6.1.2 构建cramfs 文件系统
按照本节实验原理中自行构建一个cramfs 文件系统。运行cygwin,执行以下命令解压安装:
$> source /tmp/edukit-2410/set_env_linux.sh //Linux 编译环境变量设置 $> cd $WORKDIR/
$> tar -xvjf /tmp/edukit-2410/root.cramfs.tar.bz2 $> ls
? root ? root 文件夹中就是我们想要的cramfs 文件系统
6.2 文件系统映像文件生成
6.2.1 编译一个应用测试程序test.c
按设计原理要求编写一个应用程序test.c,存放在/home/app/audio目录下,进入该目录后执行以下命令编译链接测试程序:
$> cd /home/app/audio
$> arm-linux-gcc -o test test.c (也可以编写Makefile 来编译)
20
图6.1 应用程序生产映像文件
test源程序
#include
#include
#include \自定义的函数库 int main() //主函数 {
char *buf; int i; int dwSize;
if(!OpenSnd())//调用了OpenSnd()函数,打开声音设备 {
printf(\若打开失败,退出 exit(-1); }
SetFormat(FMT16BITS, FMT8K); //调用SetFormat()函数,设置格式 SetChannel(MONO); //调用SetChannel()函数,选择声道 buf = (char *)malloc(640);//定义缓冲buf,长度为640个字节 if(buf == NULL)//如果缓冲为空,退出 exit(-1);
for(i = 0; i <5000; i++)//程序调用的次数 {
dwSize = Record(buf, 640); //调用Record()函数,将录制的长度赋给dwSize dwSize = Play(buf, dwSize); //调用Play()函数,进行播放 }
exit (1); }
sndtoolsc源程序及说明:
21
#include
#include
#include
* Open Sound device
* Return 1 if success, else return 0. */
int OpenSnd(/* add by new version */int nWhich) {
devfd = open(\//调用open()函数打开文件,返回文件描述符并赋给devfd
if(devfd > 0) //打开声音设备成功,调用close()关闭文件,并返回1 close(devfd);
if(devfd < 0) //打开声音设备失败,返回0 return 0;
return 1; } /*
* Close Sound device
* return 1 if success, else return 0. */
int CloseSnd(/* add by new version */int nWhich) {
close(devfd); devfd = 0; return 1; } /*
* Set Record an Playback format * return 1 if success, else return 0. * bits -- FMT8BITS(8bits), FMT16BITS(16bits)
22
//关闭文件,并返回1

