qtopia监测磁盘(sd卡等)mount umount

本文介绍了一个在QPE环境中监测/etc/mtab文件变动的实现方式。通过定时检查该文件的变化,当检测到外部存储设备如SD卡被挂载时,系统能够及时响应这些变化,并通知应用程序进行相应的更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:帅得不敢出门    c++哈哈堂31843264

不多说,看源码.

首先qpe 中会进行/etc/mtab的检测.

void SysFileMonitor::timerEvent(QTimerEvent*)  // 这里只列出部分检测代码

{

    // st_size is no use, it's 0 for /proc/mounts too. Read it all.
    static int mtabSize = 0;
    QFile f( "/etc/mtab" );
    if ( f.open(IO_ReadOnly) ) {
QString s;
while( !f.atEnd() ) {
   QString tmp;
   f.readLine( tmp, 1024 );
   s += tmp;
}
if ( (int)s.length() != mtabSize ) {     // 对文件大小进行对比, 不相等说明/etc/mtab有变动, 然后通知其他程序.
   mtabSize = (int)s.length();
#ifndef QT_NO_COP
   QCopEnvelope("QPE/Card", "mtabChanged()" );
#endif
}

}

qtopia 中有个StorageInfo类(其他子程序可以通过它来接收/etc/mtab有变动的通知), 

StorageInfo::StorageInfo( QObject *parent )

    : QObject( parent )
{
#ifndef QT_NO_COP
    channel = new QCopChannel( "QPE/Card", this );
    connect( channel, SIGNAL(received(const QCString&,const QByteArray&)),
         this, SLOT(cardMessage(const QCString&,const QByteArray&)) );
#endif
    update();
}

void StorageInfo::cardMessage( const QCString& msg, const QByteArray& )
{
    if ( msg == "mtabChanged()" )
    update();
}

比如插入sd卡,并 mount到/sdcard后.

/etc/mtab下会添加类似
/dev/mmcblk0p1 /sdcard vfat rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0
的文本
update()中,会分析这个/etc/mtab
如果该目录是已存在 则emit disksChanged();信号.  告诉程序,磁盘发生改变.

程序会由这个信号进行数据更新, 示例代码如下: 

StorageInfo *storage_info = new StorageInfo(this);

connect( storage_info, SIGNAL( disksChanged() ), this, SLOT( reload() ) );

 Qtopia

▶️ Qtopia是什么?

Qtopia是Trolltech公司(现Qt公司)专为嵌入式Linux设备开发的完整应用框架和用户环境套件。主要应用于2000年代早期的PDA、智能手机和工业控制设备。

▶️核心架构组成

Qtopia

Qtopia Core

Qtopia Phone Edition

应用程序套件

开发工具包

Qt Embedded

Framebuffer驱动

主屏幕Launcher

任务栏

虚拟键盘

日历/联系人

媒体播放器

浏览器

交叉编译工具链

QVFb模拟器

▶️技术特性深度解析

1️⃣ 图形渲染优化

  • DirectFB后端支持:绕过X Server直接操作framebuffer
  • ARM架构优化:针对ARMv5/v6指令集特别优化
  • Partial Screen Update:仅更新脏区域降低CPU负载

2️⃣ 输入法框架

  • T9键盘预测算法
  • Handwriting识别引擎(支持Graffiti输入)
  • SIP协议集成

3️⃣ 电源管理

  • Dynamic Voltage Scaling接口
  • Suspend-to-RAM实现
  • Battery状态监控API
▶️典型设备参数要求
组件最低配置推荐配置
CPUARM9@200MHzXScale@400MHz
RAM16MB64MB+
存储8MB Flash32MB Flash+
屏幕240x320@16bit480x640@18bit
▶️开发环境搭建示例
#交叉编译工具链配置
export PATH=/opt/arm-linux/bin:$PATH

#配置编译参数
./configure \
--prefix=/opt/qtopia \
--xplatform=linux-arm-g++ \
--disable-keypad \
--enable-touchscreen

#编译安装
make && make install

#部署到NFS根文件系统
cp -r /opt/qtopia /nfsroot/usr/local/

▶️设备驱动集成要点

1️⃣ Framebuffer驱动要求:

  • ioctl必须支持FBIOGET_VSCREENINFO
  • mmap映射必须正确工作

2️⃣触摸屏校准算法:

void calibrateTS()
{
    //五点校准法实现
    for(int i=0; i<5; i++){
        get_sample(&cal[i]);
        apply_matrix_transform();
    }
}

▶️演进路线与替代方案

1️⃣ Qtopia → Qt Extended → Qt for Embedded Linux → Qt5/Wayland

2️⃣现代替代方案对比:

特性Qtopia4Qt5 Embedded
渲染后端FramebufferEGLFS/Wayland
输入系统TSLIBlibinput
多媒体GStreamer0.10GStreamer1.0
开发语言C++98C++11/14
硬件加速OpenGL ES2.0+
▶️遗留系统维护建议

对于仍需维护Qtopia系统的项目:

1️⃣安全补丁方案:

//修补内存泄漏示例
-qWarning("Error occurred");
+Q_ASSERT_X(!ptr, "func", "nullptr check");

2️⃣现代化改造路径:

  • Phase1:用Qt4 Embedded替换核心库
  • Phase2:移植到Qt5的LinuxFB插件
  • Phase3:逐步替换为Wayland合成器

3️⃣调试技巧:

#启用Qtopia调试输出
export QTOPIA_DEBUG=1
export QT_DEBUG_PLUGINS=1

#查看底层事件
cat /dev/input/event0 | hexdump -C

▶️历史价值分析

Qtopia在嵌入式发展史上的关键贡献:
1️⃣证明了Linux在消费电子设备的可行性
2️⃣开创了Qt在移动领域的应用先河
3️⃣其架构思想影响了Android HAL层设计

当前仍可在以下场景见到其影响:
-工业控制人机界面(HMI)
-医疗设备固件UI层
-航空电子显示系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅得不敢出门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值