在S3C2410上移植bluetooth(蓝牙)(二)

发布时间:2010-10-21 阅读量:1358 来源: 发布人:

在S3C2410上移植bluetooth(蓝牙)(一)
http://www.52solution.com/article/articleinfo/id/80007475
在S3C2410上移植bluetooth(蓝牙)(二)
http://www.52solution.com/article/articleinfo/id/80007476

完成了在普通red hat上的安装,熟悉了蓝牙协议栈一些基本的东西,下面的任务就是把协议栈搬到开发板上了。
第一步当然是内核了,由于华恒的内核代码改过,我也不知道从bluez上下载的patch能不能使用,试试看了,只好。
# cd /HHARM2410/kernel
# gzip -dc ~/patch-2.4.18-mh15.gz | patch -p1
# find ./ -name '*rej'
./fs/cramfs/inode.c.rej
不 好,有文件不能patch,看看是针对cramfs文件系统的patch,我也不清楚为什么bluez的patch会修改到cramfs,不过我想问题应 该不大。内核源代码关于bluetooth的部分华恒应该没有改过,因此patch的主要部分应该是没有问题的。如果内核编译后发生问题,我想大概也只有 把内核代码翻出来看了。
先就这样了,用用试试看好了。与普通pc上的类似,只不过有些是m的现在统统为y了。我的配置关于Bluez的部分设置为:
#
# Bluetooth support
#
CONFIG_BLUEZ=y
CONFIG_BLUEZ_L2CAP=y
# CONFIG_BLUEZ_SCO is not set
CONFIG_BLUEZ_RFCOMM=y
CONFIG_BLUEZ_RFCOMM_TTY=y
CONFIG_BLUEZ_BNEP=y
CONFIG_BLUEZ_BNEP_MC_FILTER=y
CONFIG_BLUEZ_BNEP_PROTO_FILTER=y
# CONFIG_BLUEZ_HIDP is not set

#
# Bluetooth device drivers
#
CONFIG_BLUEZ_HCIUSB=y
# CONFIG_BLUEZ_HCIUSB_SCO is not set
# CONFIG_BLUEZ_HCIUART is not set
# CONFIG_BLUEZ_HCIBFUSB is not set
# CONFIG_BLUEZ_HCIDTL1 is not set
# CONFIG_BLUEZ_HCIBT3C is not set
# CONFIG_BLUEZ_HCIBLUECARD is not set
# CONFIG_BLUEZ_HCIBTUART is not set
# CONFIG_BLUEZ_HCIVHCI is not set
device部分就设了个USB的,其他的就不设置了。
下面继续make dep;make zImage的常规过程,OK,没有发生编译问题,可以稍微舒口气了。

