JPEG库的移植
解压缩
tar -zxvf jpegsrc.v9a.tar.gz
cd jpeg-9a/
对jpeg源码进行配置
./configure --host=arm-linux --prefix=/home/gec/jpeglib
make
make install
把虚拟机中的jpeglib目录拷贝到开发板文件系统中的根目录下
/jpgelib
修改开发板中的配置脚本/etc/profile
增加:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/jpeglib/lib(检查后面是否有直接定义)
保存退出后重启开发板
编译:arm-liunx-gcc show_jpeg.c -o show_jpeg -I /home/gec/include/ -L /home/gec/lib/ -ljpeg
void pos_show(int n,int x,int y,char *name)//显示JPG格式图片,n放大缩小倍数,x和y显示起始位置,name显示JPEG的路径
{
FILE *fp;
int fd;
struct fb_var_screeninfo screeninfo;//声明一个与屏幕信息相关的结构体对象
unsigned char *pLineColor;
unsigned int (*pFrameBuffer)[800];
int image_width,image_height;
struct jpeg_decompress_struct dinfo;//声明一个jpeg解压对象
struct jpeg_error_mgr err;//把jpeg的出错信息关联到进程的标准错误设备上,除非你不关心jpeg库的出错信息
dinfo.err=jpeg_std_error(&err);
jpeg_create_decompress(&dinfo);//创建一个jpeg解压对象
fp=fopen(name,"r");
if(fp==NULL)
{
perror("Cannot open jpeg_file:");
goto exit;
}
jpeg_stdio_src(&dinfo,fp);//将jpeg解压对象和jpeg文件流关联起来,意味这jpeg解压对象将从文件流中获取数据
jpeg_read_header(&dinfo,TRUE);//获取头部信息
image_height=dinfo.image_height;
image_width=dinfo.image_width;
fd=open("/dev/fb0",O_RDWR);//打开framebuffer
pFrameBuffer=(unsigned int (*)[800])mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
dinfo.scale_num = 1;
dinfo.scale_denom = n;
jpeg_start_decompress(&dinfo);//开始解压
pLineColor=(unsigned char*)malloc(image_width*dinfo.num_components);//申请一个保存jpeg一行颜色数据的缓冲区
while(dinfo.output_scanline<dinfo.output_height &&
dinfo.output_scanline<480) //按行读取jpeg图片的数据并处理
{
int col;
unsigned char *pTmpColor=pLineColor;
unsigned char red,green,blue;
jpeg_read_scanlines(&dinfo,&pLineColor,1); //读取一行
for(col=0;col<dinfo.output_width&&col<800;col++)//处理一行
{
red=*pTmpColor;
green=*(pTmpColor+1);
blue=*(pTmpColor+2);
pTmpColor+=3;
pFrameBuffer[dinfo.output_scanline-1+y][col+x]=(red<<16)|(green<<8)|blue;
}
}
jpeg_finish_decompress(&dinfo);
munmap(pFrameBuffer,800*480*4);
free(pLineColor);
fclose(fp);
close(fd);
exit:
jpeg_destroy_decompress(&dinfo);
}
SQLITE3库移植
解压缩
tar -zxvf sqlite-autoconf-3250200.tar.gz
cd sqlite-autoconf-3250200/
对SQLITE3库进行配置
./configure --prefix=/home/gec/armsqlite --host=arm-linux
make
make install
使用sqlite3的命令行
(1)创建数据文件(要求.db结尾)
sqlite3 数据库文件的名字
例如: sqlite3 xxxx.db
.tables //查看当前数据库文件中有多少个表格
.quit //退出sqlite3
.help //查看命令
.dump //查看历史输入命令
(2)创建表格
create table 表的名字 (字段1 修饰符号,字段2 修饰符号,........);
例如:create table stutable (name text,age int,score float);
创建好的表格自动存储在了.db数据文件中
(3)往表格中插入数据
insert into 表的名字 values(字段信息一一对应);
例如:insert into stutable values("wangwu",19,78); //重点values很容易漏掉
(4)删除表格中的数据
delete from 表名字 where 条件;
例如:delete from stutable where name="lisi"; //判断字符串相等,直接用=
(5)删除整个表格
drop table 表的名字
例如:drop table stutable;
(6)查询表格中的数据内容(重点)
select * from 表的名字; //查询所有的信息
例如:select * from stutable;
select name from 表的名字; //查询name这个具体字段
例如:select name from stutable;
select * from 表的名字 where 条件; //按照where语句后面的条件去查询
例如:select * from stutable where score<60;
select * from stutable where score>=60 and score<=80;
(7)修改表格中的数据
update 表名字 set 新的字段信息 where 旧的字段信息;
例如:update stutable set score=88 where score=60.5;
(8)常用的修饰语句
字段唯一性(比如:电话,身份证号码这些是不可能有重复的)
unique关键词修饰:
例如: create table stutable (name text,age int,phonenum char[11] unique);
null:表示空值
insert into stutable values("zhao",null,null);
空值如何修改删除
delete from sptable where price is null; //不要写成price=null
not null:限制字段不允许接收空值
like:模糊匹配字符串
select * from stutable where name like "%jian%"; //名字中有jian
select * from stutable where name like "zhang%";
select * from stutable where name like "%guo";
order by:升序/降序查询
select * from stutable order by age asc; //按照年龄升序
select * from stutable order by age desc; //按照年龄降序
if not exists:新建表格的是判断是否存在
create table if not exists stutable(name text,age int,phonenum char[11] unique);
注意的问题:
第一个:sqlite3并不帮助你检查数据类型
insert into stutable values(852,"kkk","hfdhsfjk");
第二个:字段个数必须一致
insert into stutable values("zhao",15,125879,78.9);
Error: table stutable has 3 columns but 4 values were supplied
第三个:区分.开头的命令和增删改查命令
.开头的命令后面没有分号
.开头的命令只能小写,但是增删改查命令大小写都行
第四个:同一个数据库文件中不允许出现同名的表格,哪怕表格中的字段不一样,也不行!!!!
第五个:命令输入错误,如何退出,直接输入分号,回车就可以了
代码实现数据库操作--->使用sqlite3源码中提供的接口函数(很重要)
(1)打开/新建数据库文件 //头文件sqlite3.h的第3338行
int sqlite3_open(const char *filename,sqlite3 **ppDb);
返回值:成功 返回SQLITE_OK 失败 参见头文件中的宏定义 //有点类似于errno
参数:filename -->你要打开的那个数据库文件的路径
ppDb -->存放数据库文件的句柄
(2)操作数据库文件,调用前面学习的命令 //重点
int sqlite3_exec(sqlite3*,char *sql,int (*callback)(void*,int,char**,char**),void *,char **errmsg);
返回值:成功 返回SQLITE_OK 失败 参见头文件中的宏定义
参数:sqlite3* -->将sqlite3_open中的句柄传递过来
sql -->你想要执行的语句
int (*callback)(void*,int,char**,char**) -->函数指针,当你使用查询命令的时候,就必须要用到该参数
参数: void* -->接收第四个参数传递过来的内容
int -->你查询的表格的列数
char** -->具体的每一行的信息
char** -->字段名
重点重点: 查询有结果,callback指向的函数就会被调用,没有结果就不调用
查询结果有几条,那么callback指向的函数就被调用几次
void * -->传递给callback的第一个参数
errmsg-->存放出错信息
(3)关闭数据库文件
int sqlite3_close(sqlite3*);
ALSA库移植
解压缩
tar -zxvf alsa-lib-1.0.22.tar.bz2
cd alsa-lib-1.0.22/
tar -zxvf alsa-utils-1.0.22.tar.bz2
cd alsa-utils-1.0.22/
交叉编译alsa-lib
./configure --prefix=/home/gec/myalsa \ (此处是alsa库的安装路径,是要按照实际情况来改的)
--host=arm-none-linux-gnueabi \
--disable-python
make
make install
交叉编译alsa-utils
./configure --prefix=/home/gec/myalsa \
--host=arm-none-linux-gnueabi \
--with-alsa-prefix=/home/gec/myalsa/lib/ \
--with-alsa-inc-prefix=/home/gec/myalsa/include/ \
--disable-alsamixer \
--disable-xmlto
make 会出现这个error:找不到alsa-utils-1.0.22/alsaconf/po下面的t-ja.gmo,只需要先创建文件t-ja.gmo,然后make,又出现找不到alsa-utils-1.0.22/alsaconf/po下面的t-ru.gmo,接着新建一个就行了
make install
ALSA库的使用
第一步:将移植得到的库文件,头文件,可执行程序打包下载到开发板中
配置动态库的环境变量或者偷懒直接将库文件拷贝到开发板的/lib
export LD_LIBRARY_PATH=/XXXX/XXXXX:$LD_LIBRARY_PATH
将bin文件中的arecord和aplay拷贝到开发板的/bin
第二步:设置alsa的配置文件路径
将移植得到的文件夹(bin include lib share)share中的alsa文件夹里面的所有文件复制到开发板的/home/gec/myalsa中
注意,注意,注意:解压之后的文件夹在开发板中路径也必须跟当初你移植的时候ubuntu上的路径一致
第三步:设置音频文件相关设备节点
执行写好的脚本 ./mknod.sh(开发板中打开这个脚本,将每一行后面的M去掉)
第四步:录音和播放
arecord -d3 -c1 -r16000 -twav -fS16_LE example.wav
说明:
-d:录音时长(duration) 秒
-c:音轨(channels)
-r:采样频率(rate) 人的耳朵 20HZ ---20000HZ
-t:封装格式(type)
-f:量化位数(format)16bit 小端
第五步:播放
执行如下命令播放
aplay example.wav
在做的过程中遇到的问题:
第一个问题: write error: No space left on device
解决方案: 第一步 mkfs.vfat /dev/mmcblk0p7 将/dev/mmcblk0p7格式化
第二步 mount -t vfat /dev/mmcblk0p7 /xxxx 将/dev/mmcblk0p7挂载到开发板/xxxx下面
第三步 以后你下载的大文件就存放到/xxxx就可以了(/xxxx就相当于是新开辟空间)