下面要移植Bluez的基础库了,在Redhat 9下执行
# ldd /usr/lib/libbluetooth.so.1.0.17
     libc.so.6 => /lib/libc.so.6 (0x4002c000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
发现没有依赖什么莫名其妙的库,应该换个编译器就可以了,configure一下就可以了。我的配置命令很简单:               
# ./configure --host=armv4l --prefix=/HHARM2410/applications/bluezport/libs CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib
LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld
# make
# make install
OK了,到了/HHARM2410/applications/bluezport/libs下看看,我也不清楚为什么,居然只有.a和.la的静态库,没有动态库。只好自己动手,到bluz-libs-2.17/src/下,自己编译动态库:
# /opt/host/armv4l/bin/armv4l-unknown-linux-gcc -shared -o libbluetooth.so.1.0.17 bluetooth.o hci.o sdp.o
再做两个符号连接
# ln -s libbluetooth.so.1.0.17 libbluetooth.so
# ln -s libbluetooth.so.1.0.17 libbluetooth.so.1
好了,库交叉编译完毕,mv到/HHARM2410/application/bluezport/libs/lib文件夹下就可以了。

接着移植Bluez的工具集。与库类似,先看一下各个程序需要用到什么库,比如:
#ldd /usr/sbin/hcid
    libbluetooth.so.1 => /usr/lib/libbluetooth.so.1 (0x40035000)
    libc.so.6 => /lib/libc.so.6 (0x40042000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
挨 个试试需要用的工具,发现需要的库华恒和Bluez都提供了,应该换个编译器编译一下就可以了。编译之前我为了到板子上与我自己的手机连接方便修改了 bluez-utils-2.17/hcid/security.c文件,在init_security_data函数中的设置默认的密码,非常简单地改 了两行:
       strcpy(hcid.pin_code, "123");
               hcid.pin_len = 3;
然后configure我想就行了,我的configure设置为:
# ./configure --prefix=/HHARM2410-R3/applications/bluezport/utils --includedir=/HHARM2410-R3/applications/bluezport/libs/include --libdir=/HHARM2410-R3/applications/bluezport/libs/lib --with-bluez=/HHARM2410-R3/applications/bluezport/libs --disable-test --disable-cups --disable-pcmia --host=armv4l CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld
# make
我在这步make的时候出现了一点小错误,好像是说PATH_MAX没有定义,这个是LINUX设置的存放路径名缓冲区的最大长度。应该是少包含了一个头文件造成的。我没有去仔细考究,就在当前文件下的config.h中添加了三行:
  #ifndef PATH_MAX
  #define PATH_MAX 4095/* PAGE_SIZE - 1 */
  #endif
采用简单粗鲁的添加定义的方式。再make,通过。
# make install
好了,工具集都在/HHARM2410-R3/applications/bluezport/util下了。

最后,由于在PC的LINUX下的默认pin_helper /usr/bin/bluepin是用python写的代码,在2410上当然不能用了,所以要自己写一个pin_helper的程序。翻翻 /usr/bin/bluepin的代码以及hcid/security.c的代码,事实上hcid进程在验证PIN code的时候开了一个pipe指向pin_helper进程的标准输出,pin_helper进程向用户询问PIN code,如果用户输入密码XXXX就以"PIN:XXXX"的形式写到标准输出中去,如果用户reject就写个"ERR"回去。
我以一种最简单的方式实现pin_helper程序,即固定地写一个code回去,比如123,牺牲安全性。
用脚本实现就是:
#!/bin/sh

echo "PIN:123"
用C实现一个就是:
#include

int main(int argc, char* argv[])
{
   printf("PIN:123");
}
交叉编译成my_pin_helper再放到板子的/usr/bin下,那么就可以把板子的hcid.conf修改成:
pin_helper /usr/pin/my_pin_helper
后来,我在板子上也用MiniGUI写了一个pin_helper,也挺简单的。

好了,一切准备完毕,做好ramdisk,记得在/dev下mknod几个rfcomm,放到板子上,可以运行!
插上USB适配器,连模块都不用probe
# hciconfig hci0 up
# hcid -f /etc/bluetooth/hcid.conf
# hciconfig -a
看到设备了,其他的运行都OK。结合ppp就可以用手机上网了~~

相关资讯
高可靠+低功耗:虹扬SOT23封装ESD二极管领跑车规级防护市场

随着汽车电子化、智能化加速,车载系统对ESD(静电放电)防护的要求日益严苛。虹扬电子推出的车规级ESD保护二极管AH05C325V0L,采用SOT23封装,符合AEC-Q101标准,专为CAN总线、车身控制单元(BCU)及电子控制单元(ECU)等场景设计。其核心特性包括80W浪涌吸收能力、5V反向工作电压、单向电流设计,以及低漏电流和高抗静电能力(±30kV接触放电),为敏感电子元件提供高效防护。

消费电子补贴效应凸显,中小尺寸驱动IC需求三连增

全球显示面板核心元器件市场呈现企稳态势。根据TrendForce最新研究报告显示,2023年第一季度面板驱动IC产品均价环比下降幅度收窄至1%-3%区间,第二季度虽仍存在价格下行压力,但降幅预计将控制在2个百分点以内。这标志着自2020年疫情引发的剧烈市场波动后,驱动IC价格曲线首次出现明显筑底信号。

成本直降40%!易飞扬硅光模块如何重构DCI市场格局?

在全球5G网络部署与边缘计算需求井喷的背景下,易飞扬创新推出基于O波段的100G QSFP28 DWDM光模块,直击城域网络升级痛点。该产品通过零色散传输架构与硅光集成技术,突破传统C波段方案在中短距场景下的性能瓶颈,以低于3.5W的功耗实现30km无补偿传输,同时兼容开放光网络架构。据行业测算,其部署成本较同类方案降低40%,为5G前传、分布式AI算力互联及绿色数据中心建设提供了高性价比选择,或将成为运营商边缘网络改造的关键技术引擎。

充电效率94.8% vs 国际竞品:国产IC技术路线图全解析

在全球能源转型与欧盟新电池法规(EU 2023/1542)的驱动下,旭化成微电子(AKM)于2025年2月正式量产AP4413系列充电控制IC,以52nA超低功耗、94.8%充电效率及多电压适配等核心技术,重新定义小型设备供电逻辑。该产品通过电容器预充电机制破解完全放电恢复难题,并凭借动态电压调节算法兼容光能、振动等微瓦级能源输入,显著优于TI、ADI等国际竞品。面对国产替代窗口期,AP4413依托BCD工艺与专利壁垒抢占先机,有望在智能家居、工业传感等千亿级市场替代传统一次性电池方案,成为环保供电赛道的标杆级解决方案。

新能源汽车与工业4.0双重驱动:全球电子分销巨头技术布局揭秘

作为全球电子元器件分销领域的领军者,贸泽电子始终以"技术赋能创新"为核心战略,通过构建覆盖1200余家原厂的供应链网络,为工业自动化、汽车电子、智慧农业等前沿领域提供关键技术支持。2025年第一季度,公司新增物料突破8,000项,其中多项产品体现了行业技术演进的三大方向